[java] 리플렉션
자바에서 리플렉션은 런타임 시에 클래스의 정보를 얻어내고, 클래스의 메소드를 동적으로 호출하거나 수정할 수 있는 기능을 제공합니다. 이는 일반적으로 컴파일 시에 정적으로 결정되는 것과는 달리, 프로그램 실행 중에 동적으로 결정되는 것을 의미합니다.
리플렉션의 사용 예시
리플렉션은 다양한 용도로 사용될 수 있습니다. 가장 일반적인 사용 예시는 다음과 같습니다:
- 클래스의 정보 얻기:
java.lang.Class
클래스를 이용하여 클래스의 이름, 필드, 메소드, 생성자 등의 정보를 얻을 수 있습니다. - 동적으로 메소드 호출:
java.lang.reflect.Method
클래스를 이용하여 메소드의 이름과 매개변수 타입을 지정하여 해당 메소드를 호출할 수 있습니다. - 애노테이션 검사:
java.lang.annotation.Annotation
인터페이스를 이용하여 애노테이션 정보를 얻을 수 있습니다. - 필드 접근 및 수정:
java.lang.reflect.Field
클래스를 이용하여 필드의 값을 읽거나 수정할 수 있습니다. - 생성자 호출:
java.lang.reflect.Constructor
클래스를 이용하여 생성자를 호출할 수 있습니다.
리플렉션의 주의사항
리플렉션은 강력하고 유연한 기능이지만, 남용할 경우 성능 저하나 보안 이슈를 야기할 수 있습니다. 따라서 리플렉션을 사용할 때에는 다음과 같은 주의사항을 염두에 두어야 합니다:
- 보안 검사 우회: 리플렉션을 사용하면서 접근 제한자를 무시하고 private 필드나 메소드에 접근할 수 있으며, 이는 보안 검사를 우회할 수 있는 위험을 초래할 수 있습니다.
- 성능 저하: 리플렉션은 정적으로 결정되지 않은 메소드를 호출하기 때문에, 퍼포먼스가 중요한 부분에서 사용할 경우 성능 저하를 초래할 수 있습니다.
- 가독성 저하: 리플렉션을 남용하면 코드의 가독성이 저하되어 유지보수가 어려워질 수 있습니다.
결론
리플렉션은 자바에서 동적으로 클래스 정보를 얻거나 메소드를 호출하는 기능을 제공하는 강력한 도구입니다. 그러나 사용할 때에는 보안 및 성능 측면에서 주의하고, 필요한 경우에만 사용하는 것이 좋습니다.