[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개의 좋아요