의식의 흐름대로 정리
Java는 네트워크 상에서 쓸 수 있도록 미국의 썬 마이크로 시스템즈가 개발한 객체 지향 프로그래밍 언어
Java의 특징
- 자바가상머신(JVM)만 설치하면 컴퓨터의 운영체제(OS)에 상관없이 작동하기 때문에 운영체제에 독립적이다.
- JVM(Java Virtual Machine) : 컴파일된 자바 바이트 코드를 실행시켜주는 소프트웨어 - 객체 지향 프로그래밍 언어이다. > 캡슐화, 상속, 다형성의 특징을 갖는다. > 코드의 재사용 및 유지보수에 용이하다.
- 객체 지향 프로그래밍(OOP; Object-Oriented Programming) : 데이터를 객체로 취급하여 프로그램에 반영한 것으로, 기존의 절차 지향 프로그래밍과 다르게 객체의 상호작용을 통해 프로그램이 동작한다.
- 객체 지향 프로그래밍과 절차 지향 프로그래밍 차이 : 절차 지향 프로그래밍은 순차적인 처리가 중요하며, 대표적으로는 C언어가 있다. 컴퓨터의 처리 방식과 유사하기 때문에 객체 지향 언어보다 처리 속도가 더 빠르다. 하지만 실행 순서가 정해져 있어 코드의 순서가 바뀌면 동일한 결과를 보장하기 어려워 유지보수가 어렵다. 또 디버깅이 어렵다. 객체 지향 프로그래밍은 코드의 재활용성이 높고 절차지향보다 코딩이 간편하다. 디버깅이 쉽다. 반면에 처리속도는 절차 지향 언어보다 느리며, 설계에 많은 시간이 소요된다. 절차 지향 언어는 실행 순서, 절차가 더 중점이고 객체 지향 언어는 필요한 객체들의 종류와 속성 등에 더 중점을 두고 프로그래밍 된다. 즉, 절차 지향과 객체 지향은 서로 프로그래밍 되는 방식이 다를 뿐, 반대되는 성질이 아니다.
- 캡슐화 : 관련된 데이터와 메서드를 하나의 단위로 묶어 정보를 은닉하는 것(외부 객체에서 구현 방식은 알 수 없다). 클래스 필드 값에 권한을 설정할 수 있다(public, private, protected, default). getter/setter를 통해 접근하도록 가능하다.
- public : 접근 제한 없음
- private : 같은 클래스에서만 사용 가능(접근 권한이 가장 적음)
- public > protected > default > private
- 상속 : 부모 클래스에 자식이 접근할 수 있도록 물려받는 방식
- 다형성 : 부모 타입의 참조 변수로 자식 타입의 객체를 다루는 것. 오버로딩과 오버라이딩이 있다.
- 오버로딩 : 상속이 아닌 하나의 클래스 내에서 이름이 같은 여러 개의 메서드를 정의하는 것. 매개변수의 수, 배치(순서), 타입이 달라야 한다.
- 오버라이딩 : 부모에게서 상속받은 것들을 새롭게 재정의 하는 것을 뜻함. 재정의 한 것은 자신의 클래스 내부에서만 영향을 끼치며 부모에게는 영향을 끼치지 않는다. - Garbage Collector를 통해 자동적으로 메모리를 관리한다.
- 시스템에서 더 이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것을 Garbage Collection이라고 하고, Garbage Collection을 수행하는 부분을 Garbage Collector라고 부른다.
- 자바 메모리는 Method Area, Heap, Stack, PC Register, Native Method Stack 영역으로 나눈다.
- Method Area는 JVM이 실행되면서 생기는 공간으로 모든 스레드가 공유하는 영역이다.
- 런타임 상수풀(runtime constant pool), 필드(field) 데이터, 메소드(Method) 데이터 등을 분류하고 저장한다.
- Heap 영역은 객체와 배열이 생성되는 영역이며, 힙 영역에 생성된 객체와 배열은 Stack 영역의 변수나 다른 객체의 필드에서 참조
- 참조하는 변수나 필드가 없는 의미없는 객체는 Garbage Collector가 자동으로 제거한다.
- 그래서 개발자는 객체를 제거하기 위한 별도의 코드를 작성할 필요가 없다.
- Stack 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.
- 메소드를 호출할 때마다 push 되고 메소드가 종료되면 제거(pop)된다. Last In First Out 방식이다.
- PC Register는 스레드가 생성되면서 생기는 공간으로, 스레드가 처리하고 있는 명령어의 주소를 등록한다.
- JVM이 실행하고 있는 현재 위치를 저장하는 역할
- Native Method Stack은 Java가 아닌 다른 언어(C, C++)로 구성된 메소드 실행이 필요할 때 사용되는 공간이다. - Multi thread를 지원
- thread는 한 process 내에서 실행되는 동작(기능 function)의 단위
- 각 thread는 속해 있는 process의 스택 메모리를 제외한 나머지 메모리 영역을 공유할 수 있다.
- multi thread는 하나의 process가 동시에 여러 개의 일을 수행할 수 있도록 해주는 것.
- 즉, 하나의 process에서 여러 작업을 병렬로 처리하기 위해 multi thread를 사용한다.
- process는 프로그램이 메모리에 적재되어 CPU를 할당받아 실행되는 것
- 예를 들어 유튜브를 실행하면 한 개의 프로세스가 실행되는 것.
- 2개 이상의 process가 동시에 실행되면 multi process라고 한다.
- cpu core가 1개라면 여러 프로세스를 짧은 시간 동안 번갈아 연산을 하는 동시성을 갖는다.
- cpu core가 여러 개 라면 각각의 core가 각각의 process를 연산하는 병렬성을 갖는다.
- multi process와 multi thread는 동시에 여러 작업을 수행한다는 측면에서 유사한 면이 있다.
- 적용할 시스템에 따라 두 방법의 장단점을 고려하여 적합한 방식을 선택해야 한다.
- multi thread는 multi process보다 적은 메모리공간을 차지하고 Context Switching이 빠르다.
- 컴퓨터는 다양한 업무를 처리하기 위해 task를 번갈아 가며 실행하는데, 이 때 현재 진행하고 있는 task(process, thread)를 저장하고 다음 실행할 task의 상태를 읽어 적용하는 과정을 Context Switching이라고 한다.
- multi process는 multi thread보다 많은 메모리 공간과 CPU 시간을 차지한다.
- multi thread는 동기화 문제나 하나의 thread 장애로 전체 thread가 종료될 위험이 있다.
- 동기화 문제란, 서로 다른 thread가 메모리 영역을 공유하기 때문에(자원을 공유하기 때문에) 여러 thread가 동일한 자원에 동시에 접근하여 엉뚱한 값을 읽거나 수정하는 문제이다.
- multi process는 하나의 process가 죽더라도 다른 process에 영향을 주지 않아 안정성이 높다.
- 메모리 구분이 필요할 때는 multi process가 유리하고, Context switching이 자주 일어나고 데이터 공유가 빈번한 경우, 자원을 효율적으로 사용해야 하는 경우에는 multi thread가 유리하다.
한 줄 정리
Java는 객체지향 프로그래밍 언어로써 캡슐화, 다형성, 상속의 특징을 갖습니다. 또 JVM(자바 가상 머신) 위에서 실행이 되기 때문에 운영체제에 독립적입니다.
객체지향 프로그래밍(OOP; Object-Oriented Programming)은 데이터를 객체로 취급하여 프로그램에 반영한 것으로, 기존의 절차지향 프로그래밍과 다르게 객체의 상호작용을 통해 프로그램이 동작합니다.
절차지향 프로그래밍은 순차적인 처리가 중요하며 대표적으로는 C언어가 있습니다. 컴퓨터의 처리 방식과 유사하기 때문에 객체지향보다 처리 속도가 빠릅니다. 하지만 실행 순서가 정해져 있어 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵고, 따라서 유지보수가 어렵습니다.
객체지향 프로그래밍은 코드의 재활용성이 높고, 절차지향보다 코딩이 간편합니다. 반면에 처리속도는 절차지향보다 느리며, 설계에 많은 시간이 소요됩니다.
절차지향은 실행 순서, 절차가 더 중점이고 객체 지향 언어는 필요한 객체들의 종류와 속성 등에 더 중점을 두고 프로그래밍을 합니다. 즉, 절차지향과 객체지향은 서로 프로그래밍 되는 방식이 다를 뿐, 반대되는 성질은 아닙니다.
캡슐화는 변수와 함수를 하나의 클래스로 묶어 정보를 은닉화하는 것으로, 외부객체에서 구현 방식을 알 수 없습니다. 접근 권한을 설정할 수 있으며, getter/setter를 통해 접근할 수 있습니다.
접근 권한에는 권한 순으로 public, protected, default, private이 있고, 접근 제한이 없는 public과 같은 클래스 내에서만 사용 가능하여 접근 권한이 가장 적은 private가 주로 쓰입니다.
다형성은 부모 타입의 참조 변수로 자식 타입의 객체를 다루는 것을 뜻합니다. 오버로딩과 오버라이딩 등이 있습니다.
오버로딩은 하나의 클래스 내에서 같은 이름의 메소드를 여러 개 정의하는 것으로, 매개 변수의 개수나 변수 타입이 달라야 합니다.
오버라이딩은 부모 클래스에서 상속 받은 것들을 재정의하는 것입니다. 재정의된 메서드는 같은 클래스 내에서만 영향을 끼치며, 부모에게는 영향을 주지 않습니다.
상속은 부모 클래스에 자식이 접근할 수 있도록 물려받는 것입니다. 기존 클래스의 기능을 유지하면서 추가적인 기능을 추가하여 클래스를 만들고 싶을 때 사용합니다. 상속은 코드를 간결화하며, 재사용성을 높일 수 있습니다.
JVM(Java Virtual Marchine)은 컴파일된 소스 코드를 실행시켜주는 소프트웨어입니다. JVM이 있어 운영체제에 상관없이 자바를 실행할 수 있습니다. JRE(Java Runtime Environment)는 자바 실행환경으로, 라이브러리 등 개발 되어있는 것을 실행합니다. JDK(Java Development Kit)는 개발을 위해 필요한 도구들을 포함하고 있어 개발 및 실행이 가능합니다.
자바의 메모리 영역은 Method Area, Heap, Stack, PC Register, Native Method Stack으로 나뉩니다.
Method Area는 JVM이 실행되면서 생기는 공간으로 모든 스레드가 공유하는 영역으로, 컴파일되어 들어온 코드를 분류하여 저장합니다.
Heap 영역에서는 Stack 영역의 변수나 다른 객체의 필드에서 참조하는 객체와 배열이 생성됩니다. 더 이상 참조하지 않게 되는 의미없는 객체는 Garbage Collector에 의해 제거됩니다.
Stack 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당됩니다. 메소드를 호출할 때마다 push되고 종료되면 마지막 메소드부터 제거(pop)됩니다(Last In First Out)
스레드(thread)는 한 프로세스(process) 내에서 실행되는 동작의 단위이고, 프로세스는 CPU를 할당받아 실행되는 프로그램을 뜻합니다. 예를 들어 유튜브를 키면, 한 개의 프로세스가 실행되는 것입니다.
PC Register는 스레드가 생성되면서 생기는 공간으로, JVM이 실행되고 있는 현재 위치를 저장하는 역할을 합니다.
Native Method Stack은 자바 외의 언어로 구성된 메소드 실행이 필요할 때 사용되는 공간입니다.
자바는 멀티 스레드를 지원합니다. 멀티 스레드란, 하나의 프로세스에서 여러 개의 작업을 병렬로 처리하는 것을 말합니다.
프로세스도 두 개 이상의 프로세스가 동시에 작동할 때 멀티 프로세스라고 합니다. CPU core를 한 개만 사용할 때는 여러 프로세스를 짧은 시간 동안 번갈아 연산하는 동시성을 갖습니다. CPU core가 여러 개라면, 각각의 코어가 각각의 프로세스를 연산하는 병렬성을 갖습니다.
멀티 스레드와 멀티 프로세스는 동시에 여러 작업을 한다는 측면에서 유사하지만, 장단점이 다릅니다.
멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고, Context Switching이 빠릅니다. 반면 멀티 프로세스는 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지합니다.
멀티 스레드는 동기화 문제나 하나의 스레드 장애로 전체 스레드가 종료될 위험이 있지만, 멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높습니다.
메모리 구분이 필요할 때는 멀티 프로세스가 유리하고, Context switching이 자주 일어나고 데이터 공유가 빈번한 경우, 자원을 효율적으로 사용해야 하는 경우에는 멀티 스레드가 유리합니다.
Context switching은 컴퓨터가 task를 번갈아 가며 실행할 때, 현재 진행하고 있는 task를 저장하고 다음 실행할 task의 상태를 읽어 적용하는 과정입니다.
동기화 문제란, 서로 다른 스레드가 메모리 영역(자원)을 공유하기 때문에, 동일한 자원에 동시에 접근하여 엉뚱한 값을 읽거나 수정하는 문제 입니다.
728x90
'이론 > CS공부' 카테고리의 다른 글
컬렉션 프레임워크 (0) | 2022.11.02 |
---|---|
추상화 (0) | 2022.11.02 |
MVC패턴 (0) | 2022.11.02 |
Cookie vs Session (0) | 2022.10.31 |
Servlet vs JSP (0) | 2022.10.27 |