[C#] 기본 인터페이스 메서드의 활용

C# 8에서 추가된 기본 인터페이스 메서드은 일반적인 활용도가 딱히 떠오르지 않는데요, 다음의 글을 댓글을 통해

기본 인터페이스 메서드를 사용해서 구현체의 구현 없이 동작하도록 만들 수 있고
이후 구현체에서 이 인터페이스를 구현해서 성능을 좀 더 올릴 수 있는 시나리오입니다.

using System.Collections;

var e = new Enum();
Test1(e);


static void Test1<T>(IEnum<T> enums)
{
    Console.WriteLine($"Count: {enums.NewCount()}");

    foreach (var n in enums)
        Console.WriteLine(n);
}


interface IEnum<T> : IEnumerable<T>
{

    int NewCount()
    {
        var count = 0;
        foreach (var i in this)
            count++;
        return count;
    }
}

class Enum : IEnum<int>
{
    private readonly List<int> _list = new() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

//    int IEnum<int>.NewCount() => _list.Count;

    public IEnumerator<int> GetEnumerator() => _list.GetEnumerator();

    IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator();
}

| 결과

Count: 10
1
2
3
4
5
6
7
8
9
10

기본 인터페이스 구현체에 의해 Count()가 구현되어 바로 사용할 수 있습니다.

이후에 주석 처리된 int IEnum<int>.NewCount() => _list.Count;를 구현함으로써 동일한 결과를 좀 더 나은 성능으로 처리할 수 있게 되는데요,

이런 대표적인 예가 LINQ가 되는 것입니다.

좋아요 4

제가 잘 모르는 부분인 것 같아서 궁금한점이 있습니다.

List 의 Count가

foreach (var i in this)

보다 어떤점이 느린부분인지 혹시 이유를 알 수 있을까요?

제가 알기로 List의 Count 속성은 그냥 기존의 Size를 이용해서 처리하는 걸로 알고 있는데
잘못 알고 있는건지 궁금합니당

좋아요 3

IEnum의 구현체인 Enum에서 열거자를 이용한 IEnum.NewCount()를 그대로 사용하는 방법도 있고 내부 리스트의 Count를 반환하는 식으로 구현함으로써 성능을 올리는 식으로 기본 인터페이스 메소드를 활용할 수 있다는 의미 같네유.

좋아요 3

아 요소 갯수를 계산하는 로직의 성능차이가 아닌

새로 구현된 메서드를 사용하느냐 직접 바로 인터페이스 기본 메서드를 호출해서 사용하느냐에 대한

메서드 접근 관점의 성능을 뜻하는거였나 보군요

좋아요 3

제가 맞게 이해했는지는 모르겠지만 Enum에서 NewCount()를 구현하지 않는다면 외부에서 Enum.NewCount()를 호출할 때 시퀀스를 일일히 순회하게 되는데, List로 동작함에도 불구하고 Count 프로퍼티를 통하지 않고 열거자를 통한 NewCount를 그대로 사용흐면 성능에 불이익이 있으니까

IEnum를 구현하는 여러 클래스에서 List를 통하는 등 성능 향상이 가능한 구현체에서는 NewCount를 새로 구현해서 사용할 수 있고, 그렇지 않다면 일일히 구현할 필요없이 IEnum에서 이미 정의한 기본 인터페이스 메소드를 그대로 사용할 수 있다는 것으로 보면 될 것 같아요.

예시는 LINQ지만 공통된 동작을 상황에 따라 다른 로직으로 구현할 수 있는 경우에 이런 식으로 활용할 수 있을 것 같네요

좋아요 3

아…
제가 잠시 본문 글을 잘못 이해 하고 있었습니다.ㅠ (부끄럽네요)

좋아요 3

아닙니다. 제가 글을 잘 이해하도록 잘 썼어야 하는데… 말입죠;

좋아요 3