비주얼 베이직에서는 .NET 플랫폼의 발전과 함께 ObservableCollection(Of T)와 같은 확장된 컬렉션이 등장했습니다. 이 컬렉션은 데이터의 변경 사항을 사용자 인터페이스(UI)에 알리기 위해 설계되었습니다. 이는 데이터 바인딩(data binding)을 사용할 때 특히 중요한데, 예를 들어 WPF나 MVVM 접근 방식이 지원되는 WinForms에서 그렇습니다. 이전의 구조인 List(Of T)나 ArrayList는 자동으로 변경 사항을 알리기 위한 기능이 없었고, 표시 로직을 수동으로 처리해야 했습니다.
일반 컬렉션은 자신이 변경되는 경우, 예를 들어 요소의 추가, 삭제 또는 재배치에 대해 인터페이스나 구독된 객체에 알리지 않습니다. 그 결과 UI 컨트롤(예: 목록, 테이블)은 자동으로 업데이트되지 않으며, 재처리 또는 업데이트 메서드의 추가 호출이 필요합니다. 이런 수동 동기화는 오류를 초래하고 코드의 논리를 복잡하게 만듭니다.
ObservableCollection(Of T)는 INotifyCollectionChanged 인터페이스를 구현하여 UI가 어떤 요소의 추가, 삭제 또는 변경 사항을 자동으로 인지할 수 있도록 합니다. 컬렉션 내의 객체가 변경될 때 데이터를 완전히 업데이트하려면, 저장된 요소가 INotifyPropertyChanged 인터페이스도 구현하도록 권장합니다.
코드 예시:
Imports System.Collections.ObjectModel Imports System.ComponentModel Public Class Item Implements INotifyPropertyChanged Private _name As String Public Property Name As String Get Return _name End Get Set(value As String) If _name <> value Then _name = value RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Name")) End If End Set End Property Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged End Class Dim items As New ObservableCollection(Of Item)() AddHandler items.CollectionChanged, Sub(s, e) Console.WriteLine($"Action: {e.Action}") End Sub items.Add(New Item() With {.Name = "Test 1"}) items(0).Name = "Updated Name"
주요 특징:
INotifyPropertyChanged 지원이 필요합니다.ObservableCollection가 요소의 속성 변경을 알릴 수 있나요? 요소가 변경되지만 컬렉션(구성, 크기)은 변경되지 않을 경우에는?
아니요, 기본적으로 ObservableCollection은 컬렉션 자체의 변경 사항만 추적하며 개별 요소의 속성은 추적하지 않습니다. UI에서 속성 변경을 반영하려면 객체가 INotifyPropertyChanged 인터페이스를 구현해야 하며, UI에서 바인딩이 이를 지원해야 합니다.
컬렉션이 UI 스레드 외부에서 수정되면 변경 사항에 대한 알림이 발생합니까?
아니요, 주요(UI) 스레드 외부에서 컬렉션을 변경하면 오류가 발생하거나 일부 프레임워크(예: WPF)에서 올바르지 않은 동작을 초래할 수 있습니다. 멀티 스레딩 변경의 경우, Dispatcher.Invoke 또는 유사한 방법을 사용하여 동기화가 올바른 스레드에서 이루어지도록 해야 합니다.
ObservableCollection은 WinForms에서 바인딩에 사용할 수 있나요, 아니면 WPF에서만 작동하나요?
ObservableCollection은 WinForms에서도 작동하지만, WinForms에서는 수동으로 동기화하고 데이터를 업데이트해야 합니다. 기본 바인딩이 컬렉션 이벤트를 항상 인식하지 못하기 때문입니다. WPF에서는 구현이 최대한 투명합니다.
ObservableCollection을 사용하지만 내부 요소가 INotifyPropertyChanged를 구현하지 않아 UI가 속성 변경 시 업데이트되지 않음프로그래머가 인터페이스용 제품 목록을 만들고 일반 List(Of T)를 사용하여 요소를 추가하거나 제거한 후 UI 업데이트 메서드를 수동으로 호출합니다. 가끔 목록을 업데이트하는 것을 잊거나 요소를 삭제할 때 인덱스를 잘못 계산하곤 합니다.
장점:
단점:
ObservableCollection(Of T)를 구현하고 객체가 INotifyPropertyChanged를 지원합니다. 모든 작업 — 추가, 삭제, 변경 — 이 자동으로 바인딩 덕분에 UI에 반영됩니다. UI의 논리는 많은 수동 업데이트 없이 단순하게 반응하게 됩니다.
장점:
단점: