옵션 매개변수(Optional Parameters)는 함수에 추가적인 매개변수로 사용할 수 있습니다.
함수의 기본은 매개변수와 인수를 대응시키는 것인데 매개변수를 더 넣을지 말지 선택(옵션)을 준다는 뜻 입니다. 예를 들어서 void sayHello(String name) 이라고 하면 이 함수는 String 타입 매개변수를 꼭 하나 받아야 합니다. 없이 함수를 호출하면 컴파일 오류입니다. 그럼 호출할 때 sayHello("박동석"); 이렇게 문자열을 인수로 넘기면 됩니다. 그런데 옵션 매개변수를 쓰면 void sayHello(String name, [age]) 요렇게 할 수 있습니다. age를 사용할 수도 있고 사용안해도 됩니다. 단 age의 기본값은 null 이기 때문에 타입에 주의를 기울여야 겠지요.
예제로 보겠습니다. 아래에서 repeat 라는 옵션 매개변수를 줍니다. main 함수에서 옵션없이도 함수 호출이 가능합니다. repeat에 인수를 주지 않으면 null입니다. 함수안에서 옵션이 null인지 걸러내야지요. 옵션인 [repeat]에는 기본값의 할당없이 타입지정이 불가능한데 과거 문서를 보면 처음 다트가 만들어졌을 때는 타입지정이 가능했던 것 같습니다. 후에 규칙이 좀 엄격하게 바뀐 듯 합니다. int 타입이나 double 타입등에 null 값을 줄 수 없도록 한 의도가 아닌가 싶은데요. 또 이게 var 키워드와 다른 점은 var는 처음 한번 타입이 정해지면 나중에 타입 변경이 안되는데 옵션 매개변수는 가능합니다. 그런 미세한 차이점들이 있으니 직접 실행해보면서 차이점을 파악하는 것을 추천합니다.
void main() {
optionParam("플러터");
optionParam("다르트", 5);
}
void optionParam(String name, [repeat]) {
if (repeat != null) {
for (var i = 0; i < repeat; i++) {
print("Hello!, $name $repeat");
}
} else {
print("Hello, $name");
}
}
결과는 다음과 같습니다.
Hello, 플러터
Hello!, 다르트 5
Hello!, 다르트 5
Hello!, 다르트 5
Hello!, 다르트 5
Hello!, 다르트 5
타입을 지정하고 기본값을 준다면 아래와 같이 사용가능합니다. 아무래도 기본값을 지정해주는게 불확실성이 적지요.
void main() {
optionParam("플러터");
optionParam("다르트", 2);
}
void optionParam(String name, [int repeat = 1]) {
for (var i = 0; i < repeat; i++) {
print("Hello!, $name $repeat");
}
}
결과는 다음과 같습니다.
Hello!, 플러터 1
Hello!, 다르트 2
Hello!, 다르트 2
삼각형 그리는 예제를 만들어봤습니다. 옵션을 줄 수도 있고 없어도 함수가 호출됩니다.
import "dart:io";
void main() {
print("[기본 삼각형]");
drawTriangle("*");
print("\n[커스텀 삼각형]");
drawTriangle("O", 5);
}
void drawTriangle(String ch, [int level = 3]) {
for (var i = 0; i < level; i++) {
for (var j = -1; j < i; j++) {
stdout.write(ch);
}
stdout.write("\n");
}
}
결과는 다음과 같습니다.
[기본 삼각형]
*
**
***
[커스텀 삼각형]
O
OO
OOO
OOOO
OOOOO
이름 옵션 매개변수(Named Optional Parameters)는 좀 더 사용에 편의성을 더합니다.
아래 예제를 보면 매개변수의 순서에 상관없이 이름을 써주면 식별이 됩니다. 기본값이 다 들어가 있으니까 매개변수가 몇개가 있건 상관없습니다.
void main() {
namedOptionalParam("기본");
namedOptionalParam("커스텀-1", a: 3, b: 5.5);
namedOptionalParam("커스텀-2", a: 7);
namedOptionalParam("커스텀-3", b: 9.9);
namedOptionalParam("커스텀-4", b: 5.2, a: 17);
}
void namedOptionalParam(String word, {int a: 1, double b: 2.0}) {
print("$word, a: $a, b: $b");
}
기본, a: 1, b: 2.0
커스텀-1, a: 3, b: 5.5
커스텀-2, a: 7, b: 2.0
커스텀-3, a: 1, b: 9.9
커스텀-3, a: 17, b: 5.2
여기까지 다트의 옵션 매개변수를 알아봤습니다. 추가적인 인수를 많이 사용할 때 유용한 다트의 기능입니다.