메서드 오버로딩(Method Overloading)을 활용하면 동일한 범위(scope) 안에서 같은 이름의 메서드를 여러 개 정의할 수 있습니다. 다만 컴파일러가 어떤 메서드를 호출해야 할지 구분할 수 있도록, 각 정의는 매개변수 목록에서 매개변수의 타입 또는 개수가 서로 달라야 한다는 조건이 있습니다.
그런데 선택적 매개변수(기본값이 있는 매개변수)를 함께 사용하면 의도치 않게 모호성(ambiguity) 문제가 발생할 수 있습니다. 이번 글에서는 정상적으로 동작하는 오버로딩 예제와, 모호성으로 인해 컴파일 오류가 발생하는 예제를 비교해 살펴보겠습니다.
정상적으로 동작하는 오버로딩 예제
아래 예제에서 DisplayMarks(97)처럼 인수를 하나만 전달하면, 컴파일러는 매개변수가 하나인 메서드가 이 호출에 가장 잘 맞는다고 판단하여 해당 메서드를 실행합니다.
using System;
class Student {
static void DisplayMarks(int marks1 = 90) {
Console.WriteLine("Method with one parameter!");
}
static void DisplayMarks(int marks1, int marks2 = 95) {
Console.WriteLine("Method with two parameters!");
}
static void Main() {
DisplayMarks(97);
}
}
실행 결과:
Method with one parameter!
흥미로운 점은, 두 번째 메서드도 사실상 이 호출과 호환된다는 것입니다. 두 번째 매개변수 marks2에 기본값 95가 자동으로 적용될 수 있기 때문입니다. 하지만 C#의 오버로드 해결 규칙에 따르면, 기본값 대체 없이 명시적인 인수만으로 호출 가능한 쪽, 즉 생략되는 선택적 매개변수가 더 적은 메서드가 우선 선택됩니다. 따라서 매개변수가 하나인 첫 번째 메서드가 호출되는 것입니다.
모호성이 발생하는 경우
이번에는 모호성(ambiguous call)이 발생하는 상황입니다. 아래 예제에서는 인수를 하나만 전달했을 때 두 메서드 모두 나머지 매개변수를 기본값으로 채워야 하며, 어느 쪽이 더 구체적인지 컴파일러가 판단할 수 없습니다. 그 결과 다음과 같은 컴파일 오류가 발생합니다.
error CS0121: The call is ambiguous between the following methods or properties...
using System;
class Student {
static void DisplayMarks(int marks1 = 90, int marks2 = 80) {
Console.WriteLine("Method with two parameters!");
}
static void DisplayMarks(int marks1, int marks2 = 80, int marks3 = 98) {
Console.WriteLine("Method with three parameters!");
}
static void Main() {
DisplayMarks(80);
}
}
모호성이 발생하는 이유
- 첫 번째 메서드는 인수 1개를 전달하면
marks1만 채워지고marks2는 기본값(80)으로 대체됩니다. - 두 번째 메서드 역시 인수 1개를 전달하면
marks2와marks3가 기본값으로 대체됩니다. - 즉, 두 메서드 모두 이 호출에 적용 가능하지만, 어느 쪽도 "더 적은 기본값 대체" 또는 "더 구체적인 매개변수 타입"으로 우위를 점할 수 없어 컴파일러가 호출 대상을 결정하지 못합니다.
모호성 해결 방법
- 메서드 이름 자체를 다르게 지정합니다. (예:
DisplayTotalMarks) - 매개변수의 타입을 다르게 하여 오버로드를 명확히 구분합니다.
- 선택적 매개변수 사용을 줄이고, 호출 시 필요한 인수를 명시적으로 모두 전달합니다.
결론적으로, 메서드 오버로딩은 코드의 가독성과 재사용성을 높이는 강력한 기능이지만, 선택적 매개변수와 함께 사용할 때는 호출 시점에 어떤 메서드가 선택될지 반드시 신중하게 검토해야 합니다. 모호한 호출 구조는 컴파일 오류로 이어질 수 있으므로, 오버로드 간 차이를 명확하게 설계하는 것이 좋습니다.