공공부하자개발 · 영어 학습 노트
자바
초급자바의 뼈대0/8 완료
  • 00개발 환경과 첫 프로그램
  • 01변수, 데이터 타입, 형변환
  • 02연산자와 제어문
  • 031차원 · 2차원 배열
  • 04클래스, 객체, 생성자, 오버로딩
  • 05접근 제어자와 캡슐화
  • 06메서드 활용 패턴 (초급)
  • 07enum, 패키지와 import, static 과 final
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 초급 › 00 / 8

개발 환경과 첫 프로그램

섹션 7진행 0 / 8
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

2. 핵심 원리

2.1 JDK, JRE, JVM — 세 글자의 차이

자바를 설치하려고 검색하면 JDK, JRE, JVM이라는 비슷한 약어가 튀어나옵니다. 세 가지는 포함 관계입니다.

이름 풀이 역할 누가 필요한가
JVM (Java Virtual Machine) 자바 가상 머신 컴파일된 바이트코드(.class)를 읽어서 실제 CPU 명령으로 바꿔 실행하는 프로그램 자바 프로그램을 실행하는 모든 컴퓨터
JRE (Java Runtime Environment) 자바 실행 환경 JVM + 표준 라이브러리(String, System.out 등 기본 클래스 묶음) 실행만 하는 사용자
JDK (Java Development Kit) 자바 개발 도구 JRE + 컴파일러(javac) + 디버거 + 각종 도구 코드를 작성하는 개발자

즉 개발자는 무조건 JDK를 설치해야 합니다. JDK 안에 JRE와 JVM이 들어 있습니다.

2.2 왜 자바는 "컴파일 후 실행"인가 — Write Once, Run Anywhere

C 언어는 소스 코드를 컴파일하면 특정 CPU와 운영체제 전용 실행 파일(.exe 등)이 나옵니다. 윈도우에서 컴파일한 프로그램은 맥에서 실행되지 않습니다.

자바는 중간 단계를 하나 둡니다.

text
Hello.java  --(javac 컴파일)-->  Hello.class  --(java 실행)-->  화면 출력
 사람이 쓴 코드                   바이트코드(bytecode)             JVM이 해석

바이트코드(bytecode)는 특정 CPU용 명령이 아니라 "JVM이라는 가상의 컴퓨터"용 명령입니다. 그래서 윈도우용 JVM, 맥용 JVM, 리눅스용 JVM만 각각 설치되어 있으면 같은 .class 파일이 어디서든 똑같이 실행됩니다. 이것이 자바의 유명한 슬로건 "Write Once, Run Anywhere(한 번 작성하면 어디서든 실행)"의 정체입니다.

초보자가 기억할 것은 두 가지입니다.

  1. javac(컴파일러)는 .java → .class를 만든다.
  2. java(실행기)는 .class를 JVM 위에서 실행한다.

2.3 JDK 21을 선택하는 이유

자바는 6개월마다 새 버전이 나오지만, 실무에서는 LTS(Long Term Support, 장기 지원) 버전만 씁니다. 8, 11, 17, 21이 LTS이고 이 중 21은 2023년 9월에 나와 최소 2031년까지 지원됩니다.

버전 출시 특징
8 2014 람다, 스트림 도입. 아직도 레거시 시스템에 많음
11 2018 var, HTTP 클라이언트
17 2021 sealed 클래스, record 정식
21 2023 switch 패턴 매칭, 가상 스레드, 순차 컬렉션

이 커리큘럼은 JDK 21 기준입니다. 21에서 배운 문법은 17 이하에서 일부 동작하지 않을 수 있으니 버전을 꼭 확인하세요.

2.4 설치와 확인

Windows — Adoptium Temurin 21 또는 Microsoft Build of OpenJDK를 받아 설치합니다. 설치 마법사에서 "Set JAVA_HOME variable"과 "Add to PATH" 옵션을 반드시 체크합니다.

macOS — 터미널에서 brew install openjdk@21 후 안내되는 심볼릭 링크 명령을 실행합니다.

설치 후 새 터미널을 열고 다음을 입력합니다.

text
java -version
javac -version

