-
객체지향프로그래밍이란? : 현실 세계의 사물같은 객체를 만들고, 객체에서 필요한 특징을 뽑아 프로그래밍을 수행
- 객체지향 프로그래밍 4가지 특징 : 추상화, 캡슐화, 상속성, 다형성
- 객체지향 설계 5대 원칙 : SRP, OCP, LSP, ISP, DIP
- Single Responsible Principle(단일 책임의 원칙) : 한 클래스는 하나의 책임만을 가진다. 그 책임에 집중
- Open Closed Principle(개방/ 폐쇄의 원칙) : 소프트웨어 요소는 확장에는 열려있고 변경에는 닫혀있어야 한다.
- Liskov Substitution Principle(리스코프 치환 원칙) : 프로그램의 객체는 정확성을 깨뜨리지 않고 하위 타입의 인스턴스로 바꿀 수 있어야한다.
- Interface Segregation Principle(인터페이스 분리 원칙) : 특정 인터페이스 여러 개가 범용적인 하나의 인터페이스 보다 낫다.
- Dependency Inversion Principle(의존관계 역전 원칙) : 추상화에 의존해야지, 구체화에 의존해서는 안된다.
-
추상 클래스와 인터페이스의 차이
- 인터페이스 : 인터페이스를 상속받은 클래스는 반드시 모든 메서드를 재정의(오버라이딩) 해야한다. 클래스의 인스턴스는 인터페이스를 통해 다형성을 얻게되고, 따라서 인터페이스는 하위 클래스에게 설계도와 같은 역할이다. 하위 클래스는 여러개의 설계도를 가질 수 있으며(다중 상속 가능) 각각의 설계도에 맞는 구현체를 제공한다.
- 추상 클래스 : 인터페이스와 다르게 다중 상속 불가능하고 오로지 추상 클래스의 기능을 이용하여 확장하는 역할을 한다.
- 따라서 추상 클래스는 확장하기 위한 용도, 인터페이스는 일종의 설계도와 같은 용도이다.
-
객체지향, 함수형의 차이
- 클래스 디자인과 객체들의 관계 중심 vs 값의 연산 및 결과 도출 중심
- 클래스가 일급 객체 vs 함수 자체가 일급 객체
- 같은 인자값에 대해 다른 결과값이 반환될 수 있음 vs 항상 같은 결과값 반환됨
-
오버로딩 오버라이딩
- 오버라이딩 : 상위 클래스가 가지고 있는 메소드를 상속 받을 때 자식 클래스에서 메소드를 재정의하는것을 말합니다.
- 오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것입니다.
-
자바 애플리케이션, JVM 실행 과정 :
- JVM (Java Virtual Machine)은 스택 기반의 가상 머신으로 Java가 운영체제에 구애받지 않고 재사용 가능하게 해주고 자바 바이트 코드를 실행할 수 있는 주체입니다.
-
- 자바 프로그램이 실행되면 JVM은 운영체제로부터 프로그램이 필요로하는 메모리를 할당받는다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
-
- 자바 컴파일러 javac가 자바 소스 코드를 읽어들여 자바 바이트 코드 .class로 변환시킨다.
-
- Class Loader를 통해 class 파일들을 JVM으로 로딩한다.
-
- 로딩된 class 파일들은 Execution Engine을 통해 해석된다.
-
- 해석된 바이트코드는 Runtime Data Area에 배치되어 실질적인 수행이 이루어지게 된다. 이 실행과정 속에서 JVM은 필요에 따라 스레드 동기화와 GC같은 관리 작업을 수행한다.

-
자바 메모리 구조

- Heap (GC 대상 o)
new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
Heap에 저장된 데이터는 Garbage Collector 가 처리하지 않는한 소멸되지 않는다.
Reference Type 의 데이터가 저장되는 공간, String 리터럴 객체의 상수 값을 저장(캐싱)
- Method Area(Java 8 이후로는 Metaspace) (GC 대상 x )
JVM이 실행되면서 생기는 공간이다.
Class 정보, 전역변수 정보, Static 변수 정보가 저장되는 공간이다.
Runtime Constant Pool은 각 클래스와 인터페이스의 상수뿐만 아니라, 메서드와 필드에 대한 모든 레퍼런스까지 담고 있는 테이블입니다. 즉, 어떤 메서드나 필드를 참조할 때 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조한다.
- Stack
지역변수, 메소드의 매개변수와 같이 잠시 사용되는 데이터가 저장되는 공간
Last In First Out, 나중에 들어온 데이터가 먼저 나간다
만약, 지역변수 이지만 Reference Type일 경우에는 Heap 에 저장된 데이터의 주소값을 Stack 에 저장해서 사용하게 된다.
- Native Method Stack
Java 가 아닌 다른 언어 (C, C++) 로 구성된 메소드를 실행이 필요할 때 사용되는 공간
- PC Register
스레드가 생성되면서 생기는 공간
스레드가 어느 명령어를 처리하고 있는지 그 주소를 등록한다.
JVM이 실행하고 있는 현재 위치를 저장하는 역할

