TIL

자바 Class 객체란? 리플렉션(Reflection) 개념과 사용 이유

기억지기 개발자 2026. 6. 18. 12:47

리플렉션(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 직렬화/역직렬화 등

결국 리플렉션은 ‘실행 중에 클래스의 설계도를 꺼내서 분석하고 필요하면 직접 조작할 수 있게 해주는 기능’ 정도로 이해해 두면 될 것 같다.