둘 다 21.x.x로 시작하는 결과가 나오면 성공입니다. 여기서 흔한 문제 두 가지입니다.

증상 원인 해결
'javac'은(는) 내부 또는 외부 명령... 아닙니다 PATH 에 JDK 의 bin 폴더가 없음 환경 변수 PATH 에 ...\jdk-21...\bin 추가 후 터미널 재시작
java -version은 되는데 javac는 안 됨 JDK가 아닌 JRE만 설치됨 JDK 다시 설치
버전이 8이나 11로 나옴 옛 JDK가 PATH 앞에 있음 PATH에서 옛 경로를 삭제하거나 21 경로를 위로 올림

PATH란 "명령어를 입력했을 때 운영체제가 실행 파일을 찾아보는 폴더 목록"입니다. javac를 치면 운영체제는 PATH의 폴더들을 앞에서부터 뒤지며 javac.exe를 찾습니다. 없으면 위와 같은 오류가 납니다.

2.5 첫 프로그램의 해부

java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, Java");
    }
}

이 다섯 줄에는 앞으로 배울 개념이 압축되어 있습니다. 지금은 각 단어가 왜 거기 있는지만 이해하면 됩니다.

조각 의미 왜 필요한가
public class Hello Hello라는 이름의 클래스(class, 코드를 담는 상자) 선언 자바의 모든 코드는 반드시 어떤 클래스 안에 있어야 함
public 어디서든 접근 가능 JVM이 밖에서 이 클래스를 찾아 실행해야 하므로
static 객체를 만들지 않아도 호출 가능 프로그램 시작 시점엔 아직 아무 객체도 없음. JVM은 객체 없이 바로 부를 수 있는 메서드가 필요
void 반환값 없음 main은 결과를 누구에게 돌려줄 필요가 없음
main JVM이 찾는 약속된 이름 java Hello를 치면 JVM은 Hello 클래스에서 정확히 이 시그니처의 메서드를 찾음
String[] args 실행 시 넘겨준 문자열 배열 java Hello a b 처럼 명령줄 인자를 받기 위해
System.out.println(...) 표준 출력(화면)에 한 줄 출력 System 클래스의 out 필드가 가진 println 메서드

main 메서드의 시그니처는 한 글자도 바꿀 수 없습니다. public static void main(String[] args) 에서 static을 빼거나 String[]를 int[]로 바꾸면 컴파일은 되지만 실행 시 "main 메서드를 찾을 수 없습니다"가 뜹니다. JVM은 정확히 이 형태만 진입점(entry point, 프로그램이 시작되는 지점)으로 인정합니다.

2.6 파일 이름 = 클래스 이름 규칙

자바에는 다른 언어에 없는 엄격한 규칙이 있습니다.

public 클래스의 이름은 파일 이름과 대소문자까지 정확히 같아야 한다.

public class Hello는 반드시 Hello.java에 있어야 합니다. hello.java나 Main.java에 넣으면 컴파일 오류가 납니다.

왜 이런 규칙이 있을까요? 컴파일러와 JVM이 클래스 이름만으로 파일을 찾기 때문입니다. java Hello를 치면 JVM은 "Hello.class 파일을 찾아라"로 해석합니다. 파일 이름과 클래스 이름이 다르면 이 매핑이 깨집니다. 규칙을 강제하면 수천 개 클래스가 있어도 이름만으로 즉시 파일 위치를 알 수 있습니다.

추가 규칙들:

규칙 설명
한 파일에 public 클래스는 최대 1개 파일 이름이 하나이므로
public이 아닌 클래스는 여러 개 가능 각각 별도 .class 파일로 컴파일됨
클래스 이름은 대문자로 시작(PascalCase) 관례. orderService가 아니라 OrderService
확장자는 소문자 .java .Java, .JAVA 불가

2.7 패키지 — 폴더로 이름 충돌 막기

프로젝트가 커지면 User라는 클래스가 두 개 필요할 수 있습니다(회원 User, 관리자 User). 자바는 패키지(package, 클래스를 묶는 이름 공간이자 폴더 구조)로 이를 해결합니다.

java
package com.shop.member;   // 이 파일은 com/shop/member/ 폴더에 있어야 함

