이전 포스팅에서 OOP란 무엇인지, 왜 사용해야 하는지, 그리고 OOP의 핵심개념 4가지에는 무엇이 있는지 알아 보았고, 캡슐화란 무엇인지 알아 보았다.
https://nybot-house.tistory.com/104
이번 포스팅에서는 OOP(Object Oriented Programming)의 핵심 개념 중 하나인 다형성에 대해서 알아 보자.
다형성이란
객체지향 프로그래밍(OOP)에서 다형성은 객체가 여러 형태를 가질 수 있는 능력을 의미한다. 한국말로 직관적으로 다양한 형태를 가진다는 뜻으로 이해가 가능하다. 즉 컴퓨터 프로그래밍의 다양한 변수, 객체, 메서드(함수) 등이 서로 다양한 형에 속하는 것이 허가되는 성질을 말하는 것이다. 이 다형성은 주로 두 가지 형태로 나타난다. 컴파일 타임 다형성(오버로딩)과 런타임 다형성(오버라이딩).
오버로딩(컴파일 타임 다형성)
오버로딩은 같은 이름의 함수를 여러 개 가지되, 매개변수의 종류나 개수가 다르게 하여 여러 상황에서 사용할 수 있도록 하는 기법이다. 즉, 하나의 함수 이름으로 여러 기능을 할 수 있게 하는 것.
간단한 오버로딩 예시
화이트보드에 사용하는 마커를 생각해보자. 화이트보드에 마커를 이용해서 무언가를 쓰는 행위를, '마커를 사용한다'고 말할 수 있다. 하지만 우리는 어떤 때는 큰 글씨를 쓰고 싶고, 어떨 때는 작은 글씨를 쓰고 싶을 수도 있다. 이를 프로그래밍에 적용해 보면, 아래와 같이 된다.
void Draw(string text) {
Console.WriteLine("Drawing text: " + text);
}
void Draw(string text, int size) {
Console.WriteLine("Drawing text of size " + size + ": " + text);
}
오버로딩은 이처럼 같은 이름의 메서드에 서로 다른 매개변수를 사용하여 다양한 기능을 할 수 있게 해 주므로, 이 외에도 'Draw' 함수를 추가로 오버로드하여 다양한 입력에 따른 행동을 할 수 있다.
오버라이딩 (런타임 다형성)
오버라이딩은 상속받은 클래스에서 부모 클래스의 함수를 새로운 방식으로 재정의하는 것을 말한다. 부모 클래스의 기능을 자식 클래스가 필요에 따라 바꿔서 사용할 수 있다.
간단한 오버라이딩 예시
자전거를 생각해 보자. 일반적으로 자전거는 페달을 밟아서 앞으로 나간다. 그러나 전기 자전거는 페달을 밟을 필요 없이 전기 모터의 힘만으로 앞으로 나갈 수 있다.
public class Bicycle {
public virtual void Move() {
Console.WriteLine("Moving forward by pedaling.");
}
}
public class ElectricBicycle : Bicycle {
public override void Move() {
Console.WriteLine("Moving forward using electric power.");
}
}
'ElectricBicycle' 클래스는 'Bicycle' 클래스를 상속받고 'Move'메서드를 오버라이딩하여 자전거의 이동 방식을 전기 모터 방식으로 변경한다.
이렇게만 말하면 와 닿지 않을 수 있으니 실제 게임 개발 예시를 통해 살펴보자 (필자는 Unity 게임 개발자이기 때문에 관련 예시로 살펴보도록 하겠다). 다형성은 게임 개발에서 다양한 객체나 행동들을 관리할 때 유용하게 사용되는데, 예를 들어 보면 여러 종류의 적이나 아이템을 다루는 데 있어서 각 객체의 특성을 적절히 적용할 수 있도록 한다.
유니티 게임 개발로 알아보는 다형성 예시
1단계: 적 기본 클래스 생성
public abstract class Enemy {
public abstract void Attack();
}
이 클래스는 추상 클래스로, 모든 적들이 공격하는 방식을 정의하는 'Attack' 메서드를 포함한다.
2단계: 구체적인 적 클래스 정의
public class Zombie : Enemy {
public override void Attack() {
Debug.Log("Zombie attacks by biting.");
}
}
public class Robot : Enemy {
public override void Attack() {
Debug.Log("Robot attacks by shooting.");
}
}
위 코드에서 'Zombie'와 'Robot' 클래스는 'Enemy'의 'Attack' 메서드를 각각 다른 방식으로 구현(오버라이드)한다.
3단계: 게임 내에서 다형성 사용
public class GameManager {
private List<Enemy> enemies = new List<Enemy>();
public GameManager() {
enemies.Add(new Zombie());
enemies.Add(new Robot());
}
public void AttackAll() {
foreach (var enemy in enemies) {
enemy.Attack(); // 다형성을 통해 각 적의 고유한 공격 방식 실행
}
}
}
이 코드는 'GameManager' 클래스에서 모든 적들이 각자의 공격 방식으로 공격할 수 있게 한다.
'Attack' 메서드 호출 시, 런타임에 결정되는 각 객체의 실제 클래스에 따라 적절한 메서드가 실행된다.
이런 다형성의 사용은 코드의 유연성과 확장성을 크게 향상시키며, 유지보수를 용이하게 만든다.
'C# 기초 프로그래밍 > C# Basic' 카테고리의 다른 글
[C# Basics] 재귀 함수 (0) | 2024.06.11 |
---|---|
[C# Basics] 캡슐화 / 은닉성 - OOP 의 핵심 개념(객체 지향 프로그래밍) (0) | 2024.04.12 |
[C# Basics] 객체지향 OOP란 무엇인가? - 핵심 4개념과 개론 (0) | 2024.04.12 |
[C# Basics] 생성자 Constructor (0) | 2024.04.02 |
[C# Basics] 스택과 힙 정리 - feat.복사와 참조, value, reference (0) | 2024.04.01 |
<C# Basics> 복사와 참조 (struct, class의 차이, 깊은 복사) (0) | 2023.12.23 |
<C# Basics> ref, out 키워드 (0) | 2023.12.11 |
<C# Basics> 함수/메서드 (2) | 2023.12.11 |