Java
는 JVM
(Java Virtual Machine)이라는 가상 환경에서 돌아가기 때문.
JVM
이 Java
애플리케이션으로부터 전달받은 명령을 기계어로 변환하여 OS나 하드웨어에 명령을 한다.
Java
애플리케이션은 모두 class
라는 객체로 이루어져 있다. 상속, 캡슐화, 다형성 등이 적용된 OOP
(Object-Oriented-Programming) 특화 언어이다.
Java
로 작성된 프로그램은 GC
(Garbage Collector)가 자동적으로 메모리 관리를 해줌.
다양한 Java API
를 통해 인터넷과 대규모 분산 환경을 고려한 개발이 가능함.
멀티 쓰레드는 원래 OS에 따라 구현 방법과 처리 방식이 상이하지만, Java
는 OS에 종속적이지 않으므로 시스템과 상관없이 구현 가능. 관련된 Java API
가 존재한다. 다수의 쓰레드 스케줄링을 JVM
내의 자바 인터프리터가 담당해준다.
실행 시 애플리케이션 내 모든 class
를 로드 하는 것이 아니라 필요한 시점에 로드 한다. 일부 class
를 변경할 때 전체를 다시 컴파일 하지 않아도 된다.
그대로 해석해보면 Java
를 실행하기 위한 가상 기계(컴퓨터) 라고 할 수 있다.
Java
코드는 OS로 바로 전달되지 않고 JVM
을 거쳐야 한다. 실행 순서는 다음과 같다.1) 작성한 자바 소스(.java) 파일이 자바 컴파일러(javac)를 통해 바이트코드(byte code)로 컴파일 된다.
2) 컴파일된 바이트코드가 JVM의 Class Loader에게 전달된다.
3) Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크해서 Runtime Data Area (JVM의 메모리)에 올린다.
4) 실행 엔진은 JVM의 메모리에 올라온 바이트 코드를 명령어 단위로 하나씩 가져와서 실행한다.
Java
로 작성된 모든 애플리케이션은 JVM
위에서만 실행된다. 때문에 Java
는 OS로부터 독립적이지만, JVM
자체는 OS에 종속적이다.