
Java는 한때 운영체제별로 다른 코딩 방식을 강요했던 시대를 뒤집고, "Write Once, Run Anywhere"라는 슬로건으로 전세계 개발자들에게 큰 사랑을 받았습니다.

자바 소스코드(.java 파일)는 컴파일러에 의해 바이트코드(.class 파일)로 변환됩니다.
이 바이트코드는 JVM의 Class Loader에 의해 메모리에 로드되고, Execution Engine에 의해 실행됩니다.
즉, 운영체제에 상관없이 동일한 바이트코드를 각 플랫폼에 맞게 해석하여 실행할 수 있습니다.
정리:
자바 애플리케이션은 컴파일러가 소스를 바이트코드로 변환하고, JVM의 Class Loader와 실행 엔진이 이를 메모리에 로드하여 실행함으로써 운영체제 독립성을 보장합니다.

자바의 메모리 구조는 크게 두 영역으로 구분됩니다.
스레드별 영역:
공통 영역:
정리:
자바 메모리 구조의 각 스레드는 PC Register, JVM Stack, Native Method Stack을 가지고 있으며, 모든 스레드가 공유하는 영역으로는 Method Area와 Heap이 존재합니다.
JVM은 메모리 관리를 위해 가비지 컬렉션(GC) 모듈을 사용합니다.
기본적으로 Mark and Sweep 알고리즘을 사용하여, 더 이상 참조되지 않는 객체들을 찾아 제거하고 메모리를 재활용합니다.
정리:
GC는 JVM의 메모리 관리 역할을 수행하며, 불필요한 객체를 제거함으로써 메모리 누수를 방지합니다. 다만, GC 동작 시 잠깐의 애플리케이션 중단이 발생할 수 있다는 단점도 있습니다.
객체지향 프로그래밍(OOP)은 현실 세계의 사물을 객체로 모델링하여, 이들 객체 간의 상호작용을 통해 프로그램을 구성하는 패러다임입니다.
OOP의 4대 특징은 다음과 같습니다:
정리:
객체지향 프로그래밍의 4가지 특징은 추상화, 캡슐화, 상속성, 다형성입니다.
자바에서 추상화는 추상 클래스와 인터페이스 두 가지 방법으로 구현할 수 있습니다.
abstract 키워드를 사용하여 정의하며, 하나 이상의 추상 메소드를 포함할 수 있습니다. interface 키워드를 사용하여 정의하며, 자바 8 이전에는 모든 메소드가 추상 메소드였으나, 이후에는 default 메소드와 static 메소드도 포함할 수 있습니다. 정리:
추상 클래스는 기능 재활용과 확장을 위해 상속 관계를 형성하는 데 유용하며, 인터페이스는 여러 클래스가 동일한 동작을 수행하도록 보장하는 역할을 합니다.