자바가 뭐야
- 일반적인 객체 지향 프로그래밍 언어
- JVM(Java Virtual Machine)에서 실행되며 OS 독립적입니다.
- 가비지 컬렉터(GC Garbage Collector)에 의한 자동 메모리 관리가 가능합니다.
- 다중 상속 또는 유형에 대해 엄격하며 많은 제한이 있습니다.
더보기
가비지 컬렉터란?
- JVM에서 메모리를 관리하는 모듈.
- 힙 메모리를 재활용하기 위해 메모리에서 더 이상 참조되지 않는 객체를 해제하는 모듈
- 개발자가 메모리를 직접 할당/할당 해제할 필요가 없기 때문에 개발 시간을 단축할 수 있는 장점이 있습니다. GC가 개체에 대한 참조를 검색하는 동안(마크 및 스윕) 스레드가 잠시 중단되어 성능이 저하됩니다.
- 객체지향 언어의 속성(상속, 캡슐화, 다형성)이 적용된 언어
더보기
객체지향 언어란?
- 프로그래밍 기법 중 하나현실 세계의 객체와 유사한 객체를 생성하고 객체에서 필요한 특성을 추출하여 프로그래밍하는 방법
객체 지향의 네 가지 요소
- 추상화: 공통 특성(속성, 기능)을 기반으로 개체에 이름을 지정하는 방법입니다. 불필요한 부분을 생략하고 사물의 가장 중요한 특성에만 집중함으로써 윤곽과 연결된다.
- 캡슐화(Encapsulation): 주어진 객체가 독립적으로 역할을 수행하는 데 필요한 데이터와 기능을 묶음(모듈화), 객체의 속성(데이터 필드)과 작업(메소드)을 하나로 캡슐화하고 실제 구현 내용의 일부를 외부에서 숨김 . .
- 상속: 기존 클래스를 재사용하여 새로운 클래스를 생성하는 기술 코드를 함께 관리함으로써 코드 추가 및 변경이 가능하여 코드 재사용성이 높아지고 중복 코드가 제거되어 생산성 및 유지보수에 도움이 됩니다.
- 다형성(Polymorphism): 프로그래밍 언어의 각 요소(상수, 변수, 표현식, 객체, 메서드 등)가 서로 다른 데이터 유형에 속하도록 하는 속성을 말합니다.
다형성의 예
오버로드됨: 이름은 같지만 매개변수 유형과 개수가 다른 여러 메서드입니다.
재정의: 하위 클래스가 상위 클래스의 메서드를 재정의하여 사용하는 경우,
정적 키워드
- Static 키워드를 사용하는 변수와 메서드는 클래스가 메모리에 로드될 때 함께 초기화되어 인스턴스(새 생성자)를 생성하지 않고 사용할 수 있습니다.
- 동일한 클래스에서 선언된 정적 변수는 메서드가 선언된 메모리를 공유합니다.
- 메서드 창은 메모리를 관리합니다.
추상 클래스와 인터페이스
추상 클래스
- Class 앞에 “abstract” 키워드를 사용하여 정의되며 하나 이상의 추상 메서드를 가진 클래스를 나타냅니다. 추상 메서드를 선언하고 하위 클래스가 상속을 통해 구현하도록 강제하는 클래스입니다.
- 추상 메소드가 없는 클래스도 “abstract”를 추가하여 추상 클래스로 지정할 수 있으며, 반대로 추상 메소드를 포함하는 클래스는 추상 클래스여야 합니다!!
- 추상 클래스는 상속을 위한 클래스이므로 new 키워드를 사용하여 직접 객체를 생성할 수 없습니다.
- 인터페이스와 달리 정적 또는 최종 필드가 아닌 필드를 가질 수 있으며 모든 액세스 수정자를 사용할 수 있습니다.
상호 작용
- “인터페이스”라는 키워드로 선언되며 정적 최종 및 추상 메소드 세트입니다.
- 추상 클래스보다 추상화 수준이 높으며 추상 클래스와 달리 구현 부분이 있는 일반 메서드 및 멤버 변수를 가질 수 없습니다.
- 모든 메서드는 ‘public abstract’로 선언해야 하며 생략 가능합니다. 또한 모든 멤버 변수는 ‘public static final’로 선언해야 하며 생략도 가능하다. (컴파일 시 자동으로 생성되기 때문에)
함께
- 공통점은 메서드 선언만 있고 구현 세부 정보(추상 메서드)가 없다는 것입니다.
- new 키워드를 사용하여 개체를 만들 수 없으며 상속된 클래스는 선언된 추상 메서드를 구현해야 합니다.
차이점
- 추상 클래스는 extend 키워드로 상속하고 다중 상속이 불가능하지만 인터페이스는 implement 키워드를 사용하여 다중 상속이 가능합니다.
- 추상 클래스는 추상 클래스를 상속하고 기능을 사용하며 확장하는 역할을 합니다.
- 인터페이스는 함수의 셸로만 존재하며 구현 개체의 동일한 동작을 보장하기 위해 함수 구현을 강제하는 데 사용됩니다.
Java의 런타임 프로세스
- 소스 코드 작성(.java 파일)
- 컴파일러에서 javac를 사용하여 해당 코드를 .class 파일로 변환(바이트코드로 변환)
- ClassLoader는 변환된 바이트코드를 런타임 데이터 영역(메모리 영역)에 로드하고, 링크를 통해 배치를 수행합니다. 또한 런타임에 클래스를 동적으로 로드합니다.
- 실행 엔진JVM 메모리 공간에 로드된 바이트코드로 구성된 .class 파일을 기계어로 변환하여 명령어 단위로 실행한다.
자바 메모리 구조
- PC 레지스터: 현재 실행 중인 부분, 즉 쓰레드가 어떤 부분을 어떤 명령어로 실행하는지 명령어와 주소를 저장한다. 현재 실행 중인 JVM 명령어의 주소 값이 저장된다.
- JVM 스택: 스레드가 생성될 때마다 하나씩 생성되며 각 스레드는 독립적인 메모리 공간을 갖습니다. 메소드가 호출되면 이 스택이 쌓이고 메소드 내의 로컬 변수, 반환 값 및 매개 변수가 스택 프레임에 임시로 저장되고 스레드가 종료되면 RunTime 스택이 JVM에 의해 파괴(LIFO 구조)됩니다.
- Native Method Stack: Java 이외의 언어로 제공되는 메소드를 저장하기 위한 영역인 JINI(Java Native Interface)라는 표준 규격을 제공한다.
- 힙 메모리: 인스턴스가 생성되는 영역으로 모든 객체 유형(String, Integer, ArrayList 등)이 힙 영역에 생성됩니다. 얼마나 많은 스레드가 있더라도 모든 스레드가 공유하는 힙 영역은 하나뿐입니다. 힙 영역은 new 연산자와 배열 정보로 생성된 객체를 저장하는 영역으로 GC의 목표!!
- 메소드 스코프(class scope): 클래스명, 부모 클래스명, 메소드, 변수(전역 변수 포함) 등의 클래스 정보를 저장하며, 쓰레드 간에 공유할 수 있는 스코프는 JVM 내에서 하나만 존재한다.
