Programming/For interview

[Java] 컴파일 시점과 런타임 시점의 차이

LazyCat 2025. 1. 19. 15:00
반응형

DI 컨테이너가 리플렉션을 사용하여 동작하는 원리에 대해 읽다가,

문득 컴파일 시점과 런타임 시점이 나뉜 이유가 궁금해졌다. 

근본적으로 컴파일/런타임을 이해하지 못해서 리플렉션도 잘 이해하지 못하고 있는 것 같아서

두 개의 차이를 알아보고자 한다.

1. Complie과 Runtime

컴파일 시점 (Compile-Time)

  • 코드가 작성된 후, 컴파일러에 의해 바이트코드로 변환되는 시점이다.
  • 주요 작업:
    1. 문법 오류 체크.
    2. 타입 검증 (예: 변수 타입과 메서드 호출이 올바른지 확인).
    3. 클래스 파일(.class) 생성.
  • 결과물: JVM이 실행할 수 있는 바이트코드(.class 파일)가 생성된다.

런타임 시점 (Runtime)

  • 컴파일된 바이트코드를 JVM이 실행하는 시점이다.
  • 주요 작업:
    1. JVM이 클래스 로더(ClassLoader)를 통해 필요한 클래스 파일을 로드.
    2. JVM 메모리에 클래스 정보를 저장(Metaspace 등).
    3. 프로그램이 실제로 동작(메서드 실행, 객체 생성 등)

 

2. 컴파일 시점에 클래스 정보를 읽을 수 없는 이유

1) 컴파일 시점에는 클래스가 "정적인 정보"만 다룰 수 있음

컴파일러는 소스코드를 읽고 타입과 문법을 체크할 뿐, 클래스의 런타임 동작을 다룰 수 없다.

  • 다음 코드에서 컴파일러는 MyClass의 구조만 알고 있을 뿐, 런타임에 어떤 객체가 생성되는지는 알 수 없다.
Class<?> clazz = Class.forName("com.example.MyClass");

2) 런타임에 동적으로 생성되는 정보는 컴파일 시점에 알 수 없음

  • 컴파일 시점에서는 코드가 정적으로 작성된 상태만 확인 가능합니다.
  • 반면, 런타임에서는 프로그램이 동작하며 동적으로 결정되는 정보를 알 수 있습니다:
  • 예: 클래스 이름이 문자열로 동적으로 제공되는 경우:
String className = getClassNameFromUserInput(); // 사용자 입력
Class<?> clazz = Class.forName(className); // 런타임에 클래스 결정

3) JVM의 클래스 로드 시점

  • 클래스는 컴파일 시점에 메모리에 올라가는 것이 아니라, 런타임에 필요할 때 로드됩니다.
  • 이는 JVM이 메모리를 효율적으로 사용하고, 동적 로딩(Dynamic Loading)을 지원하기 위함입니다.

 

 

 

 

대략적으로 컴파일과 런타임의 개념은 이렇다. 리플렉션이 DI컨테이너에서 실제 동작되는 과정은 다음편에 적어보겠다.

반응형