기본적으로 메서드의 모든 매개변수는 필수입니다. 하지만 선택적 매개변수(Optional Parameter)를 포함한 메서드는 호출 시 인수를 반드시 전달하지 않아도 됩니다. 즉, 일부 인수를 생략한 채로 메서드를 호출할 수 있습니다.
선택적 매개변수는 함수 정의 시점에 기본값(default value)을 가집니다. 호출 시 해당 인수를 전달하지 않으면 기본값이 사용되고, 값을 전달하면 기본값 대신 전달된 값이 적용됩니다.
C#에서 매개변수를 선택적으로 만드는 방법은 크게 두 가지가 있습니다.
1. 기본값(Default Value) 사용하기
매개변수 선언 시 등호(=)와 함께 기본값을 지정하면 해당 매개변수는 선택적이 됩니다.
예제
using System;
namespace DemoApplication{
class Demo{
static void Main(string[] args){
OptionalMethodWithDefaultValue(5);
// value2는 선택적이므로 전달하지 않음
OptionalMethodWithDefaultValue(5, 10);
// value2를 직접 전달
Console.ReadLine();
}
public static void OptionalMethodWithDefaultValue(int value1, int value2 = 5){
Console.WriteLine($"Sum is {value1 + value2}");
}
}
}출력 결과
Sum is 10 Sum is 15
위 예제에서 OptionalMethodWithDefaultValue(int value1, int value2 = 5) 메서드의 value2는 기본값 5를 가지고 있습니다. 따라서 호출 시 value2에 대한 인수를 전달하지 않으면 기본값 5가 사용되고(5 + 5 = 10), 인수를 전달하면 기본값이 무시되고 전달된 값이 적용됩니다(5 + 10 = 15).
2. [Optional] 특성(Attribute) 사용하기
System.Runtime.InteropServices 네임스페이스의 [Optional] 특성을 사용하면 기본값 없이도 매개변수를 선택적으로 만들 수 있습니다.
예제
using System;
using System.Runtime.InteropServices;
namespace DemoApplication{
class Demo{
static void Main(string[] args){
OptionalMethodWithDefaultValue(5);
OptionalMethodWithDefaultValue(5, 10);
Console.ReadLine();
}
public static void OptionalMethodWithDefaultValue(int value1, [Optional]int value2){
Console.WriteLine($"Sum is {value1 + value2}");
}
}
}출력 결과
Sum is 5 Sum is 15
여기서는 [Optional] 특성을 사용하여 value2를 선택적 매개변수로 지정했습니다. 주의할 점은 이 방식으로 선언된 매개변수에 값이 전달되지 않으면 해당 타입의 기본값(예: int의 경우 0)이 할당된다는 것입니다. 그래서 첫 번째 호출 결과가 "Sum is 5"로 출력됩니다.
선택적 매개변수의 위치 규칙
선택적 매개변수는 반드시 매개변수 목록의 맨 뒤에 위치해야 합니다. 필수 매개변수보다 앞에 선언하면 컴파일 오류가 발생합니다.
잘못된 예제
using System;
namespace DemoApplication{
class Demo{
static void Main(string[] args){
OptionalMethodWithDefaultValue(5);
OptionalMethodWithDefaultValue(5, 10);
Console.ReadLine();
}
public static void OptionalMethodWithDefaultValue(int value1 = 5, int value2){
Console.WriteLine($"Sum is {value1 + value2}");
}
}
}오류 메시지 − 선택적 매개변수는 모든 필수 매개변수 뒤에 나타나야 합니다.(Optional Parameters must appear after all required parameters.)
위 코드처럼 선택적 매개변수 value1 = 5가 필수 매개변수 value2보다 먼저 선언되면 컴파일러가 오류를 발생시킵니다. 따라서 메서드를 설계할 때는 항상 필수 매개변수를 먼저, 선택적 매개변수를 나중에 배치해야 합니다.