Reflection(리플렉션)이란?

Reflection(리플렉션)Java에서 클래스, 메서드, 필드 등의 정보를 실행 시간에 동적으로 조사하고 조작할 수 있게 해주는 기술입니다.

리플렉션을 사용하면 코드가 실행 중일 때에도 객체의 정보를 확인하거나 수정할 수 있습니다.


주요 기능

  1. 클래스 정보 확인

    • 클래스 이름, 패키지, 부모 클래스, 구현 인터페이스 등을 알아낼 수 있습니다.
    Class<?> clazz = MyClass.class;
    System.out.println(clazz.getName()); // 클래스 이름 출력
  2. 필드 및 메서드 접근

    • 클래스의 필드나 메서드에 동적으로 접근하여 값을 읽거나 수정할 수 있습니다.
    Field field = clazz.getDeclaredField("privateField");
    field.setAccessible(true); // private 필드 접근 허용
    field.set(instance, "New Value"); // 값 설정
  3. 객체 생성

    • 클래스 정보를 기반으로 객체를 동적으로 생성할 수 있습니다.
    Constructor<?> constructor = clazz.getConstructor();
    Object instance = constructor.newInstance(); // 객체 생성
  4. 메서드 호출

    • 메서드를 동적으로 호출할 수 있습니다.
    Method method = clazz.getMethod("sayHello");
    method.invoke(instance); // 메서드 호출

장점

  1. 유연성:

    • 실행 중에 클래스 정보를 알 수 없어도 동적으로 조작이 가능합니다.
    • 예: 플러그인 시스템이나 프레임워크에서 다양한 클래스 로딩.
  2. 라이브러리와 프레임워크에서 활용:

    • Spring, Hibernate와 같은 프레임워크는 리플렉션을 활용해 동적으로 객체를 생성하고 설정합니다.

단점

  1. 성능 저하:

    • 일반적인 코드 실행보다 느립니다. (동적 접근 및 검사 과정이 필요하기 때문)
  2. 안전성 문제:

    • 접근 제한자(private, protected)를 무시할 수 있어 잘못 사용하면 코드 안정성을 해칠 수 있습니다.
  3. 가독성 저하:

    • 코드가 복잡해지고 디버깅이 어려워질 수 있습니다.

사용 예

import java.lang.reflect.Field;

public class ReflectionExample {
    private String hiddenField = "Hello, Reflection!";

    public static void main(String[] args) throws Exception {
        ReflectionExample example = new ReflectionExample();

        // 클래스 정보 가져오기
        Class<?> clazz = example.getClass();

        // private 필드 접근
        Field field = clazz.getDeclaredField("hiddenField");
        field.setAccessible(true); // 접근 허용
        System.out.println("Before: " + field.get(example));

        // 필드 값 변경
        field.set(example, "Modified Value");
        System.out.println("After: " + field.get(example));
    }
}

출력 결과:

Before: Hello, Reflection!
After: Modified Value

실제로 어디에 사용될까?

  • 프레임워크: Spring은 리플렉션으로 @Autowired, @Service 등을 처리합니다.
  • 테스트 도구: JUnit 등에서 객체의 비공개 필드나 메서드를 테스트하기 위해 사용됩니다.
  • 플러그인 시스템: 클래스 이름만 알고 있을 때, 해당 클래스를 로드하거나 객체를 생성합니다.

결론

Reflection은 매우 강력한 도구이지만, 성능 저하와 안정성 문제를 야기할 수 있으므로 꼭 필요한 경우에만 사용해야 합니다. 일반적인 개발에서는 리플렉션을 사용하지 않고도 해결할 수 있는 방식(예: 생성자 주입, Getter/Setter 활용 등)을 우선 고려해야 합니다.

profile
🌱

0개의 댓글