함수 오버로딩

C#의 함수 오버로딩을 학습합니다. 같은 이름이지만 매개변수가 다른 여러 함수를 만드는 방법을 이해합니다.

오버로딩(overloading)이란?

같은 이름의 함수(function)를 여러 개 만들되, 매개변수(variable)(parameter)의 타입(type)이나 개수가 다르면 구분할 수 있습니다. 이를 함수(function) 오버로딩(Overloading)이라고 합니다. Unity에서 다양한 상황에 맞는 함수(function)를 만들 때 매우 유용합니다.

public class Player : MonoBehaviour
{
    // 매개변수가 2개인 경우: 기본 데미지와 무기 공격력
    int CalculateDamage(int baseDamage, int weaponPower)
    {
        return baseDamage + weaponPower;
    }
    
    // 매개변수가 1개인 경우 (오버로딩): 기본 데미지만
    int CalculateDamage(int baseDamage)
    {
        return baseDamage;  // 무기 없이 기본 데미지만
    }
    
    // 매개변수 타입이 다른 경우 (오버로딩): float 타입
    float CalculateDamage(float baseDamage, float weaponPower)
    {
        return baseDamage + weaponPower;  // 소수점 데미지 계산
    }
    
    // 매개변수가 3개인 경우: 크리티컬 배율 추가
    int CalculateDamage(int baseDamage, int weaponPower, float criticalMultiplier)
    {
        int total = baseDamage + weaponPower;
        return Mathf.RoundToInt(total * criticalMultiplier);
    }
}

사용 예시

void Start()
{
    // 무기 있는 경우
    int damage1 = CalculateDamage(10, 5);  // 15 (int, int)
    Debug.Log("데미지: " + damage1);
    
    // 무기 없는 경우
    int damage2 = CalculateDamage(10);  // 10 (int)
    Debug.Log("데미지: " + damage2);
    
    // 소수점 데미지
    float damage3 = CalculateDamage(10.5f, 5.2f);  // 15.7 (float, float)
    Debug.Log("데미지: " + damage3);
    
    // 크리티컬 포함
    int damage4 = CalculateDamage(10, 5, 2.0f);  // 30 (크리티컬 2배)
    Debug.Log("크리티컬 데미지: " + damage4);
}

오버로딩(overloading)의 장점

  • 유연성: 같은 기능이지만 다른 타입(type)이나 개수의 값을 받을 수 있음
    • 예: Attack() - 기본 공격, Attack(int damage) - 데미지 지정 공격
  • 편의성: 함수(function) 이름을 하나로 통일할 수 있어 기억하기 쉬움
    • 예: 모든 공격 관련 함수(function)Attack으로 통일
  • 가독성: 코드가 더 깔끔하고 이해하기 쉬움
    • 예: Attack(), Attack(target), Attack(target, damage) 모두 같은 의미

게임 개발에서의 실제 활용:

public class CombatSystem : MonoBehaviour
{
    // 기본 공격
    void Attack()
    {
        Attack(GetDefaultDamage());
    }
    
    // 타겟 지정 공격
    void Attack(GameObject target)
    {
        Attack(target, GetDefaultDamage());
    }
    
    // 타겟과 데미지 지정 공격
    void Attack(GameObject target, int damage)
    {
        Enemy enemy = target.GetComponent<Enemy>();
        if (enemy != null)
        {
            enemy.TakeDamage(damage);
        }
    }
    
    int GetDefaultDamage() { return 10; }
}

오버로딩(overloading) 규칙

  1. 함수(function) 이름은 같아야 함
  2. 매개변수(variable)(parameter)의 타입(type)이나 개수가 달라야 함
  3. 반환(return) 타입(type)만 다르면 오버로딩(overloading) 불가 (에러(error) 발생)
// ✅ 가능: 매개변수 개수가 다름
int Add(int a, int b) { return a + b; }
int Add(int a, int b, int c) { return a + b + c; }

// ✅ 가능: 매개변수 타입이 다름
int Add(int a, int b) { return a + b; }
float Add(float a, float b) { return a + b; }

// ❌ 불가능: 반환 타입만 다름 (에러!)
int Add(int a, int b) { return a + b; }
float Add(int a, int b) { return a + b; }  // 컴파일 에러!

← 목차로 돌아가기