[c#] 데코레이터와 프록시의 비교

데코레이터와 프록시는 객체 지향 디자인 패턴에서 자주 사용되는 개념입니다. 이 두 개념의 차이점과 각각의 적용 시나리오를 알아보겠습니다.

데코레이터(Decorator)

데코레이터는 기존 객체에 동적으로 새로운 기능을 추가하기 위한 패턴입니다. 주로 상속을 통해 구현되며, 런타임 시에 객체에 새로운 기능을 추가할 수 있습니다. 예를 들어, 특정 클래스의 인스턴스에 대한 행동을 수정하거나, 그 인스턴스가 다른 객체와 협력하도록 변경할 수 있습니다.

데코레이터 패턴은 Open/Closed Principle을 준수하며, 코드 변경 없이 기존 클래스의 동작을 확장할 수 있습니다.

// 데코레이터 예제
public interface IComponent
{
    void Operation();
}

public class ConcreteComponent : IComponent
{
    public void Operation()
    {
        // 구체적인 작업 수행
    }
}

public abstract class Decorator : IComponent
{
    protected IComponent component;

    public Decorator(IComponent c)
    {
        component = c;
    }

    public virtual void Operation()
    {
        component.Operation();
    }
}

프록시(Proxy)

프록시는 다른 객체에 대한 접근을 제어하고 대리할 수 있는 패턴입니다. 주로 접근 제어, 로깅, 캐싱, 복잡한 객체 생성 등에 사용됩니다. 클라이언트는 프록시를 통해 실제 객체에 접근하며, 프록시는 필요한 전/후처리 작업을 수행하거나 객체의 생성을 지연시킬 수 있습니다.

프록시 패턴은 객체에 대해 간접적으로 접근함으로써 보안상의 이점을 얻을 수 있으며, 객체에 대한 접근을 제어함으로써 효율적으로 리소스를 관리할 수 있습니다.

// 프록시 예제
public interface ISubject
{
    void Request();
}

public class RealSubject : ISubject
{
    public void Request()
    {
        // 실제 객체에 대한 작업 수행
    }
}

public class Proxy : ISubject
{
    private RealSubject realSubject;

    public void Request()
    {
        if (realSubject == null)
        {
            realSubject = new RealSubject();
        }

        // 전처리 작업 수행
        realSubject.Request();
        // 후처리 작업 수행
    }
}

결론

데코레이터와 프록시는 각각 객체에 동적으로 기능을 추가하고, 다른 객체에 대한 접근을 제어하기 위한 패턴입니다. 데코레이터는 기존 객체에 새로운 동작을 추가하는 데에 중점을 두고 있으며, 프록시는 대리 객체를 통해 실제 객체에 대한 접근을 제어하는 데에 중점을 두고 있습니다.

이러한 개념들을 적절히 사용하여 객체의 기능 확장 및 접근 제어를 구현할 수 있으며, 객체 지향 설계 원칙과 더불어 유연하고 확장 가능한 코드를 작성할 수 있습니다.

참고 자료