[Java] 리플렉션(Reflection) 이란?

2021. 3. 10. 17:47Java

리플렉션의 개념을 알아보자.

 

리플렉션은 투영, 반사라는 사전적 의미를 갖고 있으며, 프로그래밍적 의미는 다음과 같다.

 

- 객체를 통해 클래스의 정보를 분석해 내는 기법

- 구체적인 Class Type을 알지 못해도, 그 Class의 생성자/메서드/변수에 접근할 수 있는 자바 API

 

말이 어렵고 햇갈리다. 차근차근 중요한 개념부터 파악해보면 먼저 구체적이지 않다고 했다.

 

아래 코드를 보면

Object dog = new Dog();

Object 타입의 dog 객체가 선언되었고, 이 객체는 Dog Class의 인스턴스이다.

인스턴스도 생성하였고, 이제 dog 객체를 사용해보자 !

 

Object dog = new Dog();

dog.		// 어떻게 사용하라는건지 ???

현재 우리는 Dog Class에 무슨 메서드/변수 가 포함되어 있는지 알 수 있는가? 알 수 없다.

그러면 사용 불가능하다는 걸 알 수 있다.

하지만... 분석하면 사용할 수 있다.

......

 

다시 말해 사용될 클래스가 어떤 타입인지 모르지만, 코드를 일단 작성하고 실행 시점에 확인하여 활용하면 된다.

 

다시 한번 Reflection의 개념을 보자.

 

실행 시간(Run Time)에 동적으로 특정 클래스의 정보를 분석 및 추출해낼 수 있는 프로그래밍 기법

 

참고로 자바 클래스 파일은 바이트 코드로 컴파일되어 Static 영역에 위치하게 된다. 때문에 클래스 이름만 알고 있다면, 언제든 이 영역을 뒤져서 클래스에 대한 정보를 가져올 수 있는 것이다.

 

 

이 말은 해당 클래스에 무슨 변수가 있고 무슨 메서드가 존재하는지 알 수 있다는 말이다.

 

그러면 이제 위에서의 질문에 대한 답이 변했을 거라 믿는다.

 

현재 우리는 Dog Class에 무슨 메서드/변수 가 포함되어 있는지 알 수 있는가? 알 수 있다.

그러면 사용 가능하다는 걸 알 수 있다.

 

정리하면 "Reflection 은 런타임에 동적으로 클래스를 분석하여 활용하는 프로그래밍 기법"

 

참고로, 컴파일 언어인 Java는 원래 동적으로 객체를 생성하는 기술이 없고 동적으로 인스턴스를 생성하는 Reflection으로 그 역할을 대신하게 되었다.