C#/WPF

[WPF] ObservableCollection

HJ0216 2024. 5. 15. 08:25

WPF를 사용하면서 처음 알게 된 ObservableCollection 클래스와 프로젝트 진행 시, 헤맸던 부분을 정리해봅니다.

 

1. ObservableCollection Class

항목이 추가 또는 제거되거나 전체 목록을 새로 고칠 때 알림을 제공하는 동적 데이터 컬렉션

 

저는 프로젝트를 진행할 때, MVVM 패턴에 맞춰서 진행을 하다보니 처음에 가장 어려웠던 점은 VIew와 ViewModel의 연동이었습니다. 대표적으로 ViewModel 단에서 데이터가 변경되어도 View 즉, UI에는 반영이 안되는 것이죠.

(🥸 리액트 배울 때는 State에 설정만 해주면 페이지 고침없이도 딴딴하고 바뀌는데,, 라는 생각을 잠깐 했습니다.)

 

보통은 이럴 때, INotifyPropertyChanged를 구현해서 ViewModel 데이터 변경 시, UI에 알림을 보내는데, 여러 개의 데이터를 저장하는 List 타입도 마찬가지입니다.

 

그러나, 이 때 ObservableCollection을 사용한다면 INotifyPropertyChanged 사용하지 않고도 데이터 변경 시 자동으로 UI에 업데이트 됩니다(왜냐면, ObservableCollection 내에서 INotifyPropertyChanged를 구현했기 때문입니다😄).

 

 

2. ObservableCollection 특징

 * 자동 UI 업데이트: 데이터 변경 시, View에 자동 반영

 * 일반 컬렉션과 높은 호환성: List 등 기존 컬렉션을 ObservableCollection로 쉽게 변경 가능

 * 항목이 추가, 삭제, 변경될 때마다 이벤트가 발생하므로 대량의 데이터를 빠른 속도로 변경해야 하는 경우 성능 저하의 원인이 될 수 있음

 * 스레드 안전성: 여러 스레드에서 동시에 접근하고 변경하는 경우, 동기화 처리를 직접해야 함

 

 

3. ObservableCollection 사용 시, 어려웠던 점

프로젝트를 하면서 ObservableCollection 사용 시, 처음에 가장 당황했던 부분은 데이터가 변경되었는데 UI변경이 일어나지 않는 것입니다☠️.

 

정확히는 인스턴스 자체가 변경되면 UI에 반영이 되지 않는다는 것입니다.

이는 ObservableCollection<T>이 항목의 추가, 삭제, 수정에 대한 알림을 제공하지만, 컬렉션 인스턴스 자체의 참조 변경에 대해서는 알림을 제공하지 않기 때문입니다.

 

따라서,

MyCollection = new ObservableCollection<MyObject>();

 

새로운 ObservableCollection을 만들어 할당할 경우, UI는 변경되지 않으므로

private ObservableCollection<MyObject> myCollection;
public ObservableCollection<MyObject> MyCollection
{
    get { return myCollection; }
    set
    {
        if (myCollection != value)
        {
            myCollection = value;
            OnPropertyChanged(nameof(MyCollection));
        }
    }
}

 

이렇게 ObservableCollection 자체를 다시 한 번 INotifyPropertyChanged 처리를 해줘야 합니다.

 

그래서 ObservableCollection을 도중에 초기화해줄 때에도, 변경 감지를 위해 저는 새 인스턴스보단 Clear 메서드를 사용합니다.

public void ClearData()
{
    MyCollection.Clear();
}

 

Clear 메서드 사용의 장점으로는

 * UI 자동 업데이트: 컬렉션을 비우는 것이 UI에 즉시 반영됩니다.

 * 메모리 관리: 새 인스턴스를 생성하고 기존 인스턴스를 버리면, 가비지 컬렉터가 기존 인스턴스를 수집할 때까지 해당 메모리가 여전히 사용 중인 상태로 남게 됩니다. 반면, Clear 메서드를 사용하면 기존 컬렉션 인스턴스를 재사용하므로 불필요한 메모리 할당을 줄일 수 있습니다.

 * 코드 가독성 및 유지보수: Clear 메서드를 사용하는 것은 컬렉션의 내용을 초기화하려는 의도를 명확하게 표현합니다.

 

 

 

📚 참고 자료

 

ObservableCollection<T> 클래스 (System.Collections.ObjectModel)

항목이 추가 또는 제거되거나 전체 목록을 새로 고칠 때 알림을 제공하는 동적 데이터 컬렉션을 나타냅니다.

learn.microsoft.com