프로그래밍을 할때 모든 것을 객체단위로 구성하여 코드의 재사용성, 유지보수가 쉽다.
OOP의 요소
다형성 Polymophism
하나의 변수, 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는 것을 말한다.
OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터
Java 소스코드, *.java
파일을 CPU가 인식하지 못하므로 기계어로 컴파일이 필요하다.
Java에서는 JVM이라는 가상머신을 거쳐 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는 것이 아니라 JVM이 인식할 수 있는 Java bytecode(*.class
)로 변환된다.
Java complier 가 .java
.class
라는 Java bytecode로 변환한다.
여기서 Java compiler는 JDK를 설치하면 bin 에 존재하는 javac.exe를 말한다. (즉, JDK에 Java compiler가 포함)
javac 명령어를 통해 .java를 .class로 컴파일 할 수 있다.
변환된 bytecode는 기계어가 아니기 때문에 OS에서 바로 실행되지 않고 JVM이 OS가 bytecode를 이해할 수 있도록 해석해준다. 따라서 bytecode는 JVM 위에서 OS관계없이 실행될 수 있는것이다.
OS에 종속적이지 않고 Java파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행이 가능한 이유이다.
가상 컴퓨터(VM)에서 돌아가는 실행 프로그램을 위한 이진 표현법
Java bytecode 는 JVM이 이해할 수 있는 언어로 변환된 자바 소스코들를 의미한다.
자바 컴파일러에 의해 변환된 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다.
바이트 코드는 다시 실시간 번역기 또는 JIT 컴파일러에 의해 바이너리 코드로 변환된다.
JIT 컴파일(just-in-time compliation) 또는 동적 번역(dynamic translation)
JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러이다.
인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 코드를 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식
기계어(컴파일된 코드)는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 빠르게 수행하게 된다.
물론 JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 인터프리팅하는 것보다 훨씬 오래걸리므로 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅하는 것이 유리하다.
따라서 JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고 일정 정도를 넣을때에만 컴파일을 수행한다.