Java를 처음 설치하려고 하면 JDK, JRE, JVM이라는 세 가지 용어가 동시에 쏟아진다. "이 세 개가 다 뭔데? 다 설치해야 하나?" 설치부터 Hello World 실행까지, 한 단계씩 정리해보자.

JDK, JRE, JVM — 세 개의 포함 관계

JDK(Java Development Kit) 는 Java 프로그램을 개발하기 위한 도구 모음이에요. JDK 안에 JRE가 포함되고, JRE 안에 JVM이 포함되는 구조입니다.

PLAINTEXT
JDK (Java Development Kit)
├── JRE (Java Runtime Environment)
│   ├── JVM (Java Virtual Machine)
│   └── 표준 라이브러리 (java.lang, java.util 등)
├── javac (컴파일러)
├── javadoc (문서 생성기)
├── jar (패키징 도구)
└── 기타 개발 도구들

이 구조를 이해하면 각각의 역할이 명확해져요.

  • JVM 은 바이트코드를 실행하는 가상 머신입니다. OS마다 다른 JVM이 존재하기 때문에, 같은 바이트코드가 어떤 OS에서든 실행돼요.
  • JRE 는 JVM에 표준 라이브러리를 더한 것입니다. Java 프로그램을 실행 하는 데 필요한 최소 환경이에요.
  • JDK 는 JRE에 컴파일러와 개발 도구를 더한 것입니다. 코드를 작성하고 컴파일 하려면 JDK가 필요해요.

결국 핵심은 이겁니다 — 실행만 하면 JRE, 개발하려면 JDK. 다만 Java 11부터는 JRE가 별도로 배포되지 않으므로 JDK만 설치하면 됩니다.

Java 설치하기

어떤 JDK를 설치해야 하나?

JDK는 여러 배포판이 있어요.

배포판특징
Oracle JDKOracle에서 배포. 상용 라이선스 주의
OpenJDK (Adoptium/Temurin)오픈소스, 무료. 실무에서 가장 많이 쓰임
Amazon CorrettoAWS에서 관리하는 OpenJDK 배포판
Azul Zulu다양한 OS/아키텍처 지원

입문이라면 Adoptium(Eclipse Temurin) 을 추천합니다. 무료이고 커뮤니티 지원이 좋아요.

macOS

BASH
# Homebrew로 설치
brew install --cask temurin

# 또는 특정 버전 지정
brew install --cask temurin@21

Windows

  1. Adoptium 사이트에서 LTS 버전 다운로드
  2. .msi 설치 파일 실행
  3. "Set JAVA_HOME variable" 옵션을 체크

설치 확인

설치가 끝나면 터미널에서 두 명령어를 실행해봅니다.

BASH
java -version
# openjdk version "21.0.2" 2024-01-16 LTS

javac -version
# javac 21.0.2

javajavac 둘 다 버전이 출력되면 성공입니다. java는 실행기, javac는 컴파일러 — 이 두 개가 JDK에 포함된 핵심 도구예요.

Hello World — 컴파일부터 실행까지

소스 코드 작성

HelloWorld.java 파일을 만들어 봅니다.

JAVA
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

여기서 지켜야 할 규칙이 있어요.

  • **파일명과 클래스명이 같아야 합니다 **: HelloWorld.java 파일 안에 public class HelloWorld
  • **main 메서드가 진입점입니다 **: JVM은 public static void main(String[] args)를 찾아서 실행을 시작해요
  • ** 대소문자를 구분합니다 **: System이지 system이 아닙니다

컴파일과 실행

소스 코드를 JVM이 이해할 수 있는 바이트코드로 변환하려면 javac를 씁니다. 그 다음 java로 실행해요.

BASH
# 1단계: 컴파일 (.java → .class)
javac HelloWorld.java

# 2단계: 실행 (JVM이 바이트코드를 해석)
java HelloWorld
# 출력: Hello, World!

전체 흐름은 이렇습니다.

PLAINTEXT
HelloWorld.java  →  javac (컴파일러)  →  HelloWorld.class  →  java (JVM)  →  실행 결과
   (소스코드)                            (바이트코드)                        "Hello, World!"

.class 파일과 플랫폼 독립성

javac가 만들어낸 .class 파일은 ** 바이트코드 **라는 중간 형태입니다. 바이트코드는 특정 OS에 종속되지 않기 때문에, 같은 .class 파일을 어떤 OS의 JVM에서든 실행할 수 있어요.

PLAINTEXT
                    ┌─── Windows JVM → 실행
HelloWorld.class ───┼─── macOS JVM   → 실행
                    └─── Linux JVM   → 실행

이것이 Java의 "Write Once, Run Anywhere" 원칙입니다. C/C++은 OS마다 다시 컴파일해야 하지만, Java는 바이트코드 단계에서 플랫폼 독립성을 확보했기 때문에 한 번 컴파일하면 어디서든 돌릴 수 있어요.

JIT 컴파일 — 왜 Java가 오래 실행될수록 빨라지나

JVM은 처음에 바이트코드를 한 줄씩 해석(인터프리팅)합니다. 그런데 자주 호출되는 코드가 발견되면, 그 코드를 기계어로 변환해서 캐싱해둬요. 이걸 JIT(Just-In-Time) 컴파일 이라고 합니다.

PLAINTEXT
바이트코드
  ├── 처음 실행: 인터프리터가 한 줄씩 해석 (느림)
  └── 반복 실행: JIT 컴파일러가 기계어로 변환 → 캐싱 (빠름)

