C# class, 주소에 의한 참조인데? 클래스 속성 값이 갱신되지 않을 때 확인할 점

C#에서 class는 참조형식(reference type)이라서 일반적으로 객체의 속성 값을 변경하면 모든 참조된 곳에서 변경된 값이 반영되어야 합니다. 그런데 특정 상황에서 값이 변경되지 않고 이전 값이 보이는 현상을 확인하였어요! 대체 무엇이 문제일까 고민을 하며 자료를 찾아보았으나, 클래스가 값형식(value type)과 같이 변한다는 보고는 없었어요. 의문이 계속 커져가는 상황, 무엇이 원인일까요~? 몇 가지 가능성을 다음과 같이 안내해드릴게요.

1. 새 인스턴스를 속성에 할당하는 경우

MyClass class1 = new MyClass();
MyClass class2 = new MyClass();

MyForm form1 = new MyForm();
form1.MyClass = class1;   // class1 연결
form1.MyClass = class2;   // class2로 교체 → class1 연결 끊김

class1.MyProperty = "변경된 값";
// form1.MyClass는 class2를 참조 → class1 수정은 반영되지 않음

✅ 해결: 새 인스턴스를 만들지 말고 기존 객체의 속성만 수정하세요.

form.MyProp.MyProperty = "변경된 값";

2. 속성 get에서 새 객체를 반환하는 경우

private MyFilter _filter;

public MyFilter Filter
{
    set { _filter = value; }
    get { return new MyFilter(_filter); } // 새 객체 반환
}

호출하는 쪽은 항상 복사본을 받기 때문에 원본을 수정해도 반영되지 않습니다.

✅ 해결: 원본을 그대로 반환하세요.

get { return _filter; }

3. 다른 코드에서 기존 객체를 새 인스턴스로 덮어쓰는 경우

_filter = new MyFilter(); // 기존 객체와 연결 끊김

✅ 해결: 새 객체를 만들지 말고 기존 객체의 속성만 수정하세요.

_filter.MyProperty = "변경된 값";

4. UI 데이터 바인딩 문제

WinForms나 WPF에서 데이터 바인딩을 사용한다면, 속성이 바뀌어도 UI에 반영되지 않을 수 있습니다. 이럴 때는 INotifyPropertyChanged를 구현해야 해요.

public class MyFilter : INotifyPropertyChanged
{
    private string _myProperty;
    public string MyProperty
    {
        get { return _myProperty; }
        set
        {
            _myProperty = value;
            OnPropertyChanged(nameof(MyProperty));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

결론

  • 참조가 끊어지는 순간, 값 변경은 반영되지 않습니다.
  • 새 인스턴스를 만들지 말고 기존 객체 속성을 수정하세요.
  • 속성 get이 복사본을 반환하지 않는지 확인하세요.
  • UI 바인딩 환경이라면 INotifyPropertyChanged를 활용해 동기화를 보장하세요.
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