순환 참조는 객체가 서로를 참조하며 무한 루프나 메모리 누수를 초래할 수 있는 문제입니다. 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");
}
}
이와 같이 설계하면 객체들이 서로 직접 참조하지 않아 순환 참조를 피할 수 있습니다.
'C#' 카테고리의 다른 글
| C# Stopwatch와 PerformanceCounter 비교 분석 (0) | 2026.06.18 |
|---|---|
| C# Custom Binding 구현으로 네트워크 통신 확장 (0) | 2026.06.17 |
| C# Garbage Collector 동작 원리와 세대별 수집 (0) | 2026.06.16 |
| C# 인터페이스 분리 원칙(ISP) 적용 사례 (0) | 2026.06.16 |
| C# Attribute 기반 로깅 시스템 구현 (0) | 2026.06.16 |