오버로딩(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으로 통일
- 예: 모든 공격 관련 함수(function)를
- 가독성: 코드가 더 깔끔하고 이해하기 쉬움
- 예:
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) 규칙
- 함수(function) 이름은 같아야 함
- 매개변수(variable)(parameter)의 타입(type)이나 개수가 달라야 함
- 반환(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; } // 컴파일 에러!