ㅇ리플렉션(reflection): OOP에서 런타임에 프로그램의 구조를 검사하고 조작할 수 있는 메커니즘
프로그램이 실행 중에 자신에 대한 정보를 탐색하거나, 구조를 동적으로 변경할 수 있다. 예를 들어, 클래스의 메타 정보를 기반으로 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고, 이들을 통해 객체 인스턴스를 생성하거나 메서드를 호출하는 작업을 할 수 있다. 이런 작업을 리플렉션이라 한다. 또 추가로 애노테이션 정보를 읽어서 특별한 기능을 수행할 수도 있다. 최신 프레임워크들은 이런 기능을 적극 활용한다.
※ reflection은 자아성찰이라는 뜻을 갖고 있다
리플렉션의 기본 개념
- 메타데이터 접근: 리플렉션을 사용하면 클래스, 인터페이스, 메서드, 필드 등의 메타데이터(데이터에 대한 데이터)에 접근할 수 있다. 예를 들어, 어떤 클래스가 어떤 메서드와 필드를 가지고 있는지, 어떤 애노테이션이 적용되어 있는지를 알 수 있다.
- 동적 조작: 리플렉션을 통해 프로그램은 런타임에 클래스의 인스턴스를 생성하고, 메서드를 호출하며, 필드의 값을 읽거나 쓸 수 있다. 이는 컴파일 타임이 아닌 런타임에 이루어지기 때문에 동적인 프로그램을 작성할 수가 있다.
리플렉션의 주요 기능
https://claremont.tistory.com/entry/Java-API-Class-%ED%81%B4%EB%9E%98%EC%8A%A4
주요 기능은 위의 글을 참고하면 된다
리플렉션의 사용 사례
- 프레임워크 및 라이브러리:
- 리플렉션은 많은 프레임워크에서 핵심적인 역할을 한다. 예를 들어, Java의 Spring 프레임워크는 리플렉션을 사용하여 의존성 주입(DI)을 수행하고, 애노테이션을 처리하며, 동적으로 프록시를 생성한다.
- 테스트 도구:
- JUnit과 같은 테스트 프레임워크는 리플렉션을 사용하여 테스트 메서드를 자동으로 발견하고 실행한다. 사용자는 특별한 설정 없이도 테스트 메서드에 대해 다양한 검증 작업을 수행할 수 있다.
- 동적 프로그래밍:
- 리플렉션을 통해 런타임에 프로그램의 동작을 결정할 수 있다. 예를 들어, 사용자가 입력한 클래스 이름에 따라 객체를 생성하고, 해당 객체의 메서드를 호출하는 동적 시스템을 만들 수 있다.
리플렉션의 장단점
- 장점:
- 유연성: 코드가 런타임에 자신의 구조를 탐색하고, 동적으로 행동을 변경할 수 있어 매우 유연한 프로그래밍이 가능
- 재사용성: 하나의 리플렉션 코드를 다양한 클래스에 적용할 수 있어 코드 재사용성을 높임
- 단점:
- 성능 저하: 리플렉션을 사용하는 코드는 일반적인 메서드 호출보다 느리다. 런타임에 메서드나 필드를 찾고, 접근 제어를 우회하는 등의 작업이 추가로 발생하기 때문
- 보안 위험: 비공개 멤버에 접근할 수 있기 때문에, 잘못 사용하면 보안 문제가 발생할 수 있다. 예를 들어, 중요한 정보를 우회하여 접근할 수 있게 된다.
- 컴파일 타임 검사 부족: 리플렉션을 사용하면 컴파일 시점에 타입 안전성을 검사할 수 없다. 따라서 런타임 오류가 발생할 가능성이 높아진다.
'소프트웨어공학 > OOP' 카테고리의 다른 글
[OOP] 제네릭 명명 관례 (0) | 2024.09.16 |
---|---|
[OOP] 실무 예외처리 수칙 트렌드 2가지 (0) | 2024.09.11 |
[OOP] 메서드 체이닝(Method Chaining) (0) | 2024.08.22 |
[OOP] 불변 객체와 메서드명 관례 - withXxx() (0) | 2024.08.20 |
[OOP] 정적 의존관계 vs 동적 의존관계 (0) | 2024.08.20 |