본문 바로가기
Java

[Java] 리플렉션(Reflection) 이란? (feat. 어노테이션)

by 왕타오 2023. 12. 6.

리플렉션 (Reflection) 

 

JVM은 클래스 정보를 클래스 로더를 통해 읽어와서 해당 정보를 JVM 메모리에 저장한다. 저장된 클래스 정보가 마치 거울에 투영된 모습과 닮아있어, 리플렉션이라 불린다.

리플렉션을 사용하면 생성자, 메소드, 필드 등 클래스에 대한 정보를 아주 자세히 알아낼 수 있다.

 

대표적으로 여러 라이브러리, 프레임워크에서 사용되는 어노테이션(@)이 리플렉션을 사용한 예시이다.

리플렉션을 사용하면 클래스와 메소드에 어떤 어노테이션이 붙어 있는지 확인할 수 있다.

어노테이션은 그 자체로는 아무 역할도 하지 않는다.

리플렉션으로 @Component, @Bean 과 같은 어노테이션을 프레임워크의 기능을 사용하기 위해 사용할 수 있는 것이다.

리플렉션을 사용하면 접근 제어자와 무관하게 클래스의 필드나 메소드도 가져와서 호출할  있다. 또한, 인텔리제이와 같은 IDE에서 Getter, Setter를 자동으로 생성해주는 기능도 리플렉션을 사용하여 필드 정보를 가져와 구현한다고 한다. 

 

그런데 그냥

 Person person = new person();

이런 식으로 클래스로 객체를 인스턴스화 하여 사용하면 되지 않나? 

 

프레임워크나 다른 라이브러리를 사용할 때는 구체적인 클래스를 알고 있기 때문에 리플렉션을 사용할 일이 거의 없다고 한다. 하지만 내가 직접 라이브러리 혹은 프레임워크를 만들어본다고 생각해보면, 라이브러리를 사용하는 사용자가 어떤 클래스를 만들지 전혀 예상할 수 없다. 또한 다이나믹 프록시 패턴 등을 사용하여 무엇인가 동적으로 만들어주는 프로그램을 만들고자 할때 매우 어려울 것이다.

 

 

리플렉션의 단점

 

일반적으로 클래스의 메소드를 호출하면, 컴파일 시점에 분석된 클래스를 사용하지만 리플렉션은 런타임에 클래스를 분석하므로 속도가 느리다고 한다. JVM을 최적화할 수 없기 때문이라고 한다.

그리고 이런 특징으로 인해 타입 체크가 컴파일 타임에 불가능하다. 또한 객체의 추상화(객체의 공통적인 속성과 기능을 추출하여 정의하는것)가 깨진다는 단점도 존재한다.

 따라서 정말 필요한 곳에만 리플렉션을 한정적으로 사용해야한다.

'Java' 카테고리의 다른 글

[Java] SOLID  (0) 2023.12.20
[Java][Spring] IoC / DI / Component scan  (0) 2023.12.20
[Java] int vs. Integer (feat. wrapper class)  (0) 2023.12.04
[Java] logger(slf4j, log4j), system.out.println()  (0) 2023.11.27
[Java] hashcode() (feat. equals())  (1) 2023.11.22