C#의 ObservableCollection 및 ObservableRangeCollection

ObservableCollection<T>ObservableRangeCollection<T> 는 C#에서 데이터 바인딩을 구현하는 데 사용되는 컬렉션 클래스로, 각각의 기능에 차이가 있습니다.

1. 네임스페이스 및 의존성

ObservableCollection<T>: .NET 프레임워크의 내장 클래스로, System.Collections.ObjectModel 네임스페이스에 위치하며 추가적인 의존성이 필요 없습니다.

ObservableRangeCollection<T>: .NET 프레임워크의 기본 클래스는 아니며, 일반적으로 MvvmCross 또는 ReactiveUI와 같은 서드파티 라이브러리에서 제공됩니다. 사용 시 해당 라이브러리를 포함해야 합니다.

2. 데이터 변경 알림 메커니즘

ObservableCollection<T>: 단일 요소를 추가, 제거 또는 교체할 때 CollectionChanged 이벤트가 발생하여 UI 업데이트를 알립니다. 하지만 여러 요소를 한 번에 처리하는 경우 각 작업마다 개별적으로 이벤트가 발생하므로 대량의 데이터를 처리할 때 성능 문제가 발생할 수 있습니다.

ObservableRangeCollection<T>: 단일 요소 작업뿐만 아니라 대량 작업도 최적화되어 있습니다. 대량으로 요소를 추가, 제거 또는 교체할 때는 단 한 번의 CollectionChanged 이벤트만 발생하여 성능을 크게 향상시킵니다.

3. 기능 특징

ObservableCollection<T>: Add, Remove, Insert 등의 기본적인 컬렉션 작업 메서드를 제공하지만, 대량 작업을 위한 전용 메서드는 없습니다. ObservableRangeCollection<T>: ObservableCollection<T>의 기본 기능에 더해 AddRange, RemoveRange, ReplaceRange 등의 대량 작업 메서드를 제공하여 개발자가 효율적으로 데이터를 처리할 수 있게 합니다.

예제 코드:

ObservableCollection<T>을 사용한 대량 추가

using System;
using System.Collections.ObjectModel;

class Program {
    static void Main() {
        var myCollection = new ObservableCollection<int>();
        myCollection.CollectionChanged += (s, e) => {
            Console.WriteLine($"컬렉션이 변경됨: 동작 = {e.Action}, 새 항목 수 = {e.NewItems?.Count}, 이전 항목 수 = {e.OldItems?.Count}");
        };

        for (int i = 0; i < 10; i++) {
            myCollection.Add(i); // Add 호출마다 CollectionChanged 이벤트 발생
        }
    }
}

ObservableRangeCollection<T>을 사용한 대량 추가 (MvvmCross 라이브러리 가정)

using System;
using MvvmCross.ViewModels;

class Program {
    static void Main() {
        var myCollection = new ObservableRangeCollection<int>();
        myCollection.CollectionChanged += (s, e) => {
            Console.WriteLine($"컬렉션이 변경됨: 동작 = {e.Action}, 새 항목 수 = {e.NewItems?.Count}, 이전 항목 수 = {e.OldItems?.Count}");
        };

        int[] itemsToInsert = new int[10];
        for (int i = 0; i < 10; i++) {
            itemsToInsert[i] = i;
        }

        myCollection.AddRange(itemsToInsert); // AddRange 호출 시 한 번의 CollectionChanged 이벤트만 발생
    }
}

사용 사례

단일 요소 중심의 데이터 조작이 필요한 경우: 애플리케이션이 주로 작은 데이터 세트에 대해 단일 요소를 추가, 제거 또는 교체하는 작업을 수행한다면 .NET 프레임워크에 포함된 ObservableCollection<T>를 사용하면 충분합니다.

대량 작업이 빈번하게 필요한 경우: 많은 수의 요소를 한 번에 추가, 제거 또는 교체해야 하는 경우 성능 문제를 피하기 위해 ObservableRangeCollection<T>를 사용하는 것이 좋습니다. 이 클래스의 대량 작업 메서드와 최적화된 이벤트 알림 메커니즘이 성능 향상을 가져옵니다.

태그: C# ObservableCollection ObservableRangeCollection 데이터 바인딩

7월 20일 01:47에 게시됨