https://www.youtube.com/watch?v=fHo9HpBK98k
Dart에서 함수는 js와 아주 유사합니다.
Dart는 함수도 객체이며 타입이 Function입니다. 이는 함수를 변수에 할당하거나 다른 함수에 인수로 전달할 수 있음을 의미합니다.
// 하나의 표현식만 포함하는 함수의 경우 아래와 같이 단축 구문을 사용할 수 있습니다.
String sayHello(String name) => "Hello ${name} nice to meet you.";
num plus(num a, num b) => a + b;
void main() {
print(sayHello("sugar"));
}
함수에 key-value 형태로 parameter를 전달하는 방법입니다. (직관적이고 유지보수에 좋음)
String sayHello(String name, int age) => '안녕하세요 $age살인 $name님 ';
String namedSayHello({String name, int age}) => '안녕하세요 $age살인 $name님 ';
print(sayHello('싸피', 10));
print(namedSayHello(name: '네이버', age: 30));
하지만 namedSayHello함수에서는 에러가 발생합니다. name, age 가 null일 수 있기 때문입니다.
이 때 2가지 방법이 있습니다.
1. default 값을 지정해주기
2. required 를 지정해주기
String defaultSayHello({String name = '익명', int age = 0}) =>
'안녕하세요 $age살인 $name님 '; // 1. 디폴트 값
String requiredSayHello({required String name, required int age}) =>
'안녕하세요 $age살인 $name님 '; // 2. required
print(defaultSayHello()); // 안녕하세요 0살인 익명님
print(requiredSayHello()); // required 이기 때문에 에러 발생
다음으로는 parameter들을 required가 아닌 Optional로 사용하는 방법입니다.
먼저 일반함수인 경우입니다.
String sayHello(String name, int age, [String? country = ""]) {
return 'Hello ${name}, You are ${age} from the ${country}';
}
대괄호로 감싸준 후, 위와 같이 사용하면 됩니다. (자주 사용하지 않고 권장하지 않음)
named parameter인 경우는 간단한데
String requiredSayHello({String? name, required int age}) =>
'안녕하세요 $age살인 $name님 ';
그냥 ? 만 붙여주면 됩니다.
(js와 동일)
?? 연산자를 이용하면 왼쪽 값이 null인지 체크해서 null이 아니면 왼쪽 값을 리턴하고 null이면 오른쪽 값을 리턴한다.
String capital(String? name) => name?.toUpperCase() ?? "ANON";
??= 연산자를 이용하면 변수 안에 값이 null일 때를 체크해서 값을 할당해줄 수 있다.
void main() {
String? name;
name ??= "sugar";
name ??= "salt";
print(name); //sugar
name = null;
name ??= "js";
print(name); // js
}