C#에서 컬렉션을 정렬할 때 IComparable과 IComparer 인터페이스를 효과적으로 활용하면 코드 유지보수와 성능 면에서 큰 도움이 됩니다. 이번 글에서는 두 인터페이스의 차이와 실제 정렬 로직에 적용하는 방법을 간단히 설명합니다.
1. IComparable 기본 이해
IComparable은 객체 자체에 정렬 기준을 정의하는 인터페이스입니다. 클래스에 CompareTo 메서드를 구현하여 기본 정렬 방식을 제공합니다.
public class Product : IComparable
{
public string Name { get; set; }
public decimal Price { get; set; }
public int CompareTo(Product other)
{
if(other == null) return 1;
// 가격 기준 오름차순 정렬
return this.Price.CompareTo(other.Price);
}
}
2. IComparer를 활용한 맞춤형 정렬
IComparer는 정렬 기준이 여러 개 필요하거나, 객체 내 기본 정렬 기준과 다른 정렬 방식을 사용할 때 유용합니다. 별도의 비교자 클래스를 만들어 Compare 메서드를 구현합니다.
public class ProductNameComparer : IComparer
{
public int Compare(Product x, Product y)
{
if(x == null) return y == null ? 0 : -1;
if(y == null) return 1;
// 이름 기준 알파벳 오름차순 정렬
return string.Compare(x.Name, y.Name, StringComparison.OrdinalIgnoreCase);
}
}
3. 정렬 사용 예제
List<Product>에 대해 기본 정렬과 맞춤 정렬자를 적용해 봅니다.
var products = new List
{
new Product { Name = "Banana", Price = 200 },
new Product { Name = "Apple", Price = 150 },
new Product { Name = "Orange", Price = 300 }
};
// 기본 정렬 (Price 기준)
products.Sort();
// 이름 기준 정렬
products.Sort(new ProductNameComparer());
4. 정리 및 최적화 팁
- 단일 정렬 기준이 명확하다면 IComparable 구현을 권장합니다.
- 여러 정렬 기준이 필요하거나, 외부에서 정렬 기준을 변경 가능하게 하려면 IComparer를 사용하세요.
- 정렬 시 불필요한 객체 생성이나 복잡한 비교 로직을 줄이면 성능 향상에 유리합니다.
'C#' 카테고리의 다른 글
| C# yield return을 이용한 지연 실행(Deferred Execution) (0) | 2026.05.29 |
|---|---|
| C# ReadOnlyMemory<T>와 메모리 안전성 확보 (0) | 2026.05.29 |
| C# ThreadStatic vs AsyncLocal 차이와 활용 (0) | 2026.05.28 |
| C# ObservableCollection<T>와 UI 데이터 바인딩 (0) | 2026.05.28 |
| C# KeyedCollection<T>로 키 기반 컬렉션 설계 (0) | 2026.05.27 |