함수를 호출할 때는 다음처럼 매개변수의 개수와 타입, 순서에 맞게 데이터를 전달해야 합니다. 그렇지 않으면 오류가 발생합니다.
// 함수 호출 예
void some(int a, String b, bool c) {
}
main() {
some(); // 오류
some('hello', true, 10); // 오류
some(10, 'hello', true);
}
그런데 다트에서는 함수의 매개변수를 선택적으로 지정하는 옵셔널을 지원합니다. 옵셔널은 다음 2가지 형태로 제공합니다. 차례대로 알아보겠습니다.
- 명명된 매개변수(named parameter)
- 옵셔널 위치 매개변수(optional positional parameter)
명명된 매개변수란?
보통 함수를 호출할 때는 함수에 선언된 매개변수의 개수와 타입, 순서에 맞게 값을 전달해서 호출합니다. 그런데 명명된 매개변수는 옵셔널이므로 호출할 때 데이터를 전달하지 않을 수도 있으며, 데이터를 전달할 때는 '이름: 값' 형태로 매개변수 이름과 값을 함께 전달합니다. 명명된 매개변수를 사용하려면 함수를 선언할 때 매개변수 타입과 이름을 중괄호로 묶어서 표현합니다.
명명된 매개변수 선언 규칙
명명된 매개변수는 다음처럼 몇 가지 규칙에 맞게 사용해야 합니다.
- 명명된 매개변수는 중괄호 { }로 묶어서 선언한다.
- 여러 매개변수를 중괄호로 묶어 명명된 매개변수로 선언할 수 있다.
- 한 함수에서 명명된 매개변수는 한 번만 선언할 수 있으며 순서상 마지막에 선언해야 한다.
- 명명된 매개변수에는 기본값을 설정할 수 있다.
명명된 매개변수의 중괄호 안에 변수를 여러 개 선언할 수 있습니다. 그리고 명명된 매개변수는 함수의 매개변수 목록에서 가장 마지막에 작성해야 합니다. 따라서 명명된 매개변수는 하나의 함수에 한 번만 선언할 수 있습니다.
다음 코드에서 some1() 함수는 명명된 매개변수를 목록의 마지막에 선언하지 않아서 오류가 발생하며, some2()는 한 함수에 명명된 매개변수를 2번 선언해서 오류가 발생합니다.
// 명명된 매개변수 선언
void some1({String? data2, bool? data3}, int data1) { } // 오류
void some2(int data1, {String? data2, bool? data3}, {int? data4}) { } // 오류
void some3(int data1, {String? data2, bool? data3}) { } // 성공
some3() 처럼 명명된 매개변수가 있어도 중괄호로 묶지 않은 일반 매개변수는 얼마든지 선언할 수 있습니다. 다만 일반 매개변수를 먼저 작성하고 마지막에 중괄호로 묶은 명명된 매개변수를 작성해야 합니다.
명명된 매개변수 호출 규칙
명명된 매개변수로 선언된 함수는 다음처럼 몇 가지 규칙에 맞게 호출해야 합니다.
- 명명된 매개변수에 데이터를 전달하지 않을 수 있다.
- 명명된 매개변수에 데이터를 전달하려면 반드시 이름을 명시해야 한다.
- 명명된 매개변수에 데이터를 전달할 때 선언된 순서와 맞추지 않아도 된다.
명명된 매개변수는 선택적이므로 함수를 호출하는 곳에서 데이터를 전달하지 않을 수 있습니다. 만약 명명된 매개변수에 데이터를 전달하려면 선언된 순서와 맞출 필요는 없지만 이름은 꼭 명시해야 합니다. 만약 다음처럼 명명된 매개변수를 포함하는 some() 함수를 선언했다고 가정해 보겠습니다.
// 명명된 매개변수 선언
void some(int data1, {String? data2, bool? data3} ) { }
이렇게 선언된 함수는 다음처럼 호출할 수 있습니다. 오류가 발생하는 호출문과 성공하는 호출문을 비교해 보면서 각자 원인을 찾아 보세요.
// 명명된 매개변수 호출 예
(1) some(); // 오류
(2) some(10); // 성공
(3) some(10, 'hello', true); // 오류
(4) some(10, data2: 'hello', data3: true); // 성공
(5) some(10, data3: true, data2: 'hello'); // 성공
(6) some(data2: 'hello', 10, data3: true); // 성공
명명된 매개변수로 선언된 매개변수는 생략할 수 있지만(2) 일반 매개변수는 생략할 수 없습니다(1). 그리고 명명된 매개변수에는 반드시 이름과 값을 함께 전달해야 하며(3,4) 매개변수가 선언된 순서는 맞추지 않아도 됩니다(5,6).
기본 인자 설정하기
명명된 매개변수에는 기본 인자를 설정할 수 있습니다. 기본 인자란 함수 호출 때 데이터를 전달받지 못하면 매개변수에 대입하는 기본값입니다. 명명된 매개변수는 선택적이므로 호출할 때 데이터를 전달하지 않을 수 있다고 했습니다. 그러면 해당 매개변수는 null이되므로 타입 뒤에 물음표를 붙여서 널 허용으로 선언해 줘야 합니다. 만약 명명된 매개변수를 널 불허로 선언하려면 기본 인자를 설정해 줘야 합니다.
다음 코드에서 myFun() 함수에 명명된 매개변수로 data를 선언하면서 'hello'를 기본 인자로 설정했습니다. 따라서 데이터를 전달하지 않고 호출할 때는 기본값, 전달할 때는 그 값을 반환합니다.
// 기본 인자 설정
String myFun({String data = 'hello'}) {
return data;
}
main() {
print('myFun() result : ${myFun()}'); // myFun() result : hello
print('myFun(world) result : ${myFun(data : "world")}'); // myFun(world) result : world
}
필수 매개변수 선언하기 - required
명명된 매개변수에서 required 예약어는 반드시 값을 전달받도록 강제합니다. 즉, 명명된 매개변수에 값을 전달하는 것은 선택이지만, required 예약어를 사용하면 필수로 만들 수 있습니다.
다음 코드에서 someFun() 함수는 required 예약어로 명명된 필수 매개변수를 포함합니다. 따라서 이 함수를 호출할 때는 반드시 매개변수 이름과 값을 전달해야 합니다.
// 명명된 필수 매개변수 선언
someFun({required int arg1}) {
print('someFun().. arg1 : $arg1');
}
main() {
someFun(); // 오류
someFun(arg1: 10); // 성공
}
값이 꼭 필요한 매개변수라면 일반 매개변수로 선언하면 되잖아요?
명명된 필수 매개변수는 함수를 호출하는 곳에서 이름을 명시해서 값을 전달하므로 코드를 읽기가 쉬워집니다. 그리고 매개변수가 여럿일 때 순서를 맞추지 않아도 된다는 이점도 있습니다.
'Flutter' 카테고리의 다른 글
함수 타입 인수 (0) | 2024.11.12 |
---|---|
옵셔널 위치 매개변수 (0) | 2024.11.12 |
함수 선언과 호출하기 (0) | 2024.11.12 |
널 안전성 연산자 (0) | 2024.11.12 |
널 포인트 예외 관리하기 (1) | 2024.11.12 |