Programming

Reflection

사랑우주인 2025. 4. 28. 01:01

리플렉션이란

  • 구체적인 클래스 몰라도, 런타임에 클래스의 정보(메서드, 필드, 생성자)를 읽고 조작할 수 있게 해주는 기능
  • 즉, 런타임에 타입을 동적으로 결정하고 사용할 수 있다.

비유하자면, 리플렉션은 문을 모르고 열쇠도 없이 방 안을 들여다보고, 안에 있는 물건도 만질 수 있는 기술이다
(보통 코드는 미리 문과 열쇠를 알아야 하지만, 리플렉션은 모른 채로 작동 가능)

리플렉션이 필요한 이유

프로그램 실행 중 어떤 클래스를 사용할지 모르는 경우

  • Spring DI 컨테이너, ORM 매핑(JPA) 같은 시스템이 필요
  • 유연하고 확장 가능한 구조를 만들기 위해

어디서 Class 객체를 얻을까

  • Class.forName("클래스명") 호출 시 ClassLoader가 해당 클래스를 JVM 메모리 안에서 찾는다.
  • 메모리에 없다면. class 파일을 찾아 로드한다.
  • 이미 메모리에 있으면 재로딩하지 않고 바로 Class 객체를 반환한다.

클래스 로딩 시점은 언제

단계 설명 클래스 로딩 여부
컴파일 .java → .class 파일 변환 ❌ (메모리 안 올림)
빌드 여러 class 파일을 묶어서 jar, war 파일 생성
실행(런타임) JVM이 프로그램을 실행하며 클래스 로드 ✅ (필요할 때 메모리에 로드)
  • 컴파일/빌드: 디스크에 파일만 만든다.
  • 런타임(실행 시점): JVM이 필요할 때마다 ClassLoader가 클래스를 메모리에 올린다.
  • 사용하지 않는 클래스는 끝까지 로딩되지 않을 수도 있다.

요약

리플렉션은 런타임에 ClassLoader로 로드된 Class 객체를 통해, 코드에 명시하지 않은 타입도 동적으로 조작할 수 있게 해주는 기술이다.