조용한 담장

Dart : Functions 본문

Dart

Dart : Functions

iosroid 2019. 8. 7. 00:20

Dart Funciton

Function object

function 은 Function type 을 가지는 object 이다.

변수에 할당되거나 다른 함수의 인자가 될 수있다.

bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}
isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

return type 이 생략될 수 있다.

=> expr{ return expr } 와 동일하다.

parameters

Mandatory parameter

mandatory parameter : @required

const Scrollbar({Key key, @required Widget child})

Optional parameter

named parameter : {paramName: value}

enableFlags(bold: true, hidden: false);

/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold, bool hidden}) {...}

positional parameter : []

String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

// print(say('Bob')); // error
print(say('Bob', 'Howdy')); // Bob says Howdy
print(say('Bob', 'Howdy', 'smoke signal')); // Bob says Howdy with a smoke signal

Default parameter

named parameter 와 positional parameter 는 default value 를 가질 수 있다.

/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {...}

// bold will be true; hidden will be false.
enableFlags(bold: true);

void noFlags({int param}) {...}

// param is null
noFlags();

String say(String from, String msg,
    [String device = 'carrier pigeon', String mood]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  if (mood != null) {
    result = '$result (in a $mood mood)';
  }
  return result;
}

print(say('Bob', 'Howdy')); //Bob says Howdy with a carrier pigeon

list 와 map 도 default parameter 로 쓸 수 있다.

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');
}

Main function

모든 앱은 entrypoint 가 되는 main() 을 가진다.

void main() {
}
void main(List<String> arguments) {
}

Cascade notation

... 은 동일한 오브젝트의 연속적인 동작을 표현할 때 쓸 수 있다. 오브젝트의 변수가 메소드등의 필드에도 접근할 수 있다.
잘 이용하면 코드의 양을 줄이고 시안성을 높일 수 있다.

querySelector('#confirm') // Get an object.
  ..text = 'Confirm' // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

//nested
final addressBook = (AddressBookBuilder()
      ..name = 'jenny'
      ..email = 'jenny@example.com'
      ..phone = (PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();

Function as a parameter

function 을 다른 function 의 인자로 사용하거나 변수에 할당할 수 있다.

void printElement(int element) {
  print(element);
}
var list = [1, 2, 3];
// Pass printElement as a parameter.
list.forEach(printElement);

var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
print(loudify('hello')); // !!! HELLO !!!

Anonymous functions

이름없는 function 도 만들 수 있다.

([[Type] param1[, …]]) { 
  codeBlock; 
};
var list = ['apples', 'bananas', 'oranges'];
list.forEach(
  (item) {
    print('${list.indexOf(item)}: $item');
  }
);
list.forEach(
  (item) => print('${list.indexOf(item)}: $item');
)

Lexical scope

bool topLevel = true;

void main() {
  var insideMain = true;

  void myFunction() {
    var insideFunction = true;

    void nestedFunction() {
      var insideNestedFunction = true;

      assert(topLevel);
      assert(insideMain);
      assert(insideFunction);
      assert(insideNestedFunction);
    }
  }
}

nestedFunction() 는 상위에 정의된 변수에 접근 가능하다.

Lexical closures

/// Returns a function that adds [addBy] to the
/// function's argument.
Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

void main() {
  // Create a function that adds 2.
  var add2 = makeAdder(2);
  // Create a function that adds 4.
  var add4 = makeAdder(4);
  print(add2(3)); // 5
  print(add4(3)); // 7
}

Return values

return 이 정의 되지 않으면 null 을 리턴한다.

foo() {}
foo(); // null

Reference

https://dart.dev/guides/language/language-tour#functions

'Dart' 카테고리의 다른 글

Dart : Exceptions  (0) 2019.09.20
Dart : Control flow statements  (0) 2019.09.17
Dart : Operators  (0) 2019.09.17
Dart 2.5  (0) 2019.09.11
Dart : Variables  (0) 2019.08.05
Comments