본문 바로가기

C#

C# 순환 참조 방지 패턴 설계

순환 참조는 객체가 서로를 참조하며 무한 루프나 메모리 누수를 초래할 수 있는 문제입니다. C#에서 순환 참조를 방지하는 패턴을 설계하는 방법을 정리합니다.

1. 의존성 주입과 인터페이스 활용

서로 강하게 결합된 객체 대신 인터페이스로 의존성을 분리하면 순환 참조를 줄일 수 있습니다.

2. 약한 참조(WeakReference) 사용

순환 참조로 GC가 객체를 해제하지 못하는 경우, WeakReference를 사용해 참조를 약하게 만들어 메모리 누수를 방지할 수 있습니다.

3. 이벤트 핸들러 해제 철저히

이벤트 등록 시 반드시 이벤트 해제를 구현하여 순환 참조를 끊는 것이 중요합니다.

4. Mediator 패턴 활용

객체끼리 직접 참조하는 대신 중재자(Mediator)를 통해 통신하도록 설계해 상호 참조를 줄이고 관리하기 쉽습니다.

예제 코드: Mediator 패턴 기본 구조

public interface IMediator
{
    void Notify(object sender, string ev);
}

public class ConcreteMediator : IMediator
{
    private ComponentA _componentA;
    private ComponentB _componentB;

    public ConcreteMediator(ComponentA a, ComponentB b)
    {
        _componentA = a;
        _componentB = b;
    }

    public void Notify(object sender, string ev)
    {
        if (ev == "AtoB")
            _componentB.DoB();
        else if (ev == "BtoA")
            _componentA.DoA();
    }
}

public class ComponentA
{
    private IMediator _mediator;

    public ComponentA(IMediator mediator)
    {
        _mediator = mediator;
    }

    public void DoA()
    {
        // 작업 수행
        _mediator.Notify(this, "AtoB");
    }
}

public class ComponentB
{
    private IMediator _mediator;

    public ComponentB(IMediator mediator)
    {
        _mediator = mediator;
    }

    public void DoB()
    {
        // 작업 수행
        _mediator.Notify(this, "BtoA");
    }
}

이와 같이 설계하면 객체들이 서로 직접 참조하지 않아 순환 참조를 피할 수 있습니다.