반응형

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

+ Recent posts