리플렉션(Reflection)과 Class 객체
리플렉션을 처음 봤을 때 가장 헷갈렸던 부분은 Class 객체였다.
Class<?> cls = Person.class;
처음에는 이 코드가 Person 객체를 생성하는 코드인 줄 알았다. 그런데 아니다.
Person p = new Person();
이건 Person 객체를 생성하는 코드이고,
Class<?> cls = Person.class;
이건 Person 클래스 자체의 정보를 담고 있는 Class 객체를 얻는 코드이다.
쉽게 말하면,
Person 객체
= 실제 집
Class 객체
= 집의 설계도
정도로 생각하면 이해하기 편하다.
Class 객체에는 무엇이 들어 있을까?
Class 객체는 클래스의 메타데이터(클래스에 대한 정보)를 가지고 있다.
예를 들어 다음과 같은 정보를 얻을 수 있다.
- 클래스 이름
- 부모 클래스
- 생성자 목록
- 메서드 목록
- 필드 목록
- 인터페이스 정보
예시:
Class<?> cls = Person.class;
cls.getName();
cls.getSuperclass();
cls.getDeclaredConstructors();
cls.getDeclaredMethods();
즉, Class 객체를 통해 실행 중인 클래스의 구조를 들여다볼 수 있다.
리플렉션(Reflection)이란?
리플렉션은 실행 중에 Class 객체를 이용해서 클래스 정보를 조사하거나, 객체를 생성하고 메서드를 호출할 수 있게 해주는 기능이다.
예를 들어,
Class<?> cls = Person.class;
Constructor<?> constructor =
cls.getConstructor();
Object obj =
constructor.newInstance();
는 사실상
new Person();
과 비슷한 동작을 한다.
또,
Method method =
cls.getMethod("sayHello");
method.invoke(obj);
는
obj.sayHello();
와 거의 같은 의미이다.
즉, 평소에는 컴파일 시점에 무엇을 사용할지 정해 놓고 코드를 작성한다면,
리플렉션은 실행 중에 “이 클래스에는 어떤 메서드가 있지?”, “생성자는 뭐가 있지?”, “필드는 어떻게 생겼지?”
와 같은 작업을 가능하게 해주는 기능이라고 이해하면 된다.
그런데 왜 이런 기능이 필요할까?
처음에는 ’그냥 new 해서 사용하면 되지 않나?’라는 생각이 들었다.
그런데 프레임워크 입장에서는 어떤 클래스를 생성해야 하는지 미리 알 수 없는 경우가 많다.
예를 들어 스프링에서는
@Controller
public class UserController {
}
라고만 작성해도 객체가 생성된다.
내가 직접
new UserController();
를 호출한 적은 없다.
스프링이 프로젝트를 실행하면서 클래스들을 조사하고, @Controller가 붙은 클래스를 발견하면 리플렉션을 이용해서 객체를 생성하기 때문이다.
@Service, @Repository, @Autowired, @Entity 등도 비슷한 원리로 동작한다.
정리
- Class 객체 : 클래스 자체의 정보를 담고 있는 객체
- 리플렉션 : Class 객체를 이용해 실행 중에 클래스 정보를 조사하고 객체 생성이나 메서드 호출까지 수행하는 기능
- 활용 예시 : Spring IoC, DI, JPA, JSON 직렬화/역직렬화 등
결국 리플렉션은 ‘실행 중에 클래스의 설계도를 꺼내서 분석하고 필요하면 직접 조작할 수 있게 해주는 기능’ 정도로 이해해 두면 될 것 같다.
'TIL' 카테고리의 다른 글
| [TIL] 객체지향은 ‘생성’과 ‘사용’의 책임을 분리하는 것에서 시작 (0) | 2026.06.22 |
|---|---|
| 자바 instanceof 쉽게 이해하기 : 타입 검사보다 중요한 진짜 사용 목적 (0) | 2026.06.19 |
| 자바 프로그램은 어떻게 실행될까? - JRE, JVM, main() 메서드가 실행되기까지 (0) | 2026.06.17 |
| 객체와 메모리, 메서드 개념 확인 (0) | 2026.06.16 |
| 왜 equals()와 hashCode()를 함께 재정의해야 할까? (0) | 2026.06.15 |