Skip to content

Latest commit

 

History

History
25 lines (21 loc) · 1.93 KB

File metadata and controls

25 lines (21 loc) · 1.93 KB

Reflection


  • 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API이다.
  • 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법.
  • JVM은 클래스 정보를 클래스 로더를 통해 해당 정보를 JVM 메모리에 저장한다.
    • 저장된 클래스의 정보가 거울에 투영된 모습과 같아 리플렉션이라 한다.
  • 리플렉션을 사용하면 생성자, 메소드, 필드 등 클래스에 대한 정보를 자세히 알 수 있다.

어떤 상황에 사용될까?

  • 런타임에 클래스 정보를 동적으로 가져오는 경우
    • 컴파일 시에 클래스의 이름을 알 수 없거나, 다양한 클래스의 정보를 동적으로 가져와야하는 경우
    • Spring의 어노테이션 같은 기능들이 리플렉션을 사용하여 프로그램 실행 도중 동적으로 클래스 정보를 가져온다.
  • 자동화된 테스트 도구나 개발 도구에서 사용하는 경우
    • 예로 인텔리제이 IDE에서 Getter, Setter를 자동으로 생성해주는 기능이 있는데 리플렉션을 사용하여 필드 정보를 가져와 구현한다.
  • 프레임워크나 라이브러리에서 사용하는 경우
    • 많은 프레임워크와 라이브러리에서 리플렉션을 사용하여 외부에서 제공된 클래스를 동적으로 로드하고 사용자가 작성한 코드와 통합하는 등의 작업을 수행

주의

  • 정적으로 컴파일된 코드보다 느리다.
    • 리플렉션을 사용할 때마다 클래스 정보를 동적으로 가져오고 처리하기 때문
  • 리플렉션을 사용하면 private 필드, 메서드에 접근하거나 수정할 수 있다.
  • 컴파일 시점에는 오류가 쉽게 발견되지 않는다.
  • 런타임에 오류가 발생한 경우 디버깅이 쉽지 않다.