의미 파악해보기
리플렉션이란 직역하면 투영 , 반사를 뜻한다.
프로그램에서는 이를 객체를 통해 클래스의 정보를 분석하는 기법을 의미하는데
이를 활용하여 자바에서는 클래스 , 메서드 , 필드 , 생성자등의 정보를 동적으로 조회하고 조작할 수 있어진다.
우리가 흔히 말하는 컴파일이 된 이후에 타임에서는
선언된 어떤 무언가를 변경하는 것을 할 수 있게 하는것이며 객체 알 수 없는 객체의 메서드 호출을 할 수도 있어진다.
동작원리
자바 리플렉션은 런타임 시점에서 클래스의 메타 데이터를 분석하여 사용하는데
여기서 메타 데이터란, 어떤 데이터가 가진 정보를 설명하는 데이터로
만약 100줄의 데이터가 있고, 어떨 때 , 어떤식으로 등의 정보를 짧게 써둔 데이터를 5줄 만들어서
메타데이터로 관리하는 것인데
이러면 꼭 100줄을 안읽더라도 사용에 필요한 시점에서 꺼내서 쓰면 되게 만드는 것을 말한다.
이렇게 컴파일 시점에서가 아닌 런타임 시점에서도 코드를 조작할 수 있도록 하는것이다.
재미있는 점은 이를 통해 빈 , DI를 하는 기능을 제공하게 되는데 이를 이해하기 전 사용법을 알아 보자
예시 몇개봐보자
java.lang.reflect 패키지를 열어보면 다양한 기능이 있다.
그중 몇개를 봐보면
(1) Class 객체 얻기
// 1. 클래스 이름을 직접 사용
Class<?> clazz1 = SampleClass.class;
// 2. 인스턴스로부터 얻기
SampleClass obj = new SampleClass();
Class<?> clazz2 = obj.getClass();
// 3. 클래스 이름 문자열로부터 얻기
Class<?> clazz3 = Class.forName("com.example.SampleClass");
이렇게 객체 정보를 부르거나
(2) 생성자(Constructor) 정보 조회 및 객체 생성
import java.lang.reflect.Constructor;
Class<?> clazz = Class.forName("com.example.SampleClass");
// 기본 생성자 호출
Object obj = clazz.getDeclaredConstructor().newInstance();
// 특정 생성자 호출
Constructor<?> constructor = clazz.getConstructor(String.class);
Object obj2 = constructor.newInstance("Hello");
생성자를 만들 수도 있고, 필드를 조작하거나 , 메서드를 호출할 수도 있다.
(3) 애노테이션 정보 조회
내가 생각하는 프레임워크에서의 사용의 킥은 애노테이션을 통한 처리인데
이를 통해 우리가 많이 쓰는 스프링에서 애노테이션 기반 설정으로
Bean을 생성하거나 DI 를 하거나 할 수 있게 되는 것이다.
그래서 장단점은?
장점으로는 당연히 유연하게 코드를 짤 수 있다.
필요 시점에 따라 사용할 수 있도록 동작하게 되기 때문에 내부에서는 구조변경이
가능해지기 때문이다.
다만, 단점으로는 성능저하 문제가 있는데 메소드나 필드에 접근하려고 데이터를 읽는과정에서
추가 소요가 발생하는것이기 때문에 이며
또다른 단점으로는 개발자가 의도하지 않는 방식으로 내부 구조에 접근할 수 있게되기 때문에
예기치 않는 에러가 발생할 수 있는점이 문제점으로 볼 수 있다.자바 리플렉션 (Reflection)을 이해해보자
'JAVA' 카테고리의 다른 글
filter방식을 이해하고, 문제점 생각해보기 (0) | 2025.05.12 |
---|---|
array VS List (1) | 2025.03.09 |
JAVA 메모리 - 자바 가상머신 스택과 네이티브 메서드 스택 (2) | 2024.12.14 |
JAVA 메모리 - 프로그램 카운터 레지스터에 대한 이해 (0) | 2024.12.14 |
JAR , WAR (0) | 2024.08.23 |