인터프리터만 쓰면 매번 해석 비용이 들고, 처음부터 전부 기계어로 컴파일하면 시작이 느려집니다. JIT는 실제로 자주 쓰이는 코드만 골라서 기계어로 바꾸기 때문에 시작 속도와 실행 속도의 균형을 맞춰요. 서버 애플리케이션에서 Java가 강한 이유 중 하나입니다.

IntelliJ IDEA 세팅

터미널에서 javacjava로 실행하는 건 원리를 이해하기 좋지만, 실제 개발에서는 IDE를 씁니다. Java 생태계에서는 IntelliJ IDEA 가 사실상 표준이에요.

설치와 첫 프로젝트

  1. JetBrains 사이트에서 Community Edition(무료) 다운로드 후 설치
  2. New Project → Name: java-basics, Language: Java, Build system: IntelliJ, JDK: 설치한 JDK 선택
  3. Create 클릭

프로젝트가 만들어지면 src/Main.java가 자동 생성됩니다. main 메서드 왼쪽의 초록색 삼각형(▶)을 클릭하면 실행돼요.

알아두면 편한 단축키

단축키 (macOS / Windows)기능
⌘R / Shift+F10실행
⌘⇧R / Ctrl+Shift+F10현재 파일 실행
⌥Enter / Alt+Enter빠른 수정 제안
⌘B / Ctrl+B선언부로 이동
⌘⇧F / Ctrl+Shift+F전체 검색

Java 프로그램의 구조

Hello World가 돌아갔으니, 코드의 구조를 뜯어볼게요.

JAVA
package com.example;         // 1. 패키지 선언 (선택)
import java.util.Scanner;    // 2. import문 (선택)

public class HelloWorld {    // 3. 클래스 선언 (필수)
    public static void main(String[] args) {  // 4. 진입점
        System.out.println("Hello, World!");
    }
}

각 부분이 존재하는 이유가 있습니다.

  • package: 클래스가 속한 패키지를 선언합니다. 폴더 구조와 일치해야 하므로, 프로젝트가 커져도 클래스를 체계적으로 관리할 수 있어요.
  • import: 다른 패키지의 클래스를 가져옵니다. java.lang 패키지(String, System 등)는 자동 import돼요.
  • public class: Java 코드는 반드시 클래스 안에 있어야 합니다. 파일당 public 클래스는 하나만 가능해요.
  • **main 메서드 **: JVM이 프로그램을 시작할 때 호출하는 메서드입니다.

main 메서드의 각 키워드

main 메서드의 시그니처는 public static void main(String[] args)로 고정되어 있습니다. 각 키워드에는 이유가 있어요.

  • public: JVM이 외부에서 접근해야 하므로
  • static: 객체를 만들지 않고 바로 호출해야 하므로
  • void: 반환값이 없으므로
  • String[] args: 커맨드라인 인자를 배열로 받습니다

커맨드라인 인자는 이렇게 넘깁니다.

BASH
java HelloWorld Alice Bob
# args[0] = "Alice", args[1] = "Bob"

주석 — 코드에 설명 남기기

JAVA
// 한 줄 주석

/* 여러 줄 주석
   이 사이의 내용은 모두 무시된다 */

/** Javadoc 주석 — API 문서를 생성할 때 사용 */

입문 단계에서는 ///* */만 알면 됩니다. Javadoc(/** */)은 라이브러리를 만들 때 쓰게 돼요.

주의할 점

1. JAVA_HOME이 설정되지 않았을 때

JDK를 설치했는데 javac가 동작하지 않으면 환경 변수 JAVA_HOME이 설정되지 않은 것입니다. Windows에서는 설치 시 "Set JAVA_HOME" 옵션을 빼먹으면 이 문제가 생겨요. 터미널에서 echo $JAVA_HOME(macOS/Linux) 또는 echo %JAVA_HOME%(Windows)으로 확인할 수 있습니다.

2. 파일명과 클래스명 불일치

HelloWorld.java 파일 안에 public class Hello라고 쓰면 컴파일 에러가 납니다. Java는 public 클래스명과 파일명이 반드시 일치 해야 해요. 이 규칙 때문에 "파일명을 바꿨는데 컴파일이 안 돼요"라는 문제가 자주 발생합니다.

3. Java 버전 선택

Java는 6개월마다 새 버전이 나오지만, 실무에서 중요한 건 LTS(Long-Term Support) 버전입니다. 입문이라면 Java 21(최신 LTS)을 설치하면 돼요.

버전LTS핵심
Java 8람다, 스트림 — 모던 Java의 시작
Java 11HTTP Client, var
Java 17sealed class, 패턴 매칭
Java 21가상 스레드, record 패턴

TIP 이 글의 코드 예제를 직접 실행해보고 싶다면 Java 기본기 핸드북을 확인해보세요.

정리

항목설명
JDK / JRE / JVMJDK ⊃ JRE ⊃ JVM. 개발하려면 JDK 설치
컴파일javac.java.class(바이트코드) 변환
실행java로 JVM이 바이트코드를 해석하여 실행
플랫폼 독립성바이트코드는 OS에 종속되지 않음 (Write Once, Run Anywhere)
JIT 컴파일자주 실행되는 코드를 기계어로 변환해 성능 향상
IDEIntelliJ IDEA Community Edition이면 충분
파일 규칙파일명 = public 클래스명

다음 글에서는 Java의 변수와 타입 시스템을 살펴봅니다. Java가 왜 이렇게 타입에 엄격한지, 기본 타입 8개는 뭔지, 형변환은 어떻게 하는지 정리할 예정이에요.

댓글 로딩 중...