본 글은 [Do it! 깡샘의 플러터&다트 프로그래밍] 의 내용을 발췌한 것입니다.
책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.
함수를 호출할 때는 다음처럼 매개변수의 개수와 타입, 순서에 맞게 데이터를 전달해야 합니다. 그렇지 않으면 오류가 발생합니다.
void some(int a, String b, bool c) {
}
main() {
some(); // 오류
some('hello', true, 10); // 오류
some(10, 'hello', true);
}
그런데 다트에서는 함수의 매개변수를 선택적으로 지정하는 옵셔널optional을 지원합니다. 옵셔널은 다음 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).
기본 인자 설정하기
명명된 매개변수에는 기본 인자default argument를 설정할 수 있습니다. 기본 인자란 함수 호출 때 데이터를 전달받지 못하면 매개변수에 대입하는 기본값입니다. 명명된 매개변수는 선택적이므로 호출할 때 데이터를 전달하지 않을 수 있다고 했습니다. 그러면 해당 매개변수는 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); // 성공
}
책의 모든 내용을 저자 직강으로 진행한 강의는 ssamz.com 에서 들으실 수 있습니다.
'flutter' 카테고리의 다른 글
플러터 - named constructor (0) | 2023.03.13 |
---|---|
플러터 - for, in, switch case, try on catch finally (2) | 2023.03.13 |
플러터 - 컬렉션 타입 — List, Set, Map (2) | 2023.03.13 |
플러터 - var와 dynamic 타입 (0) | 2023.03.13 |
플러터 - 다트 언어란? (0) | 2023.03.13 |