본문 바로가기
소프트웨어공학/OOP

[OOP] 리플렉션(reflection)

by 클레어몬트 2024. 8. 23.

ㅇ리플렉션(reflection): OOP에서 런타임에 프로그램의 구조를 검사하고 조작할 수 있는 메커니즘

프로그램이 실행 중에 자신에 대한 정보를 탐색하거나, 구조를 동적으로 변경할 수 있다. 예를 들어, 클래스의 메타 정보를 기반으로 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고, 이들을 통해 객체 인스턴스를 생성하거나 메서드를 호출하는 작업을 할 수 있다. 이런 작업을 리플렉션이라 한다. 또 추가로 애노테이션 정보를 읽어서 특별한 기능을 수행할 수도 있다. 최신 프레임워크들은 이런 기능을 적극 활용한다.

 

※ reflection은 자아성찰이라는 뜻을 갖고 있다

 

리플렉션의 기본 개념

  1. 메타데이터 접근: 리플렉션을 사용하면 클래스, 인터페이스, 메서드, 필드 등의 메타데이터(데이터에 대한 데이터)에 접근할 수 있다. 예를 들어, 어떤 클래스가 어떤 메서드와 필드를 가지고 있는지, 어떤 애노테이션이 적용되어 있는지를 알 수 있다.
  2. 동적 조작: 리플렉션을 통해 프로그램은 런타임에 클래스의 인스턴스를 생성하고, 메서드를 호출하며, 필드의 값을 읽거나 쓸 수 있다. 이는 컴파일 타임이 아닌 런타임에 이루어지기 때문에 동적인 프로그램을 작성할 수가 있다.

 

리플렉션의 주요 기능

https://claremont.tistory.com/entry/Java-API-Class-%ED%81%B4%EB%9E%98%EC%8A%A4

 

[Java API] Class 클래스

ㅇClass 클래스: Java Reflection API의 중요한 부분으로, JVM에서 클래스, 인터페이스, 배열 등의 메타데이터를 표현하는 역할Class 객체는 Java의 모든 클래스와 인터페이스에 대해 자동으로 생성되며,

claremont.tistory.com

주요 기능은 위의 글을 참고하면 된다

 

리플렉션의 사용 사례

  1. 프레임워크 및 라이브러리:
    • 리플렉션은 많은 프레임워크에서 핵심적인 역할을 한다. 예를 들어, Java의 Spring 프레임워크는 리플렉션을 사용하여 의존성 주입(DI)을 수행하고, 애노테이션을 처리하며, 동적으로 프록시를 생성한다.
  2. 테스트 도구:
    • JUnit과 같은 테스트 프레임워크는 리플렉션을 사용하여 테스트 메서드를 자동으로 발견하고 실행한다. 사용자는 특별한 설정 없이도 테스트 메서드에 대해 다양한 검증 작업을 수행할 수 있다.
  3. 동적 프로그래밍:
    • 리플렉션을 통해 런타임에 프로그램의 동작을 결정할 수 있다. 예를 들어, 사용자가 입력한 클래스 이름에 따라 객체를 생성하고, 해당 객체의 메서드를 호출하는 동적 시스템을 만들 수 있다.

 

리플렉션의 장단점

  • 장점:
    • 유연성: 코드가 런타임에 자신의 구조를 탐색하고, 동적으로 행동을 변경할 수 있어 매우 유연한 프로그래밍이 가능
    • 재사용성: 하나의 리플렉션 코드를 다양한 클래스에 적용할 수 있어 코드 재사용성을 높임
  • 단점:
    • 성능 저하: 리플렉션을 사용하는 코드는 일반적인 메서드 호출보다 느리다. 런타임에 메서드나 필드를 찾고, 접근 제어를 우회하는 등의 작업이 추가로 발생하기 때문
    • 보안 위험: 비공개 멤버에 접근할 수 있기 때문에, 잘못 사용하면 보안 문제가 발생할 수 있다. 예를 들어, 중요한 정보를 우회하여 접근할 수 있게 된다.
    • 컴파일 타임 검사 부족: 리플렉션을 사용하면 컴파일 시점에 타입 안전성을 검사할 수 없다. 따라서 런타임 오류가 발생할 가능성이 높아진다.