지난 장에서 자바가 왜 태어났는지 봤다면, 이번엔 실제로 자바를 돌릴 준비를 해요. JDK·JRE·JVM이 각각 뭔지 그림으로 정리하고, 그 유명한 Hello, World!를 한 줄씩 뜯어봅니다. 하나도 안 어렵게, 천천히 갈게요.
.java · .class의 차이를 알아요.요리를 한다고 생각해 봐요. 요리를 하려면 ① 조리 도구(칼·냄비)와 ② 불이 들어오는 주방이 필요하죠. 자바도 똑같아요. 자바 프로그램을 만들고 돌리려면 크게 두 가지가 필요합니다.
여기에 하나 더, 실무에서는 코드를 편하게 쓰도록 도와주는 편집기(IDE, 통합 개발 환경)도 많이 써요. 하지만 IDE는 필수는 아니에요 — 메모장으로도 자바를 짤 수 있어요. 이번 장에서는 "필수 재료"인 JDK부터 확실히 이해하는 데 집중할게요.
이름이 비슷해서 처음엔 헷갈리지만, 사실 서로 포함하는 관계예요. 큰 것부터 순서대로 JDK ⊃ JRE ⊃ JVM — 즉 JDK가 JRE를 품고, JRE가 JVM을 품고 있어요. 그림으로 보면 단번에 이해됩니다.
javac, 실행기 java, 디버거 등 + 아래의 JRE를 통째로 포함| 이름 | 풀이 | 하는 일 | 대표 포함물 |
|---|---|---|---|
| JVM | Java Virtual Machine 자바 가상 머신 | 바이트코드를 실행. 지난 장의 "만국 공통 통역사"가 바로 이거예요. | (실행 엔진 자체) |
| JRE | Java Runtime Environment 자바 실행 환경 | 프로그램을 돌리기만 할 때 필요한 세트. | 표준 라이브러리 + JVM |
| JDK | Java Development Kit 자바 개발 도구 | 프로그램을 만들고(컴파일) + 돌리는 풀세트. | 개발 도구(javac 등) + JRE |
javac·java와 함께 잠깐 나온 이름인데, 지금은 "코드의 문제를 추적해 주는 도구"라고만 알아 두면 충분해요.JDK는 여러 회사·단체가 각자 배포판을 내놔요(모두 OpenJDK라는 같은 뿌리에서 나와요). 학습용으로는 무료 OpenJDK 배포판 중 아무거나 하나면 충분해요. 대표적으로 아래가 유명합니다.
| 배포판 | 만든 곳 | 특징 |
|---|---|---|
| Eclipse Temurin | Adoptium (이클립스 재단) | 가장 널리 쓰이는 무료·표준 배포판. 입문용으로 무난해요. |
| Amazon Corretto | Amazon | 아마존이 무료로 제공하며 장기 지원을 보장해요. |
지난 장에서 자바는 두 단계로 실행된다고 했어요. 이번엔 그 과정을 실제 명령어와 함께 봅니다. 우리가 만든 소스 파일 HelloWorld.java가 실행되기까지는 이렇게 흘러가요.
HelloWorld.java(사람 글자)를 컴파일러 javac가 바이트코드로 번역해요. 그 결과로 HelloWorld.class 파일이 생겨요. 이때 문법 오류가 있으면 여기서 걸러져요(컴파일 에러).HelloWorld.class(바이트코드)를 java 명령으로 실행하면, JVM이 그 바이트코드를 읽어 실제로 프로그램을 돌려요.
한마디로 javac는 "번역기", java는 "실행기"예요. 번역(javac) 없이는 실행(java)할 수 없어요.
터미널(명령 프롬프트)에서 직접 하면 이렇게 두 줄이에요. (요즘은 IDE가 이걸 버튼 하나로 대신 해 줘요. 하지만 속에서 무슨 일이 일어나는지 아는 게 중요합니다.)
명령 프롬프트(cmd)나 PowerShell, 맥에서는 터미널 앱이 그 역할을 해요. 아래의 javac·java 같은 명령도 여기에 입력하고, System.out.println의 출력도 이 화면에 찍혀요.// ① 컴파일 — HelloWorld.java 를 번역 → HelloWorld.class 생성
javac HelloWorld.java
// ② 실행 — HelloWorld 를 JVM으로 실행 (확장자 .class 는 붙이지 않음)
java HelloWorld
java HelloWorld.class가 아니라 java HelloWorld처럼 확장자 없이 써요. 반대로 컴파일할 때는 javac HelloWorld.java처럼 .java 확장자를 붙여야 해요. 헷갈리기 쉬우니 기억해 두세요.| 구분 | 확장자 | 정체 | 누가 읽나 |
|---|---|---|---|
| 소스 파일 | .java | 사람이 쓴 자바 코드(글자) | 사람 · 컴파일러 |
| 바이트코드 | .class | 컴파일된 실행용 코드 | JVM |
.java —(javac 컴파일)→ .class —(java 실행 = JVM)→ 프로그램이 돌아감.전통적으로 프로그래밍의 첫 프로그램은 화면에 "Hello, World!"를 찍는 거예요. 아래가 자바로 쓴 그 프로그램이에요. 지금은 통째로 이해할 필요 없어요 — 한 줄씩 천천히 풀어 갈게요.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
실행하면 화면에 딱 이 한 줄이 나와요.
Hello, World!
자, 이제 위에서부터 한 조각씩 뜯어봅시다. 처음엔 낯선 단어가 많지만, "이건 이런 역할을 하는구나" 정도만 잡으면 충분해요. 각 키워드의 깊은 뜻은 다음 챕터들에서 하나씩 배워요.
public class HelloWorld — 클래스 선언
자바의 모든 코드는 클래스(class)라는 상자 안에 담겨요. 여기서는 HelloWorld라는 이름의 클래스를 만든 거예요. public은 "어디서든 접근 가능"이라는 뜻인데, 지금은 습관처럼 붙는 표시 정도로만 알아 두세요.
🔑 중요한 규칙: public class의 이름과 파일 이름이 반드시 같아야 해요. 클래스가 HelloWorld라면, 파일은 반드시 HelloWorld.java여야 합니다. 이름이 다르면 컴파일 에러가 나요.
main도 메서드의 하나로, "프로그램을 시작하는 일"을 맡아요. 메서드는 CH 이후에 본격적으로 배우니, 지금은 "이름 붙은 코드 덩어리" 정도로만 알아 두면 충분해요.public static void main(String[] args) — 시작점(main 메서드)
프로그램을 실행하면 자바는 딱 이 main 메서드부터 코드를 실행하기 시작해요. 그래서 main을 "프로그램의 출입구(시작점)"라고 불러요. 이 한 줄은 정해진 형태(시그니처)라 통째로 외워 두는 게 편해요. 각 단어를 가볍게만 짚어 볼게요.main이어야 JVM이 찾아요.main은 반드시 public static void main(String[] args)라는 시그니처여야 JVM이 시작점으로 알아봐요. 그래서 이 줄은 마음대로 바꾸지 말고 통째로 써 두는 거예요.System.out.println("Hello, World!") — 화면 출력
화면(콘솔)에 글자를 한 줄 출력하는 명령이에요. System.out은 "표준 출력(화면)"을 가리키고, println은 "print line" — 출력하고 줄을 바꿔라는 뜻이에요. 큰따옴표 "..." 안에 넣은 글자가 그대로 화면에 나와요.
💬 print vs println: println은 출력 후 줄바꿈을 하고, print는 줄바꿈 없이 이어서 출력해요. 아래 예시로 차이를 확인해 보세요.
System.out.print("Hello, "); // 줄바꿈 없음
System.out.print("World!"); // 앞에 이어서 출력
System.out.println(); // 여기서 줄바꿈
System.out.println("A"); // 출력 후 줄바꿈
System.out.println("B"); // 다음 줄에 출력
위 코드의 실행 결과는 이렇게 나와요.
Hello, World!
A
B
; 과 중괄호 { }
세미콜론 ; — 하나의 문장(명령)이 끝났다는 마침표예요. 자바에서 실행 문장 끝에는 반드시 ;를 붙여요. 빠뜨리면 컴파일 에러가 나요(입문자가 가장 많이 겪는 실수예요!).{ } — 코드의 범위(블록)를 묶어요. 클래스의 몸통도 { }, main 메서드의 몸통도 { }로 감싸요. 여는 { 가 있으면 반드시 짝이 되는 닫는 } 가 있어야 해요.
✍️ 들여쓰기는 문법 규칙은 아니지만(파이썬과 달리), 블록 안쪽을 한 칸씩 밀어 쓰면 어디부터 어디까지가 한 덩어리인지 눈에 잘 보여요. 습관 들이면 코드가 훨씬 읽기 쉬워집니다.
System과 system을 다른 것으로 봐요. System.out.println은 대소문자까지 정확히 써야 동작해요. Println이나 system처럼 쓰면 에러가 납니다.주석(comment)은 코드에 남기는 메모예요. 자바가 실행할 때 주석은 완전히 무시해요 — 오직 사람이 읽으라고 적는 설명이에요. 자바에는 주석을 다는 방법이 세 가지 있어요.
// ① 한 줄 주석 — 이 줄 끝까지 설명 (가장 많이 씀)
int age = 20; // 코드 뒤에 붙여 쓸 수도 있어요
/*
② 여러 줄 주석
여러 줄에 걸쳐 설명할 때 써요.
/* 로 열고 */ /* 로 닫아요.
*/
/**
* ③ 문서 주석 (Javadoc)
* 클래스나 메서드 위에 붙여, 나중에 설명 문서를 자동으로 만들 때 써요.
*/
public class Sample {
}
| 기호 | 이름 | 언제 쓰나 |
|---|---|---|
// | 한 줄 주석 | 한 줄짜리 짧은 설명. 코드 옆에 붙이기도 해요. 가장 자주 씀. |
/* ... */ | 여러 줄 주석 | 여러 줄에 걸친 설명. 여는 /*와 닫는 */가 짝이에요. |
/** ... */ | 문서 주석 (Javadoc) | 클래스·메서드 설명용. 나중에 설명 문서를 자동 생성할 수 있어요. |
Ctrl + / (맥은 Cmd + /)를 누르면 한 줄 주석이 토글돼요. 실습할 때 아주 자주 쓰게 될 거예요..java —(javac)→ .class(바이트코드) —(java=JVM)→ 실행.System.out.println은 출력 후 줄바꿈, print는 줄바꿈 없음. 문장 끝엔 ;, 블록은 { }.// 한 줄, /* */ 여러 줄, /** */ 문서 주석. 실행 시 무시되고 사람만 읽어요.