String sayHello(String name){
return "Hello $name, nice to meet you!";
}
// fat arrow syntax
String sayHello2(String name) => "Hello $name, nice to meet you!";
num plus(num a, num b) => a + b;
void main() {
print(sayHello2('atlns'));
print(plus(1, 3));
}
positional parameter (클린코드 측면에서 추천하지 않음)
- 모든 parameter를 전달해야 함
- parameter의 순서를 지켜야 함
named parameter
- parameter 리스트 전체를 중괄호로 감싸기
- 자동 완성이 가능해짐
- 순서 상관없음
- null error 대비해야 함 (두 가지 옵션)
- default value 지정
- required modifier
String sayHello({String name = 'name', int age = 0, String country = 'somewhere'}) {
return "Hello $name, you are $age, and you come from $country";
}
void main() {
// print(sayHello('atlns', 16, 'France'));
// 위는 좋지 않은 방법. 사용자가 순서를 잊어버릴 수 있고, 가독성이 좋지 않음.
// => Named Parameters
print(sayHello(
age: 12,
country: 'France',
name: 'atlns',
));
}
Named argument를 사용하는 방법
: 함수의 arguments 앞뒤로 중괄호 추가해주기
Dart는 Null safety이기 때문에, named argument가 null이 될 수 있는 경우에 대한 에러를 보냄
해결 1) default value를 지정해주기!
String sayHello({
String name = 'name',
int age = 0,
String country = 'somewhere',
}) {
return "Hello $name, you are $age, and you come from $country";
}
해결 2) required modifier
String sayHello({
required String name,
required int age,
required String country,
}) {
return "Hello $name, you are $age, and you come from $country";
}
많이 사용되지는 않음
[사용 방법]
?
로 해당 파라미터가 null일 수도 있다는 걸 표시String sayHello(
String name,
int age,
[String? country = 'France']) =>
"Hello $name, you are $age, and you come from $country";
void main() {
print(sayHello('atlns', 16));
}
??
좌항이 null이면 우항을 return, null이 아니면 그대로 좌항을 return
아래 3가지는 동일하게 동작
String capitalizeName(String? name) => name?.toUpperCase() ?? 'ANONYMOUS';
String capitalizeName(String? name) => name != null ? name.toUpperCase() : 'ANONYMOUS';
String capitalizeName(String? name){
if(name != null){
return name.toUpperCase();
}
return 'ANONYMOUS';
}
??=
좌항이 null이면 우항 값을 대입
void main() {
String? name;
name ??= 'atlns';
name ??= 'another'; // 실행될 일 없음
print(name); // atlns 출력
}
자료형에
alias
를 붙일 수 있게 해줌
integer List, Map, Set같은 간단한 자료형에 alias를 만들 때 사용
나중에 큰 파일이나 긴 코드를 사용할 때 유용
[typedef 사용 안하는 경우]
// integer List를 전달받고, 똑같이 integer List를 리턴
List<int> reverseListOfNumbers(List<int> list) {
var reversed = list.reversed;
// list가 reverse되면 iterable로 바뀌어서 다시 toList() 해줌
return reversed.toList();
}
위의 예시처럼 같은 타입을 전달받고 리턴하는 경우, 아래와 같이 typedef
를 사용해서 만들 수 있음
[typedef 사용하는 경우]
typedef ListOfInts = List<int>;
ListOfInts reverseListOfNumbers(ListOfInts list) {
var reversed = list.reversed;
return reversed.toList();
}
Map을 typedf를 사용해서 아래처럼 만들어줄 수 있지만, 구조화된 data의 형태를 지정하고 싶다면 class를 만들어야 함
typedef UserInfo = Map<String, String>;
String sayHi(UserInfo userInfo){
return "Hi ${userInfo['name']}";
}