0Pricing
C# Academy · 강의

다형성과 동적 디스패치

다형성을 이해합니다. 기본 클래스 참조를 통해 가상 멤버를 호출하고, 기본 타입 컬렉션을 사용하며, 메서드 숨기기를 피하고, 필요할 때 안전하게 캐스팅합니다.

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

다형성 개요

목표: 하나의 기반 형식을 사용하고 파생 형식이 동작을 사용자 지정하도록 합니다.

  • 기반 reference와 파생 개체
  • virtual + override → 동적 디스패치
  • 기반 형식으로 지정된 컬렉션
  • new 메서드 숨김을 피합니다

동적 디스패치 기초

virtual 메서드를 호출하면 변수의 컴파일 시 형식이 아니라 개체의 런타임 형식을 사용합니다.

using System;

public class Animal
{
  public virtual string Speak() { return "???"; }
}

public class Cat : Animal
{
  public override string Speak() { return "Meow"; }
}

public class Dog : Animal
{
  public override string Speak() { return "Woof"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Animal a1 = new Cat(); // base reference
    Animal a2 = new Dog();
    Console.WriteLine(a1.Speak()); // Meow
    Console.WriteLine(a2.Speak()); // Woof
  }
}

컬렉션에서의 다형성

서로 다른 파생 형식을 List<Base>에 저장하고 virtual 멤버를 동일한 방식으로 호출합니다.

using System;
using System.Collections.Generic;

public class Shape
{
  public virtual double Area() { return 0.0; }
}

public class Rectangle : Shape
{
  private readonly int _w, _h;
  public Rectangle(int w, int h) { _w = w; _h = h; }
  public override double Area() { return _w * _h; }
}

public class Circle : Shape
{
  private readonly int _r;
  public Circle(int r) { _r = r; }
  public override double Area() { return 3.14159 * _r * _r; }
}

public class Program
{
  public static void Main(string[] args)
  {
    List<Shape> shapes = new List<Shape>();
    shapes.Add(new Rectangle(3, 4));
    shapes.Add(new Circle(2));

    foreach (Shape s in shapes)
    {
      Console.WriteLine("Area = " + s.Area()); // calls correct override
    }
  }
}

숨김과 override 비교

메서드 숨김(new)을 피합니다. 실제 다형성에는 override를 사용합니다. 숨김을 사용하면 기반 reference를 통해 기반 버전이 호출됩니다.

using System;

public class Printer
{
  public virtual void Print() { Console.WriteLine("[Base]"); }
}

public class LoudPrinter : Printer
{
  public override void Print() { Console.WriteLine("[LOUD]"); }
}

public class HiddenPrinter : Printer
{
  // Hides the base method instead of overriding (BAD fit for polymorphism)
  public new void Print() { Console.WriteLine("[HIDDEN]"); }
}

public class Program
{
  public static void Main(string[] args)
  {
    Printer a = new LoudPrinter();
    Printer b = new HiddenPrinter();

    a.Print(); // [LOUD]  (override works)
    b.Print(); // [Base]  (hiding fails via base reference)
  }
}

안전한 캐스팅 (as + 확인)

기반 형식이나 virtual 호출을 우선합니다. 파생 형식에만 있는 멤버를 사용해야 한다면 안전하게 캐스팅합니다(as + null 확인).

using System;

public class Vehicle
{
  public virtual string Info() { return "Vehicle"; }
}

public class Car : Vehicle
{
  public bool HasAirConditioning;
  public override string Info() { return "Car"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Vehicle v = new Car();
    Console.WriteLine(v.Info()); // polymorphic call

    // Need a Car-only member? Cast carefully using 'as'
    Car c = v as Car;
    if (c != null)
    {
      c.HasAirConditioning = true;
      Console.WriteLine("AC set: " + c.HasAirConditioning);
    }
    else
    {
      Console.WriteLine("Not a Car");
    }
  }
}

다형성 팁

팁:

  • 먼저 기반 형식과 virtual 호출을 기준으로 설계합니다.
  • 동작을 변경할 때는 new가 아니라 override를 사용합니다.
  • 기반 APIs는 작고 안정적으로 유지합니다.
  • 캐스팅은 드물게 사용하고 다형성이나 인터페이스를 우선합니다.

동적 디스패치의 의미

빠르게 확인해 보겠습니다. C#에서 동적 디스패치란 무엇을 의미합니까?

복습

복습: 다형성을 사용하면 하나의 기반 호출이 virtual/override를 통해 여러 파생 동작으로 연결됩니다. 기반 형식 컬렉션을 사용하고 new 숨김을 피하며, 필요한 경우에만 캐스팅합니다.

자주 묻는 질문

“다형성과 동적 디스패치” 강의는 무료인가요?

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

“다형성과 동적 디스패치”에서 뭘 배우나요?

다형성을 이해합니다. 기본 클래스 참조를 통해 가상 멤버를 호출하고, 기본 타입 컬렉션을 사용하며, 메서드 숨기기를 피하고, 필요할 때 안전하게 캐스팅합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“다형성과 동적 디스패치” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

  1. virtual/override/sealed, 추상 클래스
  2. 인터페이스(입문)와 다중 인터페이스 구현
  3. 다형성과 동적 디스패치
← C# Academy(으)로 돌아가기