이제부터 Java에 대해 포스팅을 시작해보려 한다. 시작하기에 앞서 이번 포스팅은 Java가 가진 특징 중에 가장 기본적인 내용인 JVM(Java Virtual Machine)에 대해 알아보려고 한다.
먼저, Java가 만들어진 배경에 대해 알아보자.
기존 C/C++와 같은 언어들은 플랫폼 종속성의 문제를 가지고 있었다.
플랫폼 종속성이란, 프로그램이 개발한 환경(OS, H/W)에만 맞춰져 실행된다는 뜻으로 다른 환경에선 프로그램을 다시 작성해야한다는 문제점이 있다.
플랫폼 종속성이 발생하는 이유는 다음과 같다.
- H/W마다 다양한 CPU를 사용하고 CPU마다 기계어가 다르다.
- OS마다 API와 실행파일의 형식이 다르다.
이러한 문제점들을 해결하기 위해 Java가 탄생하였고 그 중심에 JVM이 있는 것이다.
- JVM(Java Virtual Machine)
자바 바이트 코드를 실행하는 자바 가상 기계(소프트웨어)
여기서 바이트 코드(byte code)란, Java로 작성한 소스를 컴파일한 코드로 ".class" 형식의 클래스 파일에 저장되고 CPU에 종속되어 있지 않다는 것이 특징이다.
바이트 코드를 준비하고 JVM을 개발 환경(OS)에 맞게 설치만 하면 다른 개발 환경에서 작성된 프로그램을 실행할 수 있다.
- JVM을 개발 환경에 맞게 설치해야 한다는 점에서 JVM 자체는 플랫폼 종속성의 특징을 가지고 있다.
다음으로 JVM이 프로그램을 실행하는 과정에 대해 살펴보자.
Java 소스를 컴파일하면 소스 파일(클래스)마다 클래스 파일이 생성된다. 이때, C/C++과 달리 컴파일 후 링크(Link)과정이 없이 JVM이 그때그때 필요한 클래스 파일을 동적 로딩을 통해 실행하도록 한다.
- 링크(Link)
컴파일 후 생성된 파일들을 하나의 파일(ex)로 연결하는 작업
- 동적 로딩
JVM에 포함된 "클래스 로더"에 의해 진행되는 것으로 프로그램 실행 중에 필요한 클래스들을 로딩하는 것을 의미한다.
동적 로딩의 장점으로 기능을 보면 대략적으로 알 수 있듯이 메모리 사용량이 적다는 것이다.
동적 로딩이 이루어지는 과정은 Java 파일의 main 메소드에서 필요한 클래스마다 객체를 생성하여 실행하는 것을 생각하면 될 것이다.
마지막으로, JVM의 단점으로 속도가 느리다는 점이 있다.
다음 그림을 보자.
위 그림은 프로그램의 실행 순서 계층도라고 보면 된다.
일반적으로 프로그램의 실행 순서는 다음과 같다.
일반 프로그램과 달리 Java 프로그램은 JVM을 포함하고 있어 프로그램을 실행하는데 거쳐야 하는 Layer가 1개 추가된 것이 그 이유라고 대략적으로 이해해 볼 수 있다.(Java 프로그램의 속도가 느린 점에 대해 이외에도 많고 자세한 이유가 존재한다.)
Java 프로그램의 실행 순서는 다음과 같다.