0Pricing
C# Academy · 강의

인터페이스와 델리게이트의 변성(in/out)

C#의 변성을 이해합니다. 인터페이스와 델리게이트에서 생산자(공변성)에는 out 을, 소비자(반공변성)에는 in 을 사용합니다.

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

변성 개요

변성을 사용하면 제네릭 인터페이스와 대리자가 상속과 함께 동작할 수 있습니다.

  • out = 공변성(생산자)
  • in = 반공변성(소비자)
  • API가 T를 생성만 하거나 소비만 할 때 안전합니다.

공변성 데모

IEnumerable<out T>은 공변입니다. 고양이 시퀀스는 동물 시퀀스가 필요한 곳에서 사용할 수 있습니다.

using System;
using System.Collections.Generic;

public class Animal { public virtual string Name() { return "animal"; } }
public class Cat : Animal { public override string Name() { return "cat"; } }

public class Program
{
  static void PrintAll(IEnumerable<Animal> animals)
  {
    foreach (Animal a in animals)
    {
      Console.WriteLine(a.Name());
    }
  }

  public static void Main(string[] args)
  {
    List<Cat> cats = new List<Cat>();
    cats.Add(new Cat());
    // IEnumerable<Cat> -> IEnumerable<Animal> is allowed (out T)
    PrintAll(cats);
  }
}

반공변성 데모

IComparer<in T>은 반공변입니다. Animal용 비교자는 T를 소비하기만 하므로 Cat에도 작동합니다.

using System;
using System.Collections.Generic;

public class Animal { public string N; public Animal(string n){ N=n; } }
public class Cat : Animal { public Cat(string n) : base(n) {} }

// Comparer can compare any Animals
public class AnimalNameComparer : IComparer<Animal>
{
  public int Compare(Animal x, Animal y)
  {
    return string.Compare(x == null ? "" : x.N, y == null ? "" : y.N, StringComparison.Ordinal);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    List<Cat> cats = new List<Cat>();
    cats.Add(new Cat("Miso"));
    cats.Add(new Cat("Ada"));
    // IComparer<Animal> can be used as IComparer<Cat> (in T)
    cats.Sort(new AnimalNameComparer());
    foreach (Cat c in cats) Console.WriteLine(c.N);
  }
}

대리자 변성

대리자도 변성을 지원합니다. Func<out TResult>는 생산자이고 Action<in T>는 소비자입니다.

using System;

public class Animal { public virtual string Speak(){ return "???"; } }
public class Cat : Animal { public override string Speak(){ return "meow"; } }

public class Program
{
  static Animal MakeAnimal() { return new Animal(); }
  static void HandleAnimal(Animal a) { Console.WriteLine(a.Speak()); }

  public static void Main(string[] args)
  {
    // Func<Cat> can be used where Func<Animal> is expected? Yes, because TResult is out.
    Func<Animal> maker = new Func<Cat>(delegate { return new Cat(); });
    Console.WriteLine(maker().Speak());

    // Action<Animal> can be used where Action<Cat> is expected? Yes, because T is in.
    Action<Cat> catSink = new Action<Animal>(HandleAnimal);
    catSink(new Cat());
  }
}

사용자 지정 변형 인터페이스

설계 규칙: 생산자 전용 매개변수는 out으로, 소비자 전용 매개변수는 in으로 표시하여 안전한 변환을 사용할 수 있게 하십시오.

using System;

// Producer-only interface: out T
public interface ISource<out T>
{
  T Get();
}

// Consumer-only interface: in T
public interface ISink<in T>
{
  void Put(T item);
}

public class Animal { public string N; }
public class Cat : Animal { }

public class CatSource : ISource<Cat>
{
  public Cat Get() { return new Cat(); }
}

public class AnimalSink : ISink<Animal>
{
  public void Put(Animal a) { Console.WriteLine("Got animal"); }
}

public class Program
{
  public static void Main(string[] args)
  {
    ISource<Animal> animals = new CatSource(); // out T allows upcast
    ISink<Cat> cats = new AnimalSink();        // in T allows down-assign
    animals.Get();
    cats.Put(new Cat());
  }
}

변성 팁

팁:

  • out 매개변수는 출력 위치(반환 형식, 공변 위치)에만 나타날 수 있습니다.
  • in 매개변수는 입력 위치(메서드 매개변수)에만 나타날 수 있습니다.
  • 변성을 선언할 때 같은 T에 대해 생산과 소비를 섞지 마십시오.
  • 변성은 인터페이스와 대리자에 적용되며 클래스에는 적용되지 않습니다.

공변성 키워드

간단한 확인: 인터페이스나 대리자의 공변 형식 매개변수를 표시하는 키워드는 무엇입니까?

복습

복습: 인터페이스와 대리자에서 생산자에는 out(공변성)을, 소비자에는 in(반공변성)을 사용하십시오. 안전한 변환을 위해 API를 단방향으로 유지하십시오.

자주 묻는 질문

“인터페이스와 델리게이트의 변성(in/out)” 강의는 무료인가요?

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

“인터페이스와 델리게이트의 변성(in/out)”에서 뭘 배우나요?

C#의 변성을 이해합니다. 인터페이스와 델리게이트에서 생산자(공변성)에는 out 을, 소비자(반공변성)에는 in 을 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“인터페이스와 델리게이트의 변성(in/out)” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. 제네릭 메서드와 타입, 제약 조건
  2. 인터페이스와 델리게이트의 변성(in/out)
  3. 널 허용 참조 형식(이해) 및 주석(C# 6 패턴)
← C# Academy(으)로 돌아가기