자바 시작하기 — JVM과 바이트 코드, 그리고 개발 환경
프로그래밍 언어는 사람의 언어와 기계어 사이를 잇는 다리입니다. 사람 쪽에 가까운 고급 언어와 기계 쪽에 가까운 저급 언어가 나뉘어 있고, 자바는 그중 고급 언어에 속합니다.
이 글은 2021년 6월 기준 기록입니다.
자바는 한 번 작성해서 어디서나 실행하려고 만들어졌다
자바는 썬 마이크로시스템즈에서 발표한 언어입니다. 다양한 서버 운영체제에서 단 한 번의 작성으로 모든 곳에서 실행 가능한 언어는 자바뿐이었기 때문에, 공공기관 웹 애플리케이션 구축용 언어로 성장했습니다.
이 "한 번 작성"이라는 성질이 자바의 첫 번째 특징인 이식성입니다. 자바로 개발된 프로그램은 소스 파일을 다시 수정하지 않아도, 자바 실행 환경(JRE)이 설치되어 있는 모든 운영체제에서 실행됩니다.
두 번째는 객체 지향 언어라는 점입니다. 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립하고 연결해서 전체 프로그램을 완성하는 기법을 객체 지향 프로그래밍(OOP)이라고 합니다. 자바는 캡슐화, 상속, 다형성 기능을 완벽하게 지원합니다.
세 번째는 함수적 스타일 코딩 지원입니다. 함수적 프로그래밍을 위해 자바 8부터 람다식을 지원합니다. 람다식을 사용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하기가 쉬워지고 코드가 매우 간결해집니다.
네 번째는 메모리 자동 관리입니다. 객체를 생성할 때 자동으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 Garbage Collector를 실행시켜 사용하지 않는 객체를 자동으로 제거합니다.
다섯 번째는 다양한 애플리케이션 개발이 가능하다는 점입니다. 콘솔 프로그램에서부터 윈도우 애플리케이션, 서버용 웹 애플리케이션, 모바일 안드로이드 앱까지 개발할 수 있습니다. 다양한 운영체제에서 사용할 수 있는 개발 도구와 API를 묶어 에디션(Edition) 형태로 정의하고 있습니다.
여섯 번째는 멀티 스레드(Multi-Thread)를 쉽게 구현할 수 있다는 점입니다. 스레드 생성 및 제어와 관련된 라이브러리 API를 제공합니다.
일곱 번째는 동적 로딩 지원입니다. 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적으로 로딩해서 객체를 생성합니다.
이식성은 JVM이 대신 짊어진다
자바 프로그램이 컴파일되어 나오는 것은 완전한 기계어가 아니라 중간 단계의 바이트 코드입니다. 그래서 이것을 해석하고 실행할 가상의 운영체제가 필요한데, 그것이 자바 가상 기계(JVM)입니다. JVM은 실제 운영체제를 대신해서 자바 프로그램을 실행하는 가상의 운영체제 역할을 합니다.
여기서 관계가 뒤집혀 있다는 점이 중요합니다. 바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장하지만, JVM 자체는 운영체제에 종속적입니다. 운영체제마다 다른 JVM이 설치되고, 그 JVM들이 똑같은 바이트 코드를 각자의 기계어로 번역합니다. 개발자가 이식성을 신경 쓰지 않아도 되는 이유는 JVM이 그 차이를 대신 흡수하기 때문입니다. JVM은 JDK 또는 JRE를 설치하면 자동으로 설치됩니다.
다만 대가가 있습니다. JVM에 의해 기계어로 번역되고 실행되기 때문에, C와 C++의 컴파일 단계에서 만들어지는 완전한 기계어보다는 속도가 느립니다.
JDK는 JRE를 품고, JRE는 JVM을 품는다
자바 개발 도구를 고를 때 먼저 마주치는 것은 에디션 구분입니다.
- JAVA SE(Standard Edition) — 자바 프로그램 개발에 필수적인 도구와 라이브러리 API를 정의합니다.
- JAVA EE(Enterprise Edition) — 분산 환경에서 서버용 애플리케이션을 개발하기 위한 도구 및 라이브러리 API를 정의합니다.
그다음이 JRE와 JDK의 관계입니다. 둘은 대등한 선택지가 아니라 포함 관계입니다.
- JRE = JVM + 표준 클래스 라이브러리
- JDK = JRE + 개발에 필요한 도구
JDK를 설치하면 기본 위치에 bin 디렉토리가 있고 그 안에 java 명령어들이 들어 있습니다. 이 명령어들을 어느 디렉토리에서든 사용하려면 Path 환경 변수에 bin 위치를 등록해야 합니다. 통상 JAVA_HOME으로 JDK가 설치된 경로를 설정한 뒤, Path에 %JAVA_HOME%bin을 설정합니다.
한편 자바 프로그램을 개발하려면 JDK에서 제공하는 표준 클래스 라이브러리를 반드시 사용해야 합니다. 이 클래스들을 API(Application Programming Interface)라고도 부릅니다. API가 매우 방대하기 때문에 쉽게 찾아볼 수 있도록 API 도큐먼트가 제공됩니다.
소스에서 실행까지는 세 단계다
자바 프로그램은 확장자가 .java인 파일을 작성하는 것에서 시작합니다. 전체 흐름은 다음 세 단계입니다.
- 자바 소스 파일(
.java)을 작성합니다. - 컴파일러(
javac.exe)로 컴파일하면 확장자가.class인 바이트 코드 파일이 생성됩니다. - JVM 구동 명령어(
java.exe)로 실행하면, 바이트 코드 파일이 JVM에서 해석되고 해당 운영체제에 맞는 기계어로 번역됩니다.
클래스 이름은 파일 이름과 대소문자까지 같아야 한다
소스 파일의 뼈대는 클래스입니다. 클래스는 필드 또는 메소드를 포함하는 블록이고, 중괄호 {부터 그와 짝을 이루는 }까지가 클래스 블록입니다.
클래스 이름은 개발자가 마음대로 정할 수 있지만 제약이 있습니다.
- 소스 파일명과 대소문자가 일치해야 합니다.
- 숫자로 시작할 수 없고, 공백을 포함해서는 안 됩니다.
- 일반적으로 대문자로 시작하도록 약속되어 있습니다.
클래스 블록 안에는 메소드가 들어갑니다. 메소드는 어떤 일을 처리하는 실행문들을 모아 놓은 블록이며, 반드시 클래스 블록 내부에 작성되어야 합니다. 메소드 이름 역시 개발자가 정할 수 있지만 main() 메소드만은 이름을 바꾸면 안 됩니다. java.exe로 JVM을 실행시키면 제일 먼저 main() 메소드를 찾아서 실행시키기 때문입니다.
세미콜론이 실행문의 끝을 정한다
주석은 프로그램 실행과 상관없이 코드에 설명을 붙인 것입니다. 컴파일 과정에서 주석은 무시되고 실행문만 바이트 코드로 번역됩니다. 자바의 주석은 세 가지입니다.
//— 행 주석.//부터 라인 끝까지를 주석으로 처리합니다./* ~ */— 범위 주석./*와*/사이에 있는 모든 범위를 주석으로 처리합니다./** ~ */— 도큐먼트 주석.javadoc.exe명령어로 API 도큐먼트를 생성하는 데 사용됩니다.
실행문은 변수 선언, 값 저장, 메소드 호출에 해당하는 코드를 말합니다. 실행문의 마지막에는 반드시 세미콜론(;)을 붙여서 실행문이 끝났음을 표시해야 합니다.
여기서 한 가지가 따라 나옵니다. 컴파일러는 세미콜론이 나올 때까지 실행문이 계속 연결된 것으로 보기 때문에, 줄바꿈은 실행문의 경계가 아닙니다. 한 실행문이 여러 줄에 걸쳐 있어도 되고, 한 줄에 여러 개의 실행문이 있어도 됩니다.
이클립스는 워크스페이스에 작업 환경을 기억한다
이클립스는 자바 프로그램 개발을 위한 통합 개발 환경(IDE)입니다. 프로젝트 생성, 자동 코드 완성, 디버깅 기능을 제공합니다.
이클립스 자체가 자바 언어로 개발된 툴이기 때문에, 이클립스를 실행하려면 JVM이 필요합니다. 즉 JDK를 먼저 설치한 후 이클립스 사이트(www.eclipse.org)에서 받아서 설치합니다. 순수 자바만 다룬다면 Eclipse IDE for Java Developers를, 웹 애플리케이션 등 엔터프라이즈 환경에서 실행되는 자바 애플리케이션을 개발하려면 Eclipse IDE for Java EE Developers를 받아야 합니다.
워크스페이스(Workspace)는 이클립스에서 생성한 프로젝트가 기본적으로 저장되는 디렉토리입니다. 이클립스는 실행될 때 적용되는 메타데이터를 워크스페이스의 하위 디렉토리인 .metadata에 저장하고, 동일한 워크스페이스에서 재시작할 경우 이전에 작업한 환경으로 복원합니다. 반대로 이클립스를 초기 상태로 돌리고 싶다면 .metadata 디렉토리를 강제로 삭제하고 재시작하면 됩니다.
화면 구성은 퍼스펙티브와 뷰로 이루어집니다. 뷰(view)는 이클립스 내부에서 사용되는 작은 창이고, 퍼스펙티브(Perspective)는 프로젝트를 개발할 때 유용하게 쓰는 뷰들을 묶어 놓은 것입니다. Eclipse IDE for Java EE Developers는 기본적으로 Java EE 퍼스펙티브를 보여 줍니다. 가장 많이 사용하는 뷰는 프로젝트를 관리하고 자바 소스 파일을 생성·삭제하는 Package Explorer 뷰이고, Console 뷰는 프로그램에서 콘솔로 출력하는 내용을 보여 줍니다.
프로젝트 생성과 컴파일
자바 소스 파일을 작성하려면 우선 자바 프로젝트를 생성해야 합니다. 프로젝트는 기본적으로 워크스페이스의 하위 디렉토리로 생성됩니다. 생성 시 지정하는 JRE는 프로젝트를 실행할 때 사용할 버전을 말합니다. Project layout에는 자바 소스 파일(.java)과 컴파일된 바이트 코드 파일(.class)을 분리 저장하도록 설정되어 있어서, 소스 파일은 src에, 바이트 코드 파일은 bin 디렉토리에 기본 저장됩니다.
소스 파일은 [New] - [Class]를 선택해 New Java Class 대화 상자에서 만듭니다. 여기서 말하는 Package는 클래스를 포함하는 그룹명 정도로 생각하면 됩니다. 에디터의 행 번호를 보고 싶다면 [Window] - [Preferences]에서 [General] - [Editors] - [Text Editors]를 선택한 후 [Show line numbers]를 체크합니다.
작성한 소스를 저장하면 내부적으로 javac가 자동 실행되어 컴파일을 수행합니다. 컴파일이 성공하면 bin 디렉토리에 바이트 코드 파일이 생성됩니다. bin 디렉토리는 Package Explorer에서는 보이지 않으므로, 확인하고 싶다면 [Window] - [Show View] - [Navigator]를 선택합니다.
실행은 Package Explorer 뷰에서 실행할 소스 파일을 선택하고 우클릭 후 [Run As] - [Java Application]을 클릭하거나, 툴바의 실행 버튼을 클릭하면 됩니다.
소스를 쓰고, 바이트 코드로 컴파일하고, JVM이 그것을 각자의 운영체제 위에서 실행한다 — 자바를 시작하며 잡아야 할 그림은 이 한 줄로 정리됩니다.
'IT·테크 > 개발' 카테고리의 다른 글
| 자바 변수와 타입 — 기본 타입 8개와 타입 변환 규칙 (0) | 2026.07.20 |
|---|