[Java 캡슐화] 클래스로더와 리플렉션 API의 완벽한 이해
JVM의 클래스 로딩 메커니즘과 리플렉션 API의 특징, 활용 사례를 설명하는 기술 문서입니다.
클래스 로더와 Class 객체
Class 객체의 생성 원리
클래스 로더는 defineClass 메소드 중 하나를 통해 바이트코드를 JVM에 전달하며, 이 과정에서 Class 객체가 자동 생성 된다.
JVM 클래스 로딩 프로세스
💡 3단계 프로세스
-
Loading: JVM 메모리로 클래스 파일 로드
-
Linking: 클래스 파일 검증 및 준비
-
Initialization: 클래스 변수 초기화
⚡ 동적 로딩의 특징
메모리 효율을 위해 필요한 시점에 클래스를 동적으로 로드
Reflection API
리플렉션이란 힙 영역에 자동으로 로드된 class 타입의 객체를 통해(앞에서 설명한 자동 Class 객체 생성 효과),
원하는 클래스의 인스턴스를 생성할 수 있도록 지원하고,
인스턴스의 필드와 메소드를 접근 제어자(ex:private)와 상관 없이 사용할 수 있도록 지원하는 API
일반적인 리플렉션 사용?
// 리플렉션 사용 예시
Class<?> clazz = Class.forName("com.example.MyClass");
Constructor<?> constructor = clazz.getDeclaredConstructor();
Object instance = constructor.newInstance();
장단점 분석 🔍
구분 | 내용 |
---|---|
장점 | 런타임 동적 조작, 높은 유연성 |
단점 | 캡슐화 위반(접근 제어자 무시), 성능 저하 |
실무 활용 사례
@Service
public class UserService {
// 스프링이 리플렉션으로 자동 주입
@Autowired
private UserRepository repository;
}
리플렉션은 프레임워크 개발에서 필수적인 도구이지만, 일반 애플리케이션 개발에서는 인캡슐 방해하는 단점을 고려하여 신중하게 사용해야 합니다.
댓글남기기