리플렉션이란
- 구체적인 클래스 몰라도, 런타임에 클래스의 정보(메서드, 필드, 생성자)를 읽고 조작할 수 있게 해주는 기능
- 즉, 런타임에 타입을 동적으로 결정하고 사용할 수 있다.
비유하자면, 리플렉션은 문을 모르고 열쇠도 없이 방 안을 들여다보고, 안에 있는 물건도 만질 수 있는 기술이다
(보통 코드는 미리 문과 열쇠를 알아야 하지만, 리플렉션은 모른 채로 작동 가능)
리플렉션이 필요한 이유
프로그램 실행 중 어떤 클래스를 사용할지 모르는 경우
- Spring DI 컨테이너, ORM 매핑(JPA) 같은 시스템이 필요
- 유연하고 확장 가능한 구조를 만들기 위해
어디서 Class 객체를 얻을까
Class.forName("클래스명")
호출 시 ClassLoader가 해당 클래스를 JVM 메모리 안에서 찾는다.- 메모리에 없다면. class 파일을 찾아 로드한다.
- 이미 메모리에 있으면 재로딩하지 않고 바로 Class 객체를 반환한다.
클래스 로딩 시점은 언제
단계 | 설명 | 클래스 로딩 여부 |
---|---|---|
컴파일 | .java → .class 파일 변환 | ❌ (메모리 안 올림) |
빌드 | 여러 class 파일을 묶어서 jar, war 파일 생성 | ❌ |
실행(런타임) | JVM이 프로그램을 실행하며 클래스 로드 | ✅ (필요할 때 메모리에 로드) |
- 컴파일/빌드: 디스크에 파일만 만든다.
- 런타임(실행 시점): JVM이 필요할 때마다 ClassLoader가 클래스를 메모리에 올린다.
- 사용하지 않는 클래스는 끝까지 로딩되지 않을 수도 있다.
요약
리플렉션은 런타임에 ClassLoader로 로드된 Class 객체를 통해, 코드에 명시하지 않은 타입도 동적으로 조작할 수 있게 해주는 기술이다.
'Programming' 카테고리의 다른 글
macOS에서 Harbor 레지스트리 인증서 설정하기 (0) | 2025.04.10 |
---|---|
우분투 Harbor HTTPS 설정을 위한 인증서 생성 (0) | 2025.04.10 |
Layered Architecture (0) | 2025.01.07 |