본문으로 건너뛰기
안동민 개발노트 아이콘

안동민 개발노트

본문 시작
1장 : Java 설치와 첫 프로그램

소스·컴파일러·JVM

성공한 Hello 프로그램을 기준으로 .java, javac, .class, java, JVM의 역할을 구분합니다.

앞 문서에서 한 명령은 파일을 만들고 다른 명령은 그 결과를 실행했습니다.

이제 이미 성공한 Hello 프로그램을 기준으로 각 도구가 무엇을 입력받고 무엇을 만드는지 정리합니다.


.java에서 화면 출력까지

전체 흐름은 네 단계입니다.

  1. 사람이 src/Hello.java를 작성합니다.
  2. javac가 문법과 이름을 검사하고 out/Hello.class를 만듭니다.
  3. java 실행기가 out에서 Hello 클래스를 찾습니다.
  4. JVM이 main부터 명령을 실행해 문자열을 출력합니다.

javacjava는 이름이 비슷하지만 역할이 다릅니다.

명령입력결과
javac -d out src/Hello.javaJava 소스 파일Hello.class 생성 또는 컴파일 오류
java -cp out Hello클래스 이름과 탐색 폴더JVM 실행 또는 실행 오류

소스를 저장했다고 .class가 자동으로 갱신되지는 않습니다.

javac가 성공해야 새 실행 파일이 만들어집니다.


JDK와 JVM

JDK는 프로그램을 개발하는 도구 묶음입니다.

컴파일러 javac, 실행기 java, 표준 라이브러리와 여러 진단 도구가 들어 있습니다.

JVM(Java Virtual Machine)은 .class의 명령을 현재 운영체제와 CPU에서 실행하는 환경입니다.

java 명령이 JVM을 시작하고 실행할 클래스를 전달합니다.

JDK
├─ javac : 소스 컴파일
├─ java  : JVM 시작
└─ 표준 라이브러리
      └─ System.out.println 같은 기능

JDK 배포판이 달라도 같은 Java 규격과 기능 버전을 구현하면 기본 언어 문법과 표준 API의 계약은 같습니다.

배포판별 지원 정책과 진단 옵션의 차이는 운영 단계에서 살펴봅니다.


클래스 경로의 가장 작은 의미

다음 명령을 다시 봅니다.

java -cp out Hello

-cp--class-path의 짧은 형태입니다.

여기서는 클래스 파일을 찾기 시작할 폴더라고 이해하면 됩니다.

JVM은 out 아래에서 Hello.class를 찾습니다.

다음 명령은 서로 다릅니다.

java -cp out Hello          # 올바름
java Hello                  # 현재 폴더에서 찾아 실패할 수 있음
java -cp out Hello.class    # 클래스 이름에 확장자를 붙여 잘못됨

패키지와 여러 라이브러리가 생기면 클래스 경로가 더 중요해집니다.

지금은 src에는 소스, out에는 컴파일 결과라는 한 가지 구조만 사용합니다.


한 번에 다시 만들기

결과 폴더는 소스에서 다시 만들 수 있어야 합니다.

컴파일 결과가 오래됐다고 의심되면 out을 비우고 다시 컴파일합니다.

Remove-Item -Recurse -Force out -ErrorAction SilentlyContinue
New-Item -ItemType Directory out | Out-Null
javac -d out src/Hello.java src/AboutMe.java
Get-ChildItem out
AboutMe.class
Hello.class

두 소스를 함께 넘겨도 각각의 .class가 생성됩니다.

소스 파일이 늘어나면 빌드 도구가 이 목록과 라이브러리 경로를 관리합니다.

빌드 도구는 뒤에서 다루고, 지금은 명령의 입력과 출력을 직접 확인합니다.


Java의 이식성이 뜻하는 것

같은 .class를 Windows용 JVM과 macOS·Linux용 JVM이 각 환경에서 실행할 수 있습니다.

이것이 Java 이식성의 핵심입니다.

운영체제 차이가 모두 사라진다는 뜻은 아닙니다.

  • 파일 경로는 운영체제마다 표현이 다를 수 있습니다.
  • 텍스트 파일은 문자 인코딩을 정해야 합니다.
  • 네트워크와 파일 권한은 실행 환경의 영향을 받습니다.

이 문제를 지금 코드로 해결하려 하면 아직 배우지 않은 파일·문자 API가 한꺼번에 등장합니다.

문자와 바이트는 ch23, 파일 경로는 ch24, JVM 진단 도구는 ch38에서 각각 충분히 다룹니다.


연습 문제

다음 항목을 소스 작성, 컴파일, 실행 중 하나로 분류하세요.

  1. Hello.java의 문자열을 고친다.
  2. 세미콜론이 빠졌다는 오류를 발견한다.
  3. Hello.classout에 만든다.
  4. JVM이 main을 시작한다.
  5. 화면에 Hello, Java!가 나타난다.

정답은 1이 소스 작성, 2와 3이 컴파일, 4와 5가 실행 단계입니다.