Study · JDK · STEP 2 / 8 · 컴파일할 때

javac는 글자를 나무로 바꾸고, 나무를 다듬어 바이트로 쓴다

장면

javac Hello.java를 쳤다. 에러가 없으면 아무 말 없이 Hello.class가 생긴다. 그 사이 javac 안에서는 무슨 일이 있었을까?

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

아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 방금 바뀐 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다.

장면 · .java가 .class가 되기까지 0 / 10

javac Hello.java를 쳤다. ▶를 누르면 이 5줄이 javac 안에서 어떤 모양으로 바뀌어 가는지 한 단계씩 본다.

키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음

어느 println을 부를지는 실행할 때가 아니라 컴파일할 때(attribute 단계) 이미 정해진다. generate 단계는 그 결정을 바이트로 옮길 뿐이다.

어떻게 확인했나

  • 토큰 · 나무 · 해석 결과는 javac 21 안의 부품을 직접 부르는 작은 Java 프로그램으로 꺼냈다.
  • println 후보 10개는 javap java.io.PrintStream으로 확인했다.
  • 줄 번호는 저장소의 JDK 27 소스(jdk.compiler) 기준이다.