문제를 여러 개의 객체 단위로 나눠서 작업하는 방식
클래스를 이용해 연관있는 함수(처리)와 변수(데이터)를 하나로 묶어 객체(인스턴스)를 생성해 사용한다.
대표적으로 JAVA, C# 등이 있다.
오버라이딩
: 부모 클래스의 메서드와 같은 이름, 매개변수를 재정의하는 것오버로딩
: 같은 이름의 함수를 여러 개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있도록 하는 것자바를 실행하기 위한 가상 컴퓨터
OS에 종속 받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상의 컴퓨터
.class
파일)를 OS에 특화된 코드로 변환하여 실행*.java
)는 CPU가 인식을 하지 못하므로 기계어로 컴파일을 해줘야한다*.class
)로 변환된다. Java compiler 가 .java
파일을 .class
라는 Java bytecode로 변환한다.💡 Java compiler란?
JDK를 설치하면 bin 에 존재하는javac.exe
를 말한다. 즉, JDK에 Java compiler가 포함되어 있다는 뜻이다.
javac 명령어를 통해.java
를.class
로 컴파일 할 수 있다
클래스 로더(Class Loader)
- JVM 내에 클래스 파일(*.class
)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
- 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크한는 역할
실행 엔진(Execution Engine)
- 클래스를 실행시키는 역할
- 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경
▲ 인터프리터(Interpreter)
실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행
한 줄씩 수행하므로 속도가 느림
▲ JIT 컴파일러(Just-in-Time)
인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일해 기계어로 변경하고, 그 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식
▲ 가비지 콜렉터(Garbage collector)
더이상 사용하지않는 인스턴스를 찾아 메모리에서 삭제
런타임 데이터 영역 (Runtime Data Area)
프로그램을 실행하기 위해 OS에서 할당받은 메모리 공간
▲ PC Register
Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간
스레드마다 하나씩 존재하며 현재 수행 중인 JVM 명령의 주소를 가지고 있음
💡 스레드(thread)란?
스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체
▲ JVM 스택 영역
프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역
▲ Native method stack
자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
▲ Method Area (= Class Area = Static area)
클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
▲ Runtime Constant Pool
스태틱 영역에 존재하는 별도의 관리영역
상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행
▲ Heap
객체를 저장하는 가상메모리 공간
new
연산자로 생성되는 객체와 배열을 저장
Class Area(Static Area)에 올라온 클래스들만 객체로 생성할 수 있음
*.java
파일이 컴파일러를 통해 전달되어 소스코드를 Bytecode로 인코딩하여 소스파일에 포함된 각 클래스의 내용은 별도의 .class
파일에 저장
*.java
소스파일을 읽은 뒤 결과 토큰을 AST(Abastract Syntax Tree) 노드에 매핑*.class
파일을 생성