reflection에 대해서 설명해 주세요.

  • 자바의 리플렉션(Reflection)은 클래스 로더를 통해 읽어온 클래스를 사용하는 기술이다.

  • 리플렉션은 실제 클래스가 아닌 JVM 메모리 영역에 올라간 클래스의 정보를 읽어 사용하는 기법이기 때문에 Reflection(반사)이라는 이름을 사용한다.

  • 자바의 모든 클래스와 인터페이스는 컴파일 후 .java에서 .class파일로 변환된다.

    • .class 파일에는 멤버 변수, 메서드, 생성자 등 객체의 정보들이 들어있다.

    • JVM의 클래스 로더(ClassLoader)에 의해서 클래스 파일이 메모리에 올라갈 때, Class 클래스는 이 .class 파일의 클래스 정보들을 가져와 힙 영역에 자동으로 객체화가 된다. 때문에 따로 new로 인스턴스화 없이 바로 가져와 사용할 수 있다.

리플렉션 기술의 핵심Class라는 이름의 클래스다.

Class 클래스

  • 실행중인 자바 애플리케이션의 클래스와 인터페이스의 정보를 가진 클래스

  • public 생성자가 존재하지 않는다.

  • Class 객체는 JVM에 의해 자동으로 생성된다.

Class의 기능들

  • 클래스에 붙은 어노테이션 조회

  • 클래스 생성자 조회

  • 클래스 필드 조회

  • 클래스 메서드 조회

  • 부모 클래스, 인터페이스 조회

  • 등등..

이렇게 리플렉션을 사용해 런타임 시점에 동적으로 클래스를 읽어오거나, 인스턴스를 만들거나, 메서드를 실행하거나, 필드의 값을 가져오거나 변경하는 것이 가능하다.(private 필드 포함)

그럼 리플렉션 기술을 언제 사용할까?

  • 리플렉션은 개발자가 직접 사용하기보다는 프레임워크나 라이브러리에서 이미 많이 사용되고 있다.

  • 애노테이션

    • 사실 애노테이션 자체에는 아무런 기능이 없고 리플렉션으로 애노테이션 정보를 읽어 어떠한 행위를 할지 결정한다.

      1. 리플렉션을 통해 클래스나 메서드, 파라미터 정보를 가져온다.

      2. 리플렉션이 제공하는 메서드를 통해 원하는 애노테이션이 붙어 있는지 확인한다.

      3. 애노테이션이 붙어 있다면 애노테이션에 맞는 로직을 수행한다.

  • gettersetter, 인텔리제이의 자동 완성 기능도 리플렉션에 의해 동작한다.

  • 또한, JPA Entity나 DTO 클래스에 기본 생성자가 필요한 이유도 리플렉션을 사용하기 위해서다.

    • 이유는 기본 생성자로 객체를 생성하고, 필드를 통해 값을 넣어주는 것이 가장 간단한 방법이기 때문이다.

리플렉션 단점

  • 일반 메서드 호출보다 성능이 떨어진다.

    • Reflection API는 컴파일 시점이 아니라 런타임 시점에 클래스를 분석한다.

    • JVM을 최적화할 수 없기 때문에 성능저하가 발생할 수 없다.

  • 컴파일 시점 타입 체크 불가

    • 리플렉션은 런타임 시점에 클래스 정보를 알 수 있기 때문에 컴파일 시점에 오류를 잡을 수 없다.

  • 코드가 길어진다.

    • 일반적으로 객체를 생성하고 메서드를 호출하는 것보다 리플렉션은 더 복잡한 과정이 필요하다.

  • 불변성을 지킬 수 없다.

    • 리플렉션을 사용하면 private 필드나 메서드라도 모든 정보를 얻을 수 있기 때문에 쉽게 내부를 노출해 추상화와 불변성을 지킬 수 없다.

참고

Last updated