C# - 다형성: 초보자 가이드
안녕하세요, 야심 찬 프로그래머 여러분! 오늘 우리는 객체 지향 프로그래밍에서 가장 흥미로운 개념 중 하나인 다형성에 대해 다룰 것입니다. 큰 단어에 놀라지 마세요 - 이 튜토리얼이 끝나면 프로처럼 다형성을 활용할 수 있을 것입니다!
다형성이란 무엇인가?
먼저, 이 화려한 용어를 분해해 보겠습니다. "Poly"는 많은 것을 의미하며, "morph"는 형태를 의미합니다. 따라서 다형성은 많은 형태를 가지는 것입니다. 프로그래밍에서는 객체가 다른 형태를 취하고 문맥에 따라 다르게 행동할 수 있는 능력을 의미합니다.
상상해 보세요, 당신이 변신이 가능한 존재라면 (얼마나 멋질까요?). 인간이 될 수도 있고, 고양이가 될 수도 있고, 심지어 용이 될 수도 있습니다! 이것이 바로 다형성이 우리 코드에 허용하는 것 - 필요에 따라 다른 형태를 취하는 것입니다.
C#에서는 두 가지 주요 유형의 다형성을 가집니다:
- 정적 다형성(컴파일 타임 다형성)
- 동적 다형성(런타임 다형성)
이 두 가지를 자세히 탐구해 보겠습니다.
정적 다형성
정적 다형성은 컴파일러가 컴파일 타임에 어떤 메서드를 호출해야 하는지 알고 있을 때 발생합니다. 마치 집을 나가기 전에 입을 옷을 미리 정하는 것과 같습니다 - 미리 알고 있습니다!
함수 오버로딩
정적 다형성의 가장 일반적인 형태는 함수 오버로딩입니다. 이는 같은 이름을 가진 여러 메서드가 다른 매개변수를 가지는 것입니다.
다음은 예제입니다:
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public double Add(double a, double b)
{
return a + b;
}
public string Add(string a, string b)
{
return a + b;
}
}
이 예제에서 우리는 세 가지 Add
메서드를 가집니다:
- 두 개의 정수를 더하는 메서드
- 두 개의 실수를 더하는 메서드
- 두 개의 문자열을 결합하는 메서드
이제 Calculator
를 사용해 보겠습니다:
Calculator calc = new Calculator();
int sum1 = calc.Add(5, 3); // int 버전을 사용
double sum2 = calc.Add(3.14, 2.86); // double 버전을 사용
string sum3 = calc.Add("Hello, ", "World!"); // string 버전을 사용
Console.WriteLine(sum1); // 출력: 8
Console.WriteLine(sum2); // 출력: 6
Console.WriteLine(sum3); // 출력: Hello, World!
컴파일러는 우리가 전달한 인자의 타입에 따라 어떤 Add
메서드를 호출해야 하는지 알고 있습니다. 마치 다용도 도구인瑞士军刀처럼 - 하나의 도구, 여러 가지 사용!
동적 다형성
동적 다형성은 런타임에 어떤 메서드를 호출해야 하는지 결정하는 것입니다. 마치 무대에서 즉흥 연기하는 것과 같습니다 - 순간에 따라 무엇을 할지 결정합니다!
동적 다형성의 핵심은 virtual
과 override
키워드의 사용입니다. 다음은 예제입니다:
public class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("The animal makes a sound");
}
}
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("The dog barks: Woof! Woof!");
}
}
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("The cat meows: Meow! Meow!");
}
}
이 예제에서 우리는 기본 Animal
클래스와 가상의 MakeSound
메서드를 가집니다. Dog
과 Cat
클래스는 Animal
을 상속하고 MakeSound
메서드를 오버라이드합니다.
이제 동적 다형성을 실제로 보겠습니다:
Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();
myAnimal.MakeSound(); // 출력: The animal makes a sound
myDog.MakeSound(); // 출력: The dog barks: Woof! Woof!
myCat.MakeSound(); // 출력: The cat meows: Meow! Meow!
myDog
과 myCat
은 Animal
타입으로 선언되었지만, 여전히 자신의 MakeSound
메서드를 사용합니다. 이것이 동적 다형성의 마법입니다!
다형성의 힘
다형성은 우리가 더 유연하고 재사용 가능한 코드를 작성할 수 있게 합니다. 상상해 보세요, 다양한 캐릭터를 가진 게임을 만들고 있는 중입니다. 각 캐릭터는 다른 방식으로 이동할 수 있습니다:
public class Character
{
public virtual void Move()
{
Console.WriteLine("The character moves.");
}
}
public class Warrior : Character
{
public override void Move()
{
Console.WriteLine("The warrior charges forward!");
}
}
public class Mage : Character
{
public override void Move()
{
Console.WriteLine("The mage teleports.");
}
}
public class Rogue : Character
{
public override void Move()
{
Console.WriteLine("The rogue sneaks silently.");
}
}
이제 캐릭터 목록을 가지고 모두 이동시킬 수 있습니다:
List<Character> characters = new List<Character>
{
new Warrior(),
new Mage(),
new Rogue()
};
foreach (var character in characters)
{
character.Move();
}
// 출력:
// The warrior charges forward!
// The mage teleports.
// The rogue sneaks silently.
이것이 다형성의 아름다움 - 우리는 모든 캐릭터를 Character
객체로 취급할 수 있지만, 각각은 자신만의 독특한 방식으로 행동합니다.
다형성 메서드 요약
다음은 우리가 다루었던 다형성 메서드의 빠른 참조 표입니다:
메서드 | 타입 | 설명 |
---|---|---|
함수 오버로딩 | 정적 | 같은 이름을 가진 여러 메서드가 다른 매개변수를 가지는 것 |
가상/오버라이드 | 동적 | 기본 클래스가 가상 메서드를 정의하고, 파생 클래스가 이를 오버라이드 |
결론
축하합니다! 다형성의 세계로 첫 걸음을 내디디셨습니다. 새로운 기술을 배우는 것처럼, 다형성을 마스터하기 위해서는 연습이 필요합니다. 즉시 이해가 되지 않더라도 - 계속 코딩하고, 실험하고, 곧 당신은 진정한 프로그래밍 변신자가 될 것입니다!
마무리로, 작은 프로그래밍 장난을 하나 드릴게요: 왜 프로그래머들은 다크 모드를 좋아할까요? 빛이 벌레를吸引了!
미래의 다형성 마스터 여러분, 행복하게 코딩하세요!
Credits: Image by storyset