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>를 사용하는 것이 좋습니다. 이 클래스의 대량 작업 메서드와 최적화된 이벤트 알림 메커니즘이 성능 향상을 가져옵니다.