본문 바로가기
Frontend, Client/Flutter

[Flutter] 플러터 - 다트 : 함수 알아보기(optional parameter, named parameter 등등)

by ggyongi 2022. 12. 9.
반응형

다트에서 제공하는 함수에 관한 여러가지 기능을 알아보자.

 

a. optional parameter

: 함수 호출 시 [ ] 안의 파라미터를 선택적으로 넣어주거나 생략할 수 있다.

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

주의점 : optional parameter의 경우 타입이 non-null이면 에러가 발생한다. Nullable로 바꿔주거나 기본값을 달아주어야 에러가 발생하지 않는다.

 

b. named parameter

: 함수 호출 시 { } 안의 파라미터는 해당 파라미터 이름과 함께 값을 넘겨주어야 한다.
: 장점은 인자의 순서가 상관이 없어진다.(이름이 있으니까)

void showNumbers({int? a, int? b}) {
    print('a = $a, b = $b');
  }
  
  showNumbers(b : 4, a : 7);
  showNumbers(b : 4);

console

a = 7, b = 4
a = null, b = 4

주의점: named parameter도 기본적으로 optional이다. 그래서 인자로 넘겨줄지 말지 선택할 수 있다. 그렇기 때문에 named parameter의 타입은 Non-null이 될 수 없다. nullable로 바꿔주거나 기본값을 달아주어야 한다.
Named parameter를 optional이 아닌 mandatory로 만들어주고 싶으면, required 키워드를 달아주면 된다.

void showNumbers({required int? a, int? b}) {
		print('a = $a, b = $b');
}

Q) optional parameter에 required 사용 가능? 불가능하다. 그럼 optional을 쓰는 이유가 사라짐. 그냥 일반 파라미터로 바꿔주면 됨.
Q) optinal parameter와 named parameter의 중첩이 가능?

void showNumbers([{int? a, int? b}]){...}

이런 식으로 될까 생각했는데,
해보니까 안됨. 되면 복잡할 듯. 중첩할 이유도 없는게, named param는 이미 optional의 성격을 띄고 있음
Q) 일반 파라미터와 named parameter가 섞여있을 때 인자의 순서는?

void showNumbers({required int? a,required int? b}, int c) {
		print('a = $a, b = $b, c = $c');
}

위와 같은 형태는 불가능하며 컴파일 에러가 발생한다. 일반 파라미터인 c는 named parameter보다 뒤에 있을 수 없다. 제대로 된 순서는 아래와 같다.

void showNumbers(int c, {required int? a,required int? b}) {
      print('a = $a, b = $b, c = $c');
  }
  
  showNumbers(10, b : 30, a : 20);

//console
a = 20, b = 30, c = 10

 

c. arrow syntax

다트에서는 { return expr; } 를 ⇒ expr; 로 축약할 수 있다.

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

 

d. functions as a first-class objects

함수를 다른 함수의 파라미터로 제공할 수 있다.

void printElement(int element) {
  print(element);
}

var list = [1, 2, 3];

// Pass printElement as a parameter.
list.forEach(printElement);

 

e. cascade notation

cascade(.. , ?..)는 동일 객체에 대하여 operation sequence를 만든다. 이를 통해 간편하고 유동성있는 코드를 작성할 수 있게 된다. 용도는 크게 인스턴스 변수 접근하기, 인스턴스 메서드 호출이다.
예시) 인스턴스 변수 접근하기
before

Person person = Person();
person.age = 10;
person.name = "taki";

after

Person person = Person()
    ..age = 10
    ..name = "taki";

예시) 인스턴스 메서드 호출
아래 클래스 Sum의 함수 add는 전달받은 숫자를 num에 더하고 자신을 반환한다.

class Sum{
  int num = 0;
  
  void add(int addBy){
    num += addBy;
  }
}

이때 cascade notation을 적용할 수 있다.

Sum sum = Sum()..add(1)..add(2)..add(3)..add(4);
assert(sum.num == 10);

그 밖에 빌더 패턴에도 적용이 가능하다.

 

 

다트 언어 공식문서 : https://dart.dev/guides/language/language-tour

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글