[java] 자바 프록시 패턴을 활용한 클래스 대체 기능 구현

프록시 패턴은 객체 지향 프로그래밍에서 사용하는 디자인 패턴 중 하나로, 다른 객체에 대한 접근을 제어하거나 대리 객체로 동작할 수 있도록 하는 패턴입니다. 자바에서는 프록시 패턴을 활용하여 클래스 대체 기능을 구현할 수 있습니다.

프록시 패턴의 개념

프록시 패턴은 다른 객체에 대한 인터페이스를 제공하여 해당 객체에 대한 접근을 제어하거나 추가적인 기능을 수행할 수 있도록 하는 디자인 패턴입니다. 주요 요소로는 실제 객체(Real Subject), 프록시(Proxy), 서브젝트(Subject) 등이 있습니다. 프록시는 실제 객체와 동일한 인터페이스를 구현하고 실제 객체의 인스턴스를 유지하며, 요청이 들어오면 해당 요청을 실제 객체에 전달하거나 처리하는 역할을 합니다.

자바에서의 프록시 패턴 활용

자바에서 프록시 패턴을 활용하면 클래스나 객체를 대체하여 추가적인 기능을 수행하거나 접근을 제어할 수 있습니다.

import java.lang.reflect.*;
 
public class ProxyHandler implements InvocationHandler {
    private Object realObject;

    public ProxyHandler(Object realObject) {
        this.realObject = realObject;
    }

    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
        // 추가적인 기능 구현
        Object result = method.invoke(realObject, args);
        // 추가적인 기능 구현
        return result;
    }
}

위 예제에서는 InvocationHandler 인터페이스를 구현하여 프록시를 생성하고 추가적인 기능을 구현하였습니다.

클래스 대체 기능 구현

아래 예제는 프록시 패턴을 사용하여 클래스를 대체하는 기능을 구현한 예제입니다.

public interface Image {
    void display();
}

public class RealImage implements Image {
    private String fileName;

    public RealImage(String fileName){
        this.fileName = fileName;
        loadFromDisk(fileName);
    }

    @Override
    public void display() {
        System.out.println("Displaying " + fileName);
    }

    private void loadFromDisk(String fileName){
        System.out.println("Loading " + fileName);
    }
}

public class ProxyImage implements Image{
    private RealImage realImage;
    private String fileName;

    public ProxyImage(String fileName){
        this.fileName = fileName;
    }

    @Override
    public void display() {
        if(realImage == null){
            realImage = new RealImage(fileName);
        }
        realImage.display();
    }
}

public class ProxyPatternDemo {
    public static void main(String[] args) {
        Image image = new ProxyImage("test.jpg");

        // 이미지가 처음으로 표시될 때, 실제 이미지가 로딩됩니다.
        image.display(); 

        // 이미지가 두 번째로 표시될 때, 실제 이미지가 이미 로딩되었습니다.
        image.display(); 
    }
}

위 예제에서 RealImage 클래스를 ProxyImage 클래스로 대체하는 기능을 구현하였습니다.

프록시 패턴을 사용하면 클래스나 객체에 접근을 제어하거나 추가적인 기능을 수행할 수 있으며, 유연한 코드 구조를 유지할 수 있습니다.

결론

프록시 패턴은 자바에서 클래스나 객체에 대한 접근을 제어하거나 대체 기능을 구현할 때 유용하게 활용할 수 있는 디자인 패턴입니다. 프록시 패턴을 적절히 활용하면 코드를 유연하게 확장할 수 있으며, 복잡성을 줄이고 유지보수성을 높일 수 있습니다.