Java 시작하기 — 설치부터 Hello World까지
Java를 처음 시작할 때 가장 먼저 마주치는 질문이 있다. "JDK랑 JRE는 뭐가 다른 건가요?" 그리고 곧바로 "javac는 뭐고 java는 뭔가요?"가 따라온다. 설치부터 Hello World까지, 한 번에 정리해보자.
JDK, JRE, JVM — 이 세 개가 뭔가요?
처음 Java를 설치하려고 하면 JDK, JRE, JVM이라는 용어가 나온다. 이 셋의 관계를 정리하면 이렇다.
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 JDK | Oracle에서 배포. 상용 라이선스 주의 |
| OpenJDK (Adoptium/Temurin) | 오픈소스, 무료. 실무에서 가장 많이 쓰임 |
| Amazon Corretto | AWS에서 관리하는 OpenJDK 배포판 |
| Azul Zulu | 다양한 OS/아키텍처 지원 |
입문이라면 **Adoptium(Eclipse Temurin)**을 추천한다. 무료이고 커뮤니티 지원이 좋다.
macOS
# Homebrew로 설치
brew install --cask temurin
# 또는 특정 버전 지정
brew install --cask temurin@21
Windows
- Adoptium 사이트에서 LTS 버전 다운로드
.msi설치 파일 실행- "Set JAVA_HOME variable" 옵션을 체크
설치 확인
java -version
# openjdk version "21.0.2" 2024-01-16 LTS
javac -version
# javac 21.0.2
java와 javac 둘 다 버전이 출력되면 설치 완료다.
Hello World — 컴파일부터 실행까지
소스 코드 작성
HelloWorld.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이 아니다
컴파일과 실행
# 1. 컴파일: .java → .class (바이트코드)
javac HelloWorld.java
# 2. 실행: JVM이 바이트코드를 해석하여 실행
java HelloWorld
# 출력: Hello, World!
이 두 단계의 과정을 그림으로 보면 이렇다.
HelloWorld.java → javac (컴파일러) → HelloWorld.class → java (JVM) → 실행 결과
(소스코드) (바이트코드) "Hello, World!"
.class 파일은 뭔가요?
javac가 만들어낸 .class 파일은 바이트코드라는 중간 형태다. 이게 Java의 핵심 설계인데, 바이트코드는 특정 OS에 종속되지 않는다.
┌─── Windows JVM → 실행
HelloWorld.class ───┼─── macOS JVM → 실행
└─── Linux JVM → 실행
같은 .class 파일이 어떤 OS에서든 실행된다. 이걸 "Write Once, Run Anywhere"라고 한다. 물론 완벽하지는 않지만(OS별 차이가 아예 없진 않다), 원칙적으로 바이트코드 단계에서 플랫폼 독립성을 확보한 것이다.
JIT 컴파일이란?
JVM은 바이트코드를 한 줄씩 해석(인터프리팅)하면서 실행한다. 그런데 자주 호출되는 코드("핫스팟")는 기계어로 바로 변환해둔다. 이걸 JIT(Just-In-Time) 컴파일이라고 한다.
바이트코드
├── 처음 실행: 인터프리터가 한 줄씩 해석
└── 반복 실행: JIT 컴파일러가 기계어로 변환 → 빠르게 실행
덕분에 Java는 초기 구동은 느릴 수 있지만, 오래 실행될수록 최적화되어 빨라진다. 서버 애플리케이션에서 Java가 강한 이유 중 하나다.
IntelliJ IDEA 세팅
터미널에서 javac와 java로 실행하는 건 원리를 이해하기 좋지만, 실제 개발에서는 IDE를 쓴다. Java 생태계에서는 IntelliJ IDEA가 사실상 표준이다.
설치
- JetBrains 사이트에서 Community Edition(무료) 다운로드
- 설치 후 실행
첫 프로젝트 생성
- New Project 클릭
- 설정 입력:
- Name:
java-basics(프로젝트 이름) - Language: Java
- Build system: IntelliJ (입문 단계에서는 이게 가장 간단하다)
- JDK: 설치한 JDK 선택 (없으면 Download JDK)
- Name:
- Create 클릭
Hello World 실행
프로젝트가 만들어지면 src/Main.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가 돌아갔으니, 코드의 구조를 좀 더 뜯어보자.
// 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 메서드는 왜 이렇게 생겼나요?
public static void main(String[] args)
public: JVM이 외부에서 접근해야 하므로static: 객체를 만들지 않고 바로 호출해야 하므로void: 반환값이 없으므로String[] args: 커맨드라인 인자를 받는 매개변수
커맨드라인 인자는 이렇게 넘긴다.
java HelloWorld Alice Bob
# args[0] = "Alice"
# args[1] = "Bob"
주석
코드에 설명을 남기는 방법은 세 가지다.
// 한 줄 주석
/*
여러 줄 주석
이 사이의 내용은 모두 무시된다
*/
/**
* 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 8 | 2014 | ✅ | 람다, 스트림 — 모던 Java의 시작 |
| Java 11 | 2018 | ✅ | HTTP Client, var |
| Java 17 | 2021 | ✅ | sealed class, 패턴 매칭 |
| Java 21 | 2023 | ✅ | 가상 스레드, record 패턴 |
입문이라면 Java 21을 설치하면 된다. 최신 LTS이고, 이전 버전의 기능을 모두 포함한다.
Java 21에서는 main 메서드를 더 간단하게 쓸 수도 있다.
// 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개는 뭔지, 형변환은 어떻게 하는지 정리할 예정이다.