Dart, 함수
글. 수알치 오상문
다트는 함수도 하나의 객체로 처리하는데 Function 객체입니다. 즉, 함수도 다른 변수나 값으로 할당되거나 전달될 수 있다는 것입니다. 자세한 참조: Callable classes.
다음 예제를 살펴보면,
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
다트는 퍼블릭 API에 대한 유형 주석을 권장하지만, 유형을 생략해도 함수는 계속 작동합니다.
isNoble(atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
표현식이 하나인 함수는 단축 형식을 사용할 수 있습니다(마치 람다 함수 비슷하게).
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
특이하게 보이지만 '=> 수식' 구문은 {return 수식; }과 같습니다.
참조: 수식만 사용할 수 있음에 주의합니다. if 문장 같은 것은 넣을 수 없지만 조건 연산자를 이용한 수식은 가능합니다. 참조: conditional expression.
매개변수(전달인수)
함수는 몇 개의 값을 전달받아 사용할 수 있습니다. 물론, 하나도 전달받지 않는 경우도 가능합니다. 그리고 그 값을 받을 대는 적절한 이름을 이용하여 전달 받는데 매개변수라고 부릅니다. 매개변수가 여러 개인 경우에는 쉼표를 이용하여 분리합니다. 참조: trailing commas
이름을 가진 매개변수
이름이 지정된 매개 변수는 특별히 필수로 표시되지 않는 한 선택사항입니다.
enableFlags(bold: true, hidden: false);
함수를 정의 할 때 {param1, param2,…}를 사용하여 이름을 지정한 매개변수를 지정합니다.
void enableFlags({bool? bold, bool? hidden})
{
// ...
}
팁: 매개변수가 선택사항이지만 null일 수없으면 기본값을 지정할 수 있습니다. 참조: default value.
이름은 가진 매개변수는 일종의 선택적 매개변수이지만 매개변수가 필수라면 required 지시를 달 수 있습니다. 이 경우에 사용자는 매개변수 값을 제공해야합니다.
const Scrollbar({Key? key, required Widget child})
누군가 전달인수를 지정하지 않고 스크롤바를 만들려고 하면 문제를 있음을 알려줍니다.
선택사항 매개변수
매개변수를 [ ]로 감싸면 선택적인 매개변수가 됩니다.
String say(String from, String msg, [String? device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
다음은 선택사항 매개변수 없이 함수를 호출하는 예입니다.
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
다음은 선택사항인 세 번째 매개변수를 사용하여 함수를 호출하는 예입니다.
assert(say('Bob', 'Howdy', 'smoke signal') == 'Bob says Howdy with a smoke signal');
매개변수 기본 값 지정
함수는 =를 사용하여 매개변수에 대한 기본값을 정의할 수 있습니다. 기본값은 컴파일 시간에 상수 값이야합니다. 기본값이 제공되지 않으면 기본값은 null입니다.
/// [bold] 그리고 [hidden] 기본 값 설정
void enableFlags({bool bold = false, bool hidden = false})
{
...
}
// 아래처럼 함수를 호출하면 bold는 true이고 hidden은 false로 처리
enableFlags(bold: true);
지원중단 참고: 이전 코드는 명명된 매개변수의 기본값을 설정하기 위해 = 대신 콜론 (:)을 사용할 수 있습니다. 원래 이름이 지정된 매개변수에 대해 :만 지원되었기 때문입니다. 이 지원은 더 이상 사용되지 않을 수 있으므로 다음을 참조합니다: use = to specify default values.
다음 예는 매개변수 기본값을 설정하는 방법을 보여줍니다.
String say(String from, String msg, [String device = 'carrier pigeon']) {
var result = '$from says $msg with a $device'; // $from --> from 매개변수 전달 값
return result;
}
assert(say('Bob', 'Howdy') == 'Bob says Howdy with a carrier pigeon');
리스트나 맵을 기본값으로 전달할 수 있습니다. 다음 예제는 list 매개변수에 대한 리스트와 gifts 매개변수에 대한 기본 맵을 지정하는 함수 doStuff ()를 정의합니다.
void doStuff( {List<int> list = const [1, 2, 3], Map<String, String> gifts = const { 'first': 'paper', 'second': 'cotton', 'third': 'leather' }}) {
print('list: $list');
print('gifts: $gifts');
}
반환 값(Return values)과 null
모든 함수는 반환값을 돌려줍니다. 반환 값은 return 반환값; 문장을 이용한다. 만약 반환 값이 지정되지 않거나 return 문장이 없으면, return null; 문장처럼 처리되므로, 함수는 null을 반환합니다.
foo() {}
assert(foo() == null); // 함수에 return 문장이 없으면 자동으로 null이 반환된다.
main() 함수
모든 앱에는 앱의 시작 위치인 main() 함수가 필요합니다. main() 함수는 void를 반환하고 매개변수에 대한 List <String> 매개변수를 선택사항으로 가질 수 있습니다. 다음은 간단한 main() 함수 예입니다.
void main() {
print('Hello, World!');
}
다음은 매개변수 가진 앱에 대한 main() 함수 예입니다.
// 실행: dart args.dart 1 test
void main(List<String> arguments) {
print(arguments);
assert(arguments.length == 2);
assert(int.parse(arguments[0]) == 1);
assert(arguments[1] == 'test');
}
참조: args library
최상위 클래스 객체의 함수
함수를 매개변수를 이용하여 다른 함수에 전달할 수 있습니다.
void printElement(int element) {
print(element);
}
var list = [1, 2, 3]; // printElement 함수를 매개변수 값으로 전달
list.forEach(printElement);
변수에 함수를 할당 할 수 있습니다. (함수도 객체로 취급하기에 가능한 것입니다.)
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');
이 예에서는 이름없는 함수를 사용했습니다. 이름 없는 함수는 다른 글에서 다루겠습니다.
<이상>
'Dart' 카테고리의 다른 글
Dart, 접근 범위와 클로저(closure) (0) | 2021.06.15 |
---|---|
Dart, 이름없는 함수 (0) | 2021.06.15 |
Dart, 맵(사전) 자료형 Map (0) | 2021.06.14 |
Dart 집합 자료형 Set (0) | 2021.06.14 |
Dart 리스트 자료형 List (0) | 2021.06.12 |