객체지향으로 프로그래밍 하기 위해 다양한 지원을 한다(캡슐화, 상속, 추상화, 다형성....)
자동적으로 메모리 관리를 해준다.
Garbage Collector라고 불리는 데몬 쓰레드에 의해 GC가 일어난다.
GC로 인해 별도의 메모리 관리가 필요 없으며 비즈니스 로직에 집중 할 수 있다.
오픈 소스이다.
JDK가 오픈소스
이로 인해 많은 개발자 포럼이 형성되어 있다.
멀티 스레드를 쉽게 구축할 수 있다.
자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 때문에 실행되는 운영체제와는 상관없이 쉽게 멀티 스레드를 구현할 수 있다.
동적 로딩을 지원한다.
단점
비교적 속도가 느리다.
자바는 한 번의 컴파일링으로 실행 가능한 기계어가 만들어지지 않고 JVM에 의해 기계어로 번역되고 실행되는 과정을 거치기 때문에 속도가 느리다.
예외 처리가 불편하다.
- 예외를 직접 선언해야만된다.
2. Java의 제어자의 종류와 특징
public: 어떤 클래스의 객체에서도 사용 가능
private: 이 클래스에서만 생성된 객체가 사용 가능
protected: 이 클래스와 동일 패키지에 있거나 상속관계에 있는 하위 클래스에서만 접근 가능
package: 동일 패키지에 있는 클래스만 접근 가능
3. OOP의 4가지 특징
추상화: 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념 집합으로 다루는 것
캡슐화: 정보 은닉: 필요가 없는 정보는 외부에서 접근하지 못하도록 제한 하는 것
일반화 관계: 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정
다형성: 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
4. non-static, static 차이
non-static
공간적 특성: 객체마다 별도로 존재
인스턴스 객체라고 불림
시간적 특성: 객체 생성 시에 멤버가 생성된다.
객체가 생길 때 멤버도 생성
객체 생성 후 멤버 사용이 가능하다.
객체가 사라지면 멤버도 사라진다.
공유의 특성:
공유되지 않는다.
static
공간적 특성: 클래스마다 하나가 생성
객체 내부가 아닌 별도의 공간에서 생긴다.
클래스 객체라고 불린다.
시간적 특성: 클래스 로딩 시에 멤버가 생성
객체가 생기기 전에 생성된다.
객체가 생기기전에 사용 가능(즉 객체를 생성하지도 않고 사용 가능)
객체가 사라져도 멤버는 사라지지 않는다.
멤버는 프로그램이 종료될 때 사라진다.
공유의 특성
동일한 클래스의 모든 객체들에 의해 공유된다.
final: 객체가 변경 불가능 하도록 만들게 하는 것
원시 변수: 해당 변수는 변경 불가능
참조 변수: 참조 변수가 힙 내의 다른 객체를 변경할 수 없다.
메서드: 오버라이드 할 수 없다.
클래스: 해당 클래스에 하위 클래스를 만들 수 없다.
5. 추상 클래스와 인터페이스의 차이
추상 클래스
상속을 위한 클래스 -> 따로 객체를 생성할 수 없다.
단일 상속만이 가능
모든 접근 제어자를 사용
변수와 상수 선언 가능
추상 메소드와 일반 메소드를 선언할 수 있다.
인터페이스
- 다중 구현 가능
- public 접근 제어자만 사용 가능
- 상수만 선언 가능
- 추상 메소드만 선언 가능
=> 구분하는 이유는 다중 상속 가능 여부에 따라 용도를 정한다.
5. JVM 영억
메소드 영역: 클래스 변수의 이름, 타입, 접근 제어자 등과 같은 클래스와 관련된 정보 저장
힙 영역: new를 통해 생성된 객체와 배열의 인스턴스를 저장, 가비지 컬렉터는 힙 영역을 청소
스택 영역: 메소드가 실행되면 스택에 1개 씩 쌓인다. 메소드의 리턴 값, 지역 변수, 매개변수 등이 저장
PC register: 현재 쓰래드가 실행되는 부분의 주소와 명령을 저장
Native Method Stack: 자바 외의 언어로 작성된 코드를 위한 메모리
6. GC
메모리를 정리하는 과정
Eden 영역이 꽉차면 Minor GC, Old 영역이 꽉차면 Major GC를 수행
일반적으로 메모리의 사용을 중단한 채로 진행
JVM은 GC를 실행하기 위해 애플리케이션의 실행을 멈추는 stop-the-world를 먼저 실행
그 후 GC를 제외한 모든 쓰레드가 작업을 멈추가 GC가 끝나면 다시 작업을 재게
GC의 작업
Young 영역: 새롭게 생성된 객체들의 위치, 대부분의 객체는 금방 접근 불가능한 상태가 되기 때문에 많은 객체가 Young 영역에 생성되었다가 사라진다.
Old 영역: Young 영역에서 계속 사용되어 살아남은 객체가 복사되는 영역
Young 영역은 또 1개의 Eden 영역과 2개의 Survivor 영역으로 구성되는데 Young 영역에 대한 GC는 다음과 같다
새로운 객체가 Eden 영역에 생성
Eden 영역에 GC가 동작하고 그 중에서 살아남은 객체가 Survivor 0 으로 이동
2번의 동작이 반복되면 Survivor 0이 가득차게 된다.
Survivor 0 영역에 GC가 동작하고 살아남은 객체들은 Survivor 1으로 이동하고 Survivor 0을 비우게 된다
위 동작을 반복하여 특정 횟수만큼 살아남은 객체는 Old 영역으로 이동
GC의 문제점
Survivor 영역 중 하나는 반드시 비어있는 상태로 남아야한다.
GC의 로그를 확인하여 옵션을 수정할 지 코드를 수정해야한다.
GC에 의한 시스템 중단 시간을 줄이는 법
Young 영역과 Old 영역의 힙 크기를 높여 GC의 빈도를 줄이기
객체의 할당을 줄이기
힙 크기를 늘인다고해서 GC의 시간이 늘어날 수도 있다는 생각이 들수 도 있지만, 사실 상 Minor GC의 실행 시간은 힙의 크기보다는 살아남은 객체의 수에 의해 더욱 지연되기 때문에 Young 영역의 크기를 높인다면 GC의 실행 시간과 호출 빈도를 모두 줄일 수 있다.
7. MVC 패턴
Model, View, Controller로 설계하는 패턴
사용자가 controller를 조작하면 controller는 모델을 통해서 데이터를 가져오고 그 정보를 바탕으로 담당하는 View를 제어하여 사용자에게 전달한다.