public class User { ... }

패키지 이름은 실제 폴더 구조와 일치해야 합니다. package com.shop.member;를 선언한 파일은 com/shop/member/User.java 경로에 있어야 하고, 컴파일하면 com/shop/member/User.class가 만들어지며, 실행할 때는 완전한 이름을 써야 합니다.

text
javac -d out com/shop/member/User.java
java -cp out com.shop.member.User

-d out은 컴파일 결과를 out 폴더에 넣으라는 뜻, -cp out(classpath)은 클래스를 out 폴더에서 찾으라는 뜻입니다.

이 커리큘럼의 실습 코드는 패키지 선언 없이 작성합니다. 초보 단계에서는 폴더 하나에 파일을 모아 두고 javac *.java && java Main으로 바로 실행하는 것이 학습에 집중하기 좋습니다. 패키지는 05 레슨에서 다시 다룹니다.

패키지 이름 관례:

관례 예시 이유
모두 소문자 com.shop.order 클래스 이름(대문자 시작)과 구분
도메인 역순 kr.co.company.project 전 세계 고유성 보장
계층은 점으로 구분 com.shop.order.service 폴더 구조와 1:1

2.8 VSCode에서 실행하기

  1. VSCode를 설치하고 확장(Extensions) 탭에서 "Extension Pack for Java"(Microsoft)를 설치합니다. 이 팩에 언어 서버, 디버거, 테스트 러너가 모두 들어 있습니다.
  2. 폴더를 엽니다(File → Open Folder). 단일 파일이 아니라 폴더를 열어야 확장이 제대로 동작합니다.
  3. Hello.java를 만들고 위 코드를 붙여 넣습니다.
  4. main 메서드 위에 나타나는 Run | Debug 링크를 클릭하거나, 파일에서 우클릭 → "Run Java"를 선택합니다.
  5. 하단 터미널 패널에 출력이 나타납니다.

VSCode가 자동으로 javac와 java를 호출해 줍니다. 하지만 처음 몇 번은 터미널에서 직접 명령을 쳐 보길 권합니다. IDE가 대신해 주는 일이 무엇인지 알아야 오류가 났을 때 원인을 찾을 수 있습니다.

VSCode 터미널은 Ctrl + ` (백틱)으로 엽니다. 거기서:

text
javac Hello.java
java Hello

첫 줄이 조용히 끝나면(아무 출력 없음) 컴파일 성공입니다. 같은 폴더에 Hello.class가 생겼는지 확인해 보세요.

2.9 컴파일 오류 vs 런타임 오류

자바 오류는 크게 두 시점에 발생합니다.

구분 발생 시점 예시 특징
컴파일 오류(compile error) javac 실행 중 세미콜론 누락, 타입 불일치, 선언 안 된 변수 .class가 만들어지지 않음. 실행 자체 불가
런타임 오류(runtime error) java 실행 중 0으로 나누기, 배열 범위 초과, null 참조 컴파일은 통과했지만 실행 중 프로그램이 죽음

컴파일 오류는 친절합니다. 파일 이름, 줄 번호, 원인을 알려 줍니다.

text
Hello.java:3: error: ';' expected
        System.out.println("Hello, Java")
                                         ^
1 error

Hello.java의 3번째 줄, ;가 필요하다, 화살표 위치. 이렇게 읽으면 됩니다. 오류 메시지를 읽지 않고 코드를 다시 쓰는 습관은 지금 버리세요.

핵심 원리
  • 2.1 JDK, JRE, JVM — 세 글자의 차이
  • 2.2 왜 자바는 "컴파일 후 실행"인가 — Write Once, Run Anywhere
  • 2.3 JDK 21을 선택하는 이유
  • 2.4 설치와 확인
  • 2.5 첫 프로그램의 해부
  • 2.6 파일 이름 = 클래스 이름 규칙
  • 2.7 패키지 — 폴더로 이름 충돌 막기
  • 2.8 VSCode에서 실행하기
  • 2.9 컴파일 오류 vs 런타임 오류
이전 섹션1 왜 배우는가2 / 7다음 섹션3 코드 예제