-
클래스 로더란?
- 클래스 로딩 : 클래스를 동적으로 로드하며, 클래스의 메타데이터를 JVM의 메모리(Runtime Constant Poll)에 적재
- 클래스 링크 - (검증, 준비, 해결) : 클래스 로딩 후에 클래스 파일의 바이트 코드가 올바른지(검증), 정적 변수를 기본값으로 초기화(준비 )또한 상수 풀(Constant Pool)에 있는 Symbolic Reference를 실제 메모리 Reference로 변환
- 클래스 초기화 : 정적 변수들은 프로그램에서 지정된 값으로 변경
-
클래스 로드 과정

- 애플리케이션 클래스로더는 자기가 받은 클래스 로딩 요청을 확장 클래스로더에 위임하고, 확장 클래스 로더는 부트스트랩 클래스로더에 위임한다. 그리고, 부트스트랩 클래스로더부터 요청한 클래스가 있는지 확인하고 없으면 자식 클래스에 위임한다.
- 애플리케이션 클래스로더에서도 찾지 못하면
ClassNotFoundException
예외가 발생한다.
-
가비지 컬렉션이란? : GC는 JVM에서 메모리를 관리해주는 모듈이다. Heap 메모리를 재활용하기 위해서 더 이상 참조되지 않는 객체들을 메모리에서 제거하는 모듈이다. 개발자 입장에서 메모리 릭(memory leak) 걱정 X, 개발에 집중 가능

- 가비지 컬렉션 일어나는 과정 : Mark and Sweep이라는 과정에서 참조되지 않는 객체를 찾는다. Mark는 GC Root로부터 참조되는 객체를 식별(Mark)하고 그렇지 않은 Unreachable한 객체는 제거(Sweep)한다.

- 새로운 객체는 Eden 영역에 할당된다. 두개의 Survivor Space는 비워진 상태로 시작한다.
- Eden 영역이 가득 차면, Minor GC(Young Generation을 대상으로 하는 GC)가 발생한다.
- Minor GC 가 발생하면, Reachable 객체들은 S0으로 옮겨진다. Unreachable 객체들은 Eden 영역이 클리어 될 때 함께 메모리에서 사라진다.
- 3번 반복 → 기존에 S0에 있었던 Reachable 객체들은 S1으로 옮겨지는데, 이때, age 값이 증가되어 옮겨진다.(age 임계값은 31 ← 6bit) (S0 → S1, S1 → S0 age++ 반복)
- age 값이 특정값 이상이 되면 Old Generation(Java 8 까지는 Tenured Generation라 부름)으로 옮겨지는데 이 단계를 Promotion(진급)
Old Generation에서는 Major GC 발생 ( Minor GC보다 긴 Stop the world가 발생, 약 10배 )
Young + Old + Metaspace 전체에서는 Full GC 발생
https://beststar-1.tistory.com/15
- GC 모니터링이란 : JVM이 GC를 어떻게 수행하고 있는지 확인하는 절차. Young에 있던 객체를 언제 얼마나 Old로 이동했는지, STW가 언제 얼마동안 일어났는지 등 을 통해 GC를 튜닝해야하는지 알기 위한 과정. 방법은 접근 인터페이스에 따라 CUI, GUI로 나뉜다.
- CUI 방법 : jstat, verbosegc 명령어
- GUI 방법 : Visual GC , Visual VM (Oracle JDK 제공)
-
컬렉션 프레임워크 : 자료구조를 바탕으로 객체나 데이터들을 효율적으로 관리(추가, 삭제, 검색, 저장)할 수 있는 라이브러리를 컬렉션 프레임워크라고 합니다. 대표적으로는 List, Set, Map, Stack, Queue가 있다.