울음참고 개발공부
article thumbnail
Published 2023. 8. 23. 18:00
reflection 이란 ? 4.reflection
728x90

 

 

 

 

반사 라는 뜻을 가진 Reflection 은 Java 에서 어떤 의미를 가질까? 

 

 

 

간단하게 요약

 

실행 중인 프로그램이나 시스템의 상태를 검사하거나 수정하는 프로세스로서,

주로 런타임 시에 코드를 분석하고 제어하는 용도로 활용됨

 

 

 

 

풀어서 해당 뜻을 설명

 

Reflection  이란 단어 그대로 물체가 거울에 비춰져 자기 자신을 볼 수 있는 것 처럼,

프로그램이 자신의 코드를 거울에 비춰서 살펴보는 기능 이라 표현할 수 있다. 

 

이렇게 해서 프로그램은 자신이 어떤 클래스들을 가지고 있는지, 그 클래스들의 필드와 메서드는 무엇인지 알 수 있다. 

 

 

 

 

 

 

그렇다면 어떤 상황에서 쓸까?

 

 

커피 클래스를 예시로 들어보자

클래스 안에는 커피의 이름, 가격, 주문하는 메서드가 들어있다 

 

프로그램이 실행 중일때, 리플렉션을 사용하면 프로그램은 자기 자신의 코드를 뒤져셔 "Coffee" 라는 클래스가 있는지 확인하고,

그 클래스 안에 어떤 필드와 메서드가 있는지 알아내 커피의 가격을 변경하거나 주문하는 메서드를 호출할 수 있다. 

 

 

[ Coffee Class 예시 ] 

public class Coffee {
    private String name;
    private double price;

    public Coffee(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public void makeCoffee() {
        System.out.println("Making a cup of " + name + " coffee.");
    }

    public double getPrice() {
        return price;
    }
}

 

 

 

[ Coffee Class 에 대한 리플렉션 예시 ]

import java.lang.reflect.*;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // Coffee 클래스 가져오기
        Class<?> coffeeClass = Class.forName("Coffee");
        
        // 생성자를 통해 커피 객체 생성
        Constructor<?> constructor = coffeeClass.getConstructor(String.class, double.class);
        Object coffeeInstance = constructor.newInstance("Latte", 3.5);
        
        // 필드(price) 값 변경
        Field priceField = coffeeClass.getDeclaredField("price");
        priceField.setAccessible(true);
        priceField.set(coffeeInstance, 4.0);
        
        // 메서드(makeCoffee) 호출
        Method makeCoffeeMethod = coffeeClass.getDeclaredMethod("makeCoffee");
        makeCoffeeMethod.invoke(coffeeInstance);
        
        // 메서드(getPrice) 호출
        Method getPriceMethod = coffeeClass.getDeclaredMethod("getPrice");
        double price = (double) getPriceMethod.invoke(coffeeInstance);
        System.out.println("Coffee price: " + price);
    }
}

 

Coffee 클래스의 이름을 사용하여 리플렉션으로 해당 클래스를 가져오고, 생성자를 사용하여 커피 객체를 생성한다 

또한 필드를 수정하고 메서드를 호출하여 커피를 만들고 가격을 확인하는 과정을 보여준다. 

 

 

 

 


 

 

리플렉션을 사용하는 주요 이유

 

 

1. 플러그인 아키텍처 구현

- 리플렉션을 사용하면 런타임에  특정 인터페이스를 구현하는 클래스를 찾아내고 인스턴스화 할 수 있음

- 이를 활용하여 플러그인 시스템을 구현하거나 확장 가능한 애플리케이션을 만들 수 있음

 

2. 유닛 테스트

- 리플렉션을 사용하여 개발 중인 클래스의 내부 상태와 메서드를 테스트할 수 있음

- 테스트 프레임워크나 라이브러리에서 리플렉션을 사용하여 테스트 코드를 더 유연하고 효과적으로 작성할 수 있음

 

3. 주석 및 어노테이션 프로세싱

- 리플렉션을 사용하여 클래스, 메서드, 필드 등에 부가 정보로 달린 주석이나 어노테이션 정보를 처리할 수 있음

- 이를 통해 코드 생성, 문서화, 런타임 검사 등에 활용할 수 있음

 

 

 

 

 

리플렉션의 단점

 

 

1. 성능 오버헤드

- 리플렉션은 실시간 오버헤드가 크며, 일반적인 메서드 호출보다 느릴 수 있음

 

2. 보안 문제

- 리플렉션을 통해 프라이빗 필드나 메서드에접근할 수 있으므로, 보안 취약점이 될 수 있음

 

3. 컴파일러 최적화 제한

- 리플렉션을 사용하면 컴파일러가 코드를 최적화하기 어려울 수 있음

 

4. 가독성 저하

- 리플렉션을 과도하게 사용하면 코드의 가독성이 떨어질 수 있음 

 

 

 

 

 

 

 

728x90
profile

울음참고 개발공부

@메각이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!