Theme:

Java를 처음 시작할 때 가장 먼저 마주치는 질문이 있다. "JDK랑 JRE는 뭐가 다른 건가요?" 그리고 곧바로 "javac는 뭐고 java는 뭔가요?"가 따라온다. 설치부터 Hello World까지, 한 번에 정리해보자.

JDK, JRE, JVM — 이 세 개가 뭔가요?

처음 Java를 설치하려고 하면 JDK, JRE, JVM이라는 용어가 나온다. 이 셋의 관계를 정리하면 이렇다.

PLAINTEXT
JDK (Java Development Kit)
├── JRE (Java Runtime Environment)
│   ├── JVM (Java Virtual Machine)
│   └── 표준 라이브러리 (java.lang, java.util 등)
├── javac (컴파일러)
├── javadoc (문서 생성기)
├── jar (패키징 도구)
└── 기타 개발 도구들
  • JVM: Java 바이트코드를 실행하는 가상 머신. OS별로 다른 JVM이 있어서 "Write Once, Run Anywhere"가 가능하다.
  • JRE: JVM + 표준 라이브러리. Java 프로그램을 실행하는 데 필요한 최소 환경이다.
  • JDK: JRE + 개발 도구(컴파일러, 디버거 등). Java 프로그램을 개발하려면 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 둘 다 버전이 출력되면 설치 완료다.

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 메서드가 진입점: public static void main(String[] args)는 Java 프로그램의 시작점이다
  • 대소문자 구분: Java는 대소문자를 구분한다. System이지 system이 아니다

컴파일과 실행

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 파일은 바이트코드라는 중간 형태다. 이게 Java의 핵심 설계인데, 바이트코드는 특정 OS에 종속되지 않는다.

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

같은 .class 파일이 어떤 OS에서든 실행된다. 이걸 "Write Once, Run Anywhere"라고 한다. 물론 완벽하지는 않지만(OS별 차이가 아예 없진 않다), 원칙적으로 바이트코드 단계에서 플랫폼 독립성을 확보한 것이다.

JIT 컴파일이란?

JVM은 바이트코드를 한 줄씩 해석(인터프리팅)하면서 실행한다. 그런데 자주 호출되는 코드("핫스팟")는 기계어로 바로 변환해둔다. 이걸 JIT(Just-In-Time) 컴파일이라고 한다.

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

덕분에 Java는 초기 구동은 느릴 수 있지만, 오래 실행될수록 최적화되어 빨라진다. 서버 애플리케이션에서 Java가 강한 이유 중 하나다.

IntelliJ IDEA 세팅

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

설치

  1. JetBrains 사이트에서 Community Edition(무료) 다운로드
  2. 설치 후 실행

첫 프로젝트 생성

  1. New Project 클릭
  2. 설정 입력:
    • Name: java-basics (프로젝트 이름)
    • Language: Java
    • Build system: IntelliJ (입문 단계에서는 이게 가장 간단하다)
    • JDK: 설치한 JDK 선택 (없으면 Download JDK)
  3. Create 클릭

Hello World 실행

프로젝트가 만들어지면 src/Main.java가 자동 생성된다.

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

main 메서드 왼쪽의 초록색 삼각형(▶)을 클릭하면 실행된다. 아래 콘솔에 Hello world!가 출력되면 성공이다.

IntelliJ 기본 단축키

처음부터 단축키를 외울 필요는 없지만, 이 정도는 알아두면 편하다.

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

Java 프로그램의 구조

Hello World가 돌아갔으니, 코드의 구조를 좀 더 뜯어보자.

JAVA
// 1. 패키지 선언 (선택)
package com.example;

// 2. import 문 (선택)
import java.util.Scanner;

// 3. 클래스 선언 (필수)
public class HelloWorld {

    // 4. main 메서드 (프로그램 진입점)
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

각 부분 설명

  • package: 클래스가 속한 패키지를 선언한다. 폴더 구조와 일치해야 한다.
  • import: 다른 패키지의 클래스를 가져온다. java.lang 패키지는 자동 import된다.
  • public class: Java 코드는 반드시 클래스 안에 있어야 한다. 파일당 public 클래스는 하나만 가능하다.
  • main 메서드: public static void main(String[] args) — JVM이 프로그램을 시작할 때 호출하는 메서드다.

main 메서드는 왜 이렇게 생겼나요?

JAVA
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 문서를 생성할 때 사용한다
 * @param name 이름
 * @return 인사 문자열
 */
public String greet(String name) {
    return "Hello, " + name;
}

입문 단계에서는 ///* */만 알면 된다. Javadoc은 나중에 라이브러리를 만들 때 쓰게 된다.

Java 21 — 요즘 Java는 어떤가요?

Java는 6개월마다 새 버전이 나온다. 그중 LTS(Long-Term Support) 버전이 실무에서 중요하다.

버전출시LTS핵심
Java 82014람다, 스트림 — 모던 Java의 시작
Java 112018HTTP Client, var
Java 172021sealed class, 패턴 매칭
Java 212023가상 스레드, record 패턴

입문이라면 Java 21을 설치하면 된다. 최신 LTS이고, 이전 버전의 기능을 모두 포함한다.

Java 21에서는 main 메서드를 더 간단하게 쓸 수도 있다.

JAVA
// Java 21 미리보기 기능 (--enable-preview 필요)
void main() {
    System.out.println("Hello!");
}

아직 미리보기 기능이라 정식 코드에서 쓰기엔 이르지만, Java가 점점 간결해지고 있다는 걸 보여주는 사례다.

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

정리

  • JDK 설치 → 개발에 필요한 모든 것이 포함
  • javac로 컴파일.java.class(바이트코드)로 변환
  • java로 실행 → JVM이 바이트코드를 해석하여 실행
  • IDE 사용 → IntelliJ IDEA Community Edition이면 충분
  • 파일명 = 클래스명HelloWorld.java 안에 public class HelloWorld

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

댓글 로딩 중...