옵셔널 위치 매개변수도 앞서 살펴본 명명된 매개변수처럼 값은 선택이므로 전달받지 않을 수 있습니다. 그러나 값을 전달할 때는 이름 대신 매개변수가 선언된 순서(위치)에 맞게 호출해야 합니다. 즉, 옵셔널 위치 매개변수로 선언된 함수는 데이터 전달은 자유지만 순서는 맞춰서 호출해야 합니다.
void some( [String name = 'hello', int age = 10 ] ) {
print('name: $name, age: $age');
some('world', 20);
}
옵셔널 위치 매개변수를 선언하는 규칙을 정리하면 다음과 같습니다.
- 매개변수들을 대괄호로 묶는다.
- 함수의 마지막 매개변수에만 사용할 수 있다.
- 매개변수에 기본 인자를 설정할 수 있다.
그리고 옵셔널 위치 매개변수를 포함하는 함수는 다음과 같은 규칙을 지켜 호출합니다.
- 매개변수 이름은 생략한다.
- 매개변수가 선언된 순서에 따라 값이 할당된다.
만약 다음처럼 옵셔널 위치 매개변수를 포함하는 some() 함수를 선언했다고 가정해 보겠습니다. arg2와 arg3에 기본 인자를 설정했습니다.
// 옵셔널 위치 매개변수 선언
void some(int arg1, [String arg2 = 'hello', bool arg3 = false]) { }
이렇게 선언된 함수는 다음처럼 호출할 수 있습니다. 오류가 발생하는 호출문과 성공하는 호출문을 비교해 보면서 각자 원인을 찾아 보세요.
// 옵셔널 위치 매개변수 호출
(1) some(); // 오류
(2) some(10); // 성공
(3) some(10, arg2: 'world' , arg3: true); // 오류
(4) some(10, 'world', true); // 성공
(5) some(10, true, 'world'); // 오류
(6) some(10, 'world'); // 성공
(7) some(10, true); // 오류
옵셔널 위치 매개변수도 값 전달을 생략할 수 있지만(2) 일반 매개변수는 생략할 수 없습니다(1). 만약 값 전달을 생략하면 기본값이 대입되고 기본값을 설정하지 않았으면 null이 대입됩니다.
그리고 명명된 매개변수처럼 이름을 전달하면 오류입니다(3). 옵셔널 위치 매개변수는 반드시 이름을 생략하고 값만 전달해야 합니다(4). 또한 값을 전달할 때 반드시 매개변수가 선언된 순서에 맞춰야 합니다(5). 만약 값을 일부만 전달할 때는 타입에 주의해야 합니다(6). 타입이 맞지 않으면 오류가 발생합니다(7).