자바란? JDK 설치와 Hello World 첫 프로그램 컴파일·실행 | 자바 강좌 1강
자바의 특징과 JVM의 동작 원리를 이해하고, JDK를 설치해 javac와 java 명령으로 첫 Hello World 프로그램을 컴파일하고 실행해 봅니다. 입문자가 자주 만나는 컴파일 오류와 해결 방법도 함께 정리합니다.
자바를 처음 배우기 시작하는 강이에요. 이번 강에서는 자바가 어떤 언어인지, 자바 프로그램이 어떻게 여러 운영체제에서 똑같이 실행되는지(JVM)를 살펴보고, JDK를 설치해 직접 첫 프로그램을 만들어 실행해 봅니다.
개발 도구(IDE)를 쓰면 버튼 하나로 실행되지만, 그 뒤에서 일어나는 컴파일과 실행 과정을 한 번은 손으로 해 봐야 오류 메시지를 읽고 문제를 해결할 수 있어요. 그래서 이번 강은 메모장 같은 편집기와 터미널만으로 진행합니다.
자바는 어떤 언어인가요
자바(Java)는 1995년에 처음 발표된 범용 프로그래밍 언어예요. 지금은 오라클이 관리하고, 6개월마다 새 버전이 나오며 몇 년에 한 번씩 오래 지원되는 LTS(Long-Term Support) 버전이 나옵니다.
자바는 은행·쇼핑몰 같은 대형 서버 프로그램, 안드로이드 앱의 기반 기술, 빅데이터 도구 등 아주 넓은 분야에서 쓰여요. 기업 채용 시장에서도 꾸준히 수요가 많은 언어입니다.
자바의 주요 특징
| 특징 | 설명 |
|---|---|
| 플랫폼 독립성 | 한 번 컴파일한 프로그램을 윈도우, macOS, 리눅스 어디서든 실행할 수 있어요. |
| 객체지향 | 프로그램을 '객체' 단위로 나눠 설계해요. 클래스와 객체는 나중에 자세히 배웁니다. |
| 자동 메모리 관리 | 가비지 컬렉터(GC)가 쓰지 않는 메모리를 알아서 정리해 줘요. |
| 정적 타입 | 변수의 자료형을 미리 정해 두고, 잘못된 사용은 컴파일 단계에서 잡아내요. |
| 풍부한 표준 라이브러리 | 문자열, 컬렉션, 파일, 네트워크 등 기본 기능이 처음부터 들어 있어요. |
자바의 슬로건은 "Write Once, Run Anywhere(한 번 작성하면 어디서나 실행된다)"예요. 이 말을 가능하게 하는 것이 바로 JVM입니다.
JVM과 바이트코드
컴퓨터의 CPU는 사람이 쓴 소스 코드를 바로 이해하지 못해요. C 같은 언어는 소스 코드를 특정 운영체제·CPU용 기계어로 바꾸기 때문에, 윈도우용으로 만든 실행 파일을 macOS에서 그대로 쓸 수 없습니다.
자바는 중간 단계를 하나 더 둬요. 소스 코드를 바이트코드(bytecode)라는 중간 형태로 바꾸고, 이 바이트코드를 각 운영체제에 설치된 JVM(Java Virtual Machine, 자바 가상 머신)이 읽어서 실행합니다.
HelloWorld.java --(javac: 컴파일)--> HelloWorld.class --(java: 실행)--> JVM이 실행
(소스 코드) (바이트코드)
윈도우에는 윈도우용 JVM이, macOS에는 macOS용 JVM이 있어서 같은 .class 파일이 어디서든 똑같이 동작해요. 운영체제마다 다른 부분은 JVM이 대신 처리해 주는 셈이에요.
JDK, JRE, JVM의 관계
설치할 때 헷갈리기 쉬운 용어 세 가지를 정리해 볼게요.
| 이름 | 뜻 | 들어 있는 것 |
|---|---|---|
| JVM | 자바 가상 머신 | 바이트코드를 실행하는 엔진 |
| JRE | 자바 실행 환경 | JVM + 실행에 필요한 표준 라이브러리 |
| JDK | 자바 개발 도구 모음 | JRE 기능 + 컴파일러(javac) 등 개발 도구 |
프로그램을 만들려면 JDK가 필요해요. 요즘은 JRE를 따로 배포하지 않는 경우가 많으니, 고민하지 말고 JDK를 설치하면 됩니다.
JDK 설치하기
2026년 11월 기준으로 가장 최근 LTS 버전은 JDK 25예요. 더 새로운 비-LTS 버전도 있지만, 학습용으로는 LTS 버전을 권장합니다.
이 강좌의 예제는 JDK 17 이상이면 모두 동작해요.
JDK는 여러 곳에서 배포하는데, 무료로 쓰기 편한 Eclipse Temurin(adoptium.net)이나 Oracle JDK(oracle.com/java)를 많이 써요. 내용물은 거의 같으니 둘 중 하나를 고르면 됩니다.
운영체제별 설치 방법
- 윈도우: 배포 사이트에서
.msi설치 파일을 내려받아 실행해요. Temurin 설치 화면에서 "Set JAVA_HOME variable"과 "Add to PATH" 항목을 켜 두면 환경 변수 설정이 자동으로 됩니다. - macOS:
.pkg설치 파일을 실행하거나, Homebrew를 쓴다면brew install --cask temurin명령으로 설치해요. - 리눅스(Ubuntu 등):
sudo apt install openjdk-25-jdk처럼 패키지 관리자로 설치해요. 배포판 저장소에 따라 제공되는 버전 이름이 다를 수 있어요.
설치 확인
터미널(윈도우는 명령 프롬프트나 PowerShell)을 새로 열고 다음 두 명령을 입력해 보세요.
java -version
javac -version
실행 결과(설치한 버전과 배포처에 따라 숫자와 문구가 조금씩 달라요):
openjdk version "25.0.1" 2025-10-21 LTS
OpenJDK Runtime Environment Temurin-25.0.1+8 (build 25.0.1+8-LTS)
OpenJDK 64-Bit Server VM Temurin-25.0.1+8 (build 25.0.1+8-LTS, mixed mode, sharing)
javac 25.0.1
java는 프로그램을 실행하는 명령이고, javac는 소스 코드를 컴파일하는 명령이에요. 두 명령 모두 버전이 나오면 설치가 끝난 거예요.
'javac'을(를) 찾을 수 없다는 메시지가 나온다면
윈도우에서 'javac'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.라는 메시지가 나오면 PATH 환경 변수에 JDK의 bin 폴더가 등록되지 않은 거예요. macOS·리눅스에서는 command not found: javac처럼 나옵니다.
해결 방법은 다음 순서로 확인해 보세요.
- 터미널을 완전히 닫았다가 다시 열어요. 환경 변수는 새로 연 터미널에만 반영돼요.
- 윈도우라면 '시스템 환경 변수 편집'에서
JAVA_HOME을 JDK 설치 폴더(예:C:\Program Files\Eclipse Adoptium\jdk-25...)로 만들고,Path에%JAVA_HOME%\bin을 추가해요. java는 되는데javac만 안 된다면 JDK가 아닌 JRE만 설치된 경우예요. JDK를 다시 설치하세요.
첫 프로그램: Hello World
이제 화면에 Hello, World!를 출력하는 프로그램을 만들어 볼게요. 작업할 폴더(예: java-study)를 하나 만들고, 그 안에 HelloWorld.java라는 파일을 만듭니다.
// 파일 이름: HelloWorld.java
public class HelloWorld {
// 프로그램이 시작되는 지점(main 메서드)
public static void main(String[] args) {
// 괄호 안의 문자열을 화면에 출력하고 줄을 바꿔요
System.out.println("Hello, World!");
}
}
컴파일하기
터미널에서 파일이 있는 폴더로 이동한 뒤 javac로 컴파일해요.
cd java-study
javac HelloWorld.java
아무 메시지도 나오지 않으면 성공이에요. 폴더를 보면 HelloWorld.class라는 바이트코드 파일이 새로 생겨 있어요.
실행하기
실행할 때는 java 명령 뒤에 클래스 이름을 씁니다. 확장자 .class는 붙이지 않아요.
java HelloWorld
실행 결과:
Hello, World!
코드 해설
지금은 모든 단어를 완벽히 이해하지 않아도 괜찮아요. 각 줄의 역할만 잡아 두고, 자세한 의미는 앞으로 차근차근 배웁니다.
public class HelloWorld { ... }:HelloWorld라는 클래스를 정의해요. 자바 코드는 반드시 클래스 안에 들어가요.public클래스의 이름은 파일 이름과 같아야 합니다.public static void main(String[] args) { ... }: 프로그램이 시작되는 main 메서드예요.java명령은 이 메서드를 찾아 첫 줄부터 실행해요.public,static,void,String[] args의 뜻은 메서드와 클래스를 배울 때 설명할게요.System.out.println("Hello, World!");: 큰따옴표 안의 글자를 출력하고 줄을 바꿔요. 문장 끝의 세미콜론(;)은 한 문장이 끝났다는 표시예요.//로 시작하는 부분은 주석이에요. 컴파일러가 무시하므로 설명을 자유롭게 적을 수 있어요.- 중괄호
{ }는 영역을 묶어요. 여는 괄호와 닫는 괄호의 짝이 꼭 맞아야 해요.
컴파일 없이 바로 실행하기
JDK 11부터는 소스 파일 하나짜리 프로그램을 java 명령으로 바로 실행할 수도 있어요.
java HelloWorld.java
이 방식은 내부적으로 메모리에서 컴파일한 뒤 곧바로 실행해서 .class 파일이 남지 않아요. 간단히 시험해 볼 때 편리하지만, 컴파일과 실행이 두 단계라는 사실은 꼭 기억해 두세요.
참고로 최신 JDK에서는 class 선언 없이 void main()만 쓰는 더 짧은 형태도 허용돼요. 하지만 실무 코드와 대부분의 자료가 전통적인 형태를 쓰기 때문에, 이 강좌에서는 public static void main(String[] args) 형태로 진행합니다.
println과 print로 여러 줄 출력하기
출력 명령은 두 가지를 먼저 알아 두면 좋아요. println은 출력 후 줄을 바꾸고, print는 줄을 바꾸지 않아요.
// 파일 이름: Greeting.java
public class Greeting {
public static void main(String[] args) {
// println: 출력한 뒤 줄바꿈
System.out.println("자바 강좌 1강");
System.out.println("첫 프로그램을 만들었어요.");
// print: 줄바꿈 없이 이어서 출력
System.out.print("A");
System.out.print("B");
System.out.println("C");
// 괄호를 비우면 빈 줄 하나를 출력
System.out.println();
System.out.println("끝");
}
}
javac Greeting.java
java Greeting
실행 결과:
자바 강좌 1강
첫 프로그램을 만들었어요.
ABC
끝
코드 해설
- 문장은 위에서 아래로 한 줄씩 순서대로 실행돼요.
print("A")와print("B")는 줄을 바꾸지 않아서, 뒤이은println("C")까지 한 줄에ABC로 이어져요. 줄바꿈은println이 실행된 뒤에 일어나요.System.out.println()처럼 괄호 안을 비우면 줄바꿈만 일어나서 빈 줄이 생겨요.
한글이 깨져 보인다면 터미널 인코딩 문제일 수 있어요. JDK 18부터는 소스 파일을 기본적으로 UTF-8로 읽으니 편집기에서 UTF-8로 저장하고, 윈도우 명령 프롬프트라면 chcp 65001 명령으로 콘솔을 UTF-8로 바꿔 보세요.
자주 하는 실수와 오류 메시지
처음에는 오류가 나는 게 정상이에요. 자바 컴파일러는 문제가 있는 파일 이름, 줄 번호, 원인을 알려 주니 메시지를 차분히 읽는 습관을 들이세요.
세미콜론 빠뜨리기
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!") // 세미콜론이 없어요
}
}
HelloWorld.java:3: error: ';' expected
System.out.println("Hello, World!") // 세미콜론이 없어요
^
1 error
HelloWorld.java:3은 3번째 줄이라는 뜻이고, ^ 표시가 문제 위치를 가리켜요. 문장 끝에 ;를 붙이면 해결돼요.
클래스 이름과 파일 이름이 다를 때
Hello.java 파일 안에 public class HelloWorld라고 쓰면 다음 오류가 나요.
Hello.java:1: error: class HelloWorld is public, should be declared in a file named HelloWorld.java
public class HelloWorld {
^
1 error
public 클래스 이름과 파일 이름은 대소문자까지 똑같아야 해요. 둘 중 하나를 맞춰 주세요.
대소문자 틀리기
자바는 대문자와 소문자를 구분해요. System을 system으로 쓰면 컴파일러가 전혀 다른 이름으로 인식합니다.
HelloWorld.java:3: error: package system does not exist
system.out.println("Hello, World!");
^
1 error
System, String처럼 자바가 제공하는 클래스 이름은 대문자로 시작한다는 점을 기억하세요.
실행할 때 .class를 붙이기
java HelloWorld.class
Error: Could not find or load main class HelloWorld.class
Caused by: java.lang.ClassNotFoundException: HelloWorld.class
java 명령에는 파일 이름이 아니라 클래스 이름을 줘야 해요. java HelloWorld로 실행하세요.
또한 .class 파일이 있는 폴더에서 실행해야 한다는 점도 주의하세요.
수정 후 다시 컴파일하지 않기
소스 코드를 고친 뒤 javac 없이 java HelloWorld만 실행하면, 예전에 만들어 둔 .class 파일이 실행돼서 바뀐 내용이 반영되지 않아요. 코드를 고쳤다면 컴파일부터 다시 하세요.
연습 문제
문제 1. 자기소개 출력하기
Intro.java 파일을 만들고, 다음 세 줄을 출력하는 프로그램을 작성하세요.
이름: 김자바
관심 분야: 백엔드 개발
목표: 45강 완주하기
문제 2. 출력 결과 예측하기
다음 코드를 실행하면 어떤 결과가 나올지 먼저 예측한 뒤, 직접 실행해서 확인해 보세요.
public class Predict {
public static void main(String[] args) {
System.out.print("Java");
System.out.println(" is");
System.out.print("fun");
System.out.println("!");
}
}
문제 3. 오류 고치기
다음 코드를 Fix.java로 저장하고 컴파일하면 오류가 납니다. 오류 두 곳을 찾아 고치세요.
public class Fix {
public static void main(String[] args) {
System.out.println("오류를 고쳤어요")
system.out.println("컴파일 성공!");
}
}
정답 예시
문제 1 정답
public class Intro {
public static void main(String[] args) {
// 한 줄에 하나씩 println으로 출력
System.out.println("이름: 김자바");
System.out.println("관심 분야: 백엔드 개발");
System.out.println("목표: 45강 완주하기");
}
}
실행 결과:
이름: 김자바
관심 분야: 백엔드 개발
목표: 45강 완주하기
문제 2 정답
실행 결과:
Java is
fun!
print("Java") 뒤에는 줄바꿈이 없어서 " is"가 같은 줄에 붙고, println이 실행된 뒤에 줄이 바뀌어요. 둘째 줄도 같은 원리로 fun!이 됩니다.
" is"의 앞 공백도 그대로 출력된다는 점에 주의하세요.
문제 3 정답
3번째 줄에는 세미콜론이 빠졌고, 4번째 줄은 System의 첫 글자가 소문자예요.
public class Fix {
public static void main(String[] args) {
System.out.println("오류를 고쳤어요"); // 세미콜론 추가
System.out.println("컴파일 성공!"); // system → System
}
}
실행 결과:
오류를 고쳤어요
컴파일 성공!
핵심 정리
- 자바는 플랫폼 독립성, 객체지향, 자동 메모리 관리가 특징인 범용 언어예요.
- 소스 코드(
.java)는javac로 컴파일되어 바이트코드(.class)가 되고, JVM이 이를 실행해요. 덕분에 한 번 컴파일하면 어느 운영체제에서나 실행돼요. - 개발하려면 JDK가 필요해요. JDK ⊃ JRE ⊃ JVM 관계로 이해하면 쉬워요. 학습용으로는 LTS 버전(현재 JDK 25)을 권장해요.
- 설치 후
java -version,javac -version으로 확인하고, 명령을 찾지 못하면 PATH와 JAVA_HOME을 점검하세요. - 컴파일은
javac 파일이름.java, 실행은java 클래스이름(확장자 없음)이에요. public클래스 이름은 파일 이름과 같아야 하고, 자바는 대소문자를 구분하며, 문장 끝에는 세미콜론을 붙여요.println은 출력 후 줄을 바꾸고,print는 줄을 바꾸지 않아요.
강좌 이어 보기
- 다음 강좌: 2강 개발 환경: IntelliJ IDEA (곧 올라옵니다)
- 자바 강좌 전체 목차 보기