Comparer vs Comparable and Enumerable vs Enumerator in C#

1. Comparer and Comparable

1.1 Comparer (IComparer)

  • μ •μ˜: IComparerλŠ” 두 객체λ₯Ό λΉ„κ΅ν•˜λŠ” μ™ΈλΆ€ λΉ„κ΅μž μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.
  • μ£Όμš” μ—­ν• : μ •λ ¬ 기쀀을 λ³„λ„μ˜ 클래슀둜 κ΅¬ν˜„ν•΄ 객체의 정렬을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • 핡심 λ©”μ„œλ“œ: int Compare(object x, object y)λ₯Ό κ΅¬ν˜„ν•˜μ—¬ 두 객체의 크기 비ꡐλ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • μž₯점: μ—¬λŸ¬ κ°€μ§€ μ •λ ¬ 기쀀을 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš© 예제:

class PointCompare : IComparer<Point>
{
    public int Compare(Point x, Point y)
    {
        return x.X - y.X; // X μ’Œν‘œ κΈ°μ€€ 비ꡐ
    }
}

1.2 Comparable (IComparable)

  • μ •μ˜: IComparable은 클래슀 내뢀에 비ꡐ 기쀀을 κ΅¬ν˜„ν•˜λŠ” λ‚΄λΆ€ λΉ„κ΅μž μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.
  • μ£Όμš” μ—­ν• : 객체가 슀슀둜 μ •λ ¬ 기쀀을 μ •μ˜ν•˜λ©°, CompareTo λ©”μ„œλ“œλ₯Ό 톡해 비ꡐ λ‘œμ§μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  • 핡심 λ©”μ„œλ“œ: int CompareTo(object other)λ₯Ό κ΅¬ν˜„ν•˜μ—¬ 객체 μžμ‹ κ³Ό λ‹€λ₯Έ 객체λ₯Ό λΉ„κ΅ν•©λ‹ˆλ‹€.
  • μž₯점: 객체 μžμ²΄κ°€ 비ꡐ κ°€λŠ₯ν•œ μƒνƒœκ°€ λ©λ‹ˆλ‹€.

μ‚¬μš© 예제:

class Point : IComparable<Point>
{
    public int X { get; set; }
    public int CompareTo(Point other)
    {
        return this.X - other.X; // X μ’Œν‘œ κΈ°μ€€ 비ꡐ
    }
}

1.3 비ꡐ μš”μ•½

| ꡬ뢄 | Comparer (IComparer) | Comparable (IComparable) | |β€”β€”β€”β€”β€”β€”|——————————–|β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”| | λΉ„κ΅μž | μ™ΈλΆ€ λΉ„κ΅μž | λ‚΄λΆ€ λΉ„κ΅μž | | μ •λ ¬ κΈ°μ€€ | μ—¬λŸ¬ μ •λ ¬ κΈ°μ€€ κ΅¬ν˜„ κ°€λŠ₯ | ν•˜λ‚˜μ˜ μ •λ ¬ κΈ°μ€€λ§Œ κ΅¬ν˜„ | | μ‚¬μš© λ©”μ„œλ“œ | Compare | CompareTo | | 객체의 μ—­ν•  | κ°μ²΄λŠ” 비ꡐ λ‘œμ§μ„ λͺ°λΌλ„ 됨 | 객체 슀슀둜 비ꡐ κΈ°μ€€ μ •μ˜ |


2. Enumerable and Enumerator

2.1 Enumerable (IEnumerable)

  • μ •μ˜: IEnumerable은 μ»¬λ ‰μ…˜μ΄ 순회 κ°€λŠ₯ν•˜λ„λ‘ ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.
  • μ£Όμš” μ—­ν• : μ—΄κ±°μž(Enumerator)λ₯Ό μ œκ³΅ν•˜μ—¬ foreach κ΅¬λ¬Έμ—μ„œ μ»¬λ ‰μ…˜μ„ μˆœνšŒν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • 핡심 λ©”μ„œλ“œ: IEnumerator GetEnumerator()λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.

μ‚¬μš© 예제:

class MyCollection : IEnumerable
{
    private int[] data = { 1, 2, 3 };

    public IEnumerator GetEnumerator()
    {
        return data.GetEnumerator();
    }
}

2.2 Enumerator (IEnumerator)

  • μ •μ˜: IEnumeratorλŠ” μ»¬λ ‰μ…˜μ˜ μš”μ†Œλ₯Ό μˆœνšŒν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.
  • μ£Όμš” μ—­ν• : μ»¬λ ‰μ…˜ λ‚΄ μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© νƒμƒ‰ν•˜λ©° ν˜„μž¬ μœ„μΉ˜λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • 핡심 λ©”μ„œλ“œ:
    • MoveNext(): λ‹€μŒ μš”μ†Œλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
    • Current: ν˜„μž¬ μš”μ†Œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • Reset(): 처음으둜 λŒμ•„κ°‘λ‹ˆλ‹€.

μ‚¬μš© 예제:

IEnumerator enumerator = myCollection.GetEnumerator();
while (enumerator.MoveNext())
{
    Console.WriteLine(enumerator.Current);
}

2.3 비ꡐ μš”μ•½

| ꡬ뢄 | Enumerable (IEnumerable) | Enumerator (IEnumerator) | |β€”β€”β€”β€”β€”β€”|——————————–|——————————–| | μ—­ν•  | μ»¬λ ‰μ…˜μ΄ 순회 κ°€λŠ₯함을 λ‚˜νƒ€λƒ„ | μ»¬λ ‰μ…˜μ˜ μš”μ†Œλ₯Ό ν•˜λ‚˜μ”© 순회 | | 제곡 λ©”μ„œλ“œ | GetEnumerator() | MoveNext(), Current | | μ‚¬μš© μ‹œμ  | foreach μ‹œμž‘ μ‹œ 호좜 | foreach λ‚΄λΆ€μ—μ„œ μš”μ†Œ μ ‘κ·Ό | | 관계 | μ—΄κ±°μžλ₯Ό λ°˜ν™˜ν•˜λŠ” μ—­ν•  | μ‹€μ œ 순회λ₯Ό μˆ˜ν–‰ν•˜λŠ” 객체 |


κ²°λ‘ 

  1. ComparerλŠ” μ™ΈλΆ€μ—μ„œ 비ꡐλ₯Ό μˆ˜ν–‰ν•˜λ©°, μ—¬λŸ¬ 기쀀을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  2. Comparable은 객체 λ‚΄λΆ€μ—μ„œ 비ꡐ 기쀀을 μ •μ˜ν•˜μ—¬ 객체 자체λ₯Ό 비ꡐ κ°€λŠ₯ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.
  3. Enumerable은 μ»¬λ ‰μ…˜μ΄ 순회 κ°€λŠ₯함을 λ‚˜νƒ€λ‚΄λ©°, Enumeratorλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  4. EnumeratorλŠ” μ»¬λ ‰μ…˜μ„ μ‹€μ œλ‘œ μˆœνšŒν•˜λŠ” 객체둜, MoveNext, Current, Reset을 톡해 순회λ₯Ό μ œμ–΄ν•©λ‹ˆλ‹€.