0Pricing
C# Academy · 강의

제네릭 인터페이스

형식에 추상화를 적용해 보세요.

제네릭 인터페이스은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

제네릭 인터페이스란 무엇인가

제네릭 인터페이스는 이름 뒤의 꺾쇠괄호 안에 형식 매개변수를 선언합니다. 구현하는 형식이 구체적인 형식을 선택하면 인터페이스 계약도 그에 맞게 적용됩니다.

.NET 라이브러리는 이를 어디서나 사용하며, 예를 들어 IEnumerable<T>와 IComparable<T>가 있습니다.

interface IRepository<T>
{
    void Add(T item);
    T Get(int id);
}

제네릭 인터페이스 구현하기

클래스는 구체적인 형식 인수를 제공하여 제네릭 인터페이스를 구현할 수 있습니다. 그러면 메서드 시그니처에서 실제 형식을 사용하게 됩니다.

이를 통해 캐스팅 없이 형식 안전하고 재사용 가능한 계약을 만들 수 있습니다.

using System.Collections.Generic;

class IntStore : IRepository<int>
{
    private readonly List<int> data = new();
    public void Add(int item) => data.Add(item);
    public int Get(int id) => data[id];
}

interface IRepository<T>
{
    void Add(T item);
    T Get(int id);
}

구현 클래스에서 제네릭 유지하기

클래스 자체는 제네릭으로 유지하면서 제네릭 인터페이스를 구현하고, 자신의 형식 매개변수를 인터페이스에 전달할 수 있습니다.

이렇게 하면 어떤 요소 형식에도 구현을 재사용할 수 있습니다.

using System.Collections.Generic;

class Store<T> : IRepository<T>
{
    private readonly List<T> data = new();
    public void Add(T item) => data.Add(item);
    public T Get(int id) => data[id];
}

interface IRepository<T> { void Add(T item); T Get(int id); }

IComparable<T> 활용

IComparable<T>는 기본 제공되는 제네릭 인터페이스입니다. 이를 구현하면 형식에서 인스턴스의 정렬 순서를 정의할 수 있으므로 정렬이 가능해집니다.

CompareTo 메서드는 음수, 0 또는 양수를 반환합니다.

class Money : IComparable<Money>
{
    public int Cents;
    public int CompareTo(Money? other)
        => Cents.CompareTo(other?.Cents ?? 0);
}

IEnumerable<T> 구현하기

IEnumerable<T>는 LINQ와 foreach의 핵심입니다. 이를 구현하는 형식은 반복할 수 있습니다. 내부 컬렉션의 반복자에 처리를 위임하는 경우가 많습니다.

yield return을 사용하는 반복자 메서드를 이용하면 쉽게 구현할 수 있습니다.

using System.Collections;
using System.Collections.Generic;

class Bag<T> : IEnumerable<T>
{
    private readonly List<T> items = new();
    public void Add(T x) => items.Add(x);
    public IEnumerator<T> GetEnumerator() => items.GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

실행 가능한 제네릭 인터페이스

이 완전한 프로그램은 제네릭 IPrinter<T>를 정의하고 문자열에 대해 구현한 다음 사용합니다.

이 인터페이스는 구체적인 형식에 관계없이 Print 메서드가 있음을 보장합니다.

using System;

interface IPrinter<T> { void Print(T value); }

class ConsolePrinter<T> : IPrinter<T>
{
    public void Print(T value) => Console.WriteLine(value);
}

class Program
{
    static void Main()
    {
        IPrinter<string> p = new ConsolePrinter<string>();
        p.Print("hello generics");
    }
}

out을 사용한 공변성

out으로 표시된 제네릭 인터페이스 매개변수는 공변적이며 출력 위치에만 나타납니다. 따라서 IEnumerable<Cat>이 필요한 곳에서 IEnumerable<Animal>을 사용할 수 있습니다.

공변성은 상속 계층을 따라 할당 호환성을 유지합니다.

interface IProducer<out T>
{
    T Produce();
}

in을 사용한 반공변성

in으로 표시된 매개변수는 반공변적이며 입력 위치에만 나타납니다. 따라서 IComparer<Animal>이 필요한 곳에서 IComparer<Cat>을 사용할 수 있습니다.

반공변성은 소비자에 대한 할당 가능성의 방향을 뒤집습니다.

interface IConsumer<in T>
{
    void Consume(T item);
}

여러 형식 매개 변수

제네릭 인터페이스는 둘 이상의 매개 변수를 받을 수 있습니다. IDictionary<TKey, TValue>는 키 형식과 값 형식을 별도로 사용하는 익숙한 예입니다.

각 매개 변수는 독립적으로 불변, 공변 또는 반공변이 될 수 있습니다.

interface IMapper<TIn, TOut>
{
    TOut Map(TIn input);
}

인터페이스 기반 프로그래밍

구체적인 클래스 대신 제네릭 인터페이스에 의존하면 코드가 유연해집니다. 호출하는 코드를 변경하지 않고도 구현을 바꿀 수 있습니다.

IEnumerable<T> 형식의 메서드 매개 변수는 목록, 배열, 쿼리 결과를 모두 동일하게 받을 수 있습니다.

using System.Collections.Generic;
using System.Linq;

int Total(IEnumerable<int> values) => values.Sum();

제네릭 인터페이스를 사용한 제약 조건

제네릭 인터페이스는 제약 조건으로 자주 사용됩니다. where T : IComparable<T>를 사용하면 메서드에서 입력값을 정렬하거나 비교할 수 있습니다.

이는 안전하고 재사용 가능한 알고리즘을 위해 두 가지 제네릭 기능을 결합합니다.

T Min<T>(T a, T b) where T : IComparable<T>
    => a.CompareTo(b) <= 0 ? a : b;

빠른 확인

제네릭 인터페이스에 대한 이해도를 확인해 보세요.

복습

제네릭 인터페이스는 형식 매개 변수를 선언하고, 구현하는 형식에서 이를 고정하거나 전달할 수 있도록 합니다. 기본 제공 예로는 IEnumerable<T>, IComparable<T>, IDictionary<TKey, TValue>가 있습니다.

공변성과 반공변성을 사용할 수 있도록 out 및 in 주석을 지정할 수 있으며, 제네릭 인터페이스는 where 제약 조건과 자연스럽게 함께 사용할 수 있습니다.

자주 묻는 질문

“제네릭 인터페이스” 강의는 무료인가요?

네 — “제네릭 인터페이스” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“제네릭 인터페이스”에서 뭘 배우나요?

형식에 추상화를 적용해 보세요. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“제네릭 인터페이스” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 제네릭 메서드
  2. 제네릭 클래스
  3. where 제약
  4. 제네릭 인터페이스
← C# Academy(으)로 돌아가기