다트에서 제공하는 함수에 관한 여러가지 기능을 알아보자.
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
댓글