// String을 반환하는 함수 정의
String sayHello(String name) {
return "Hello $name nice to meet you";
}
// fat arrow syntax
String sayHello(String potato) => "Hello $name nice to meet you";
num plus(num a, num b) => a + b;
// 함수 호출
void main() {
print(sayHello('주삐'));
}
Dart의 Function은 named parameter
라는 것을 지원한다.
// 아래 정의된 함수는 named parameter를 지원하지 않음
String sayHello(String name, int age, String country) {
return "Hello $name, you ar $age, and you come from $country";
}
void main() {
print(sayHello('주삐', 25, 'Korea'));
}
메인 함수에서 sayHello
를 호출할 때, 위와 같은 방법은 별로 좋은 방법이 아니라고 한다. 요소들의 순서를 까먹을 수도 있고, 인자만 봤을 때 뭐가 뭔지 잘 모를 수도 있기 때문이다.
그렇다면 positional parameter가 더 좋은 경우는 없을까 ? ➡️
sum
등의 간단한 함수는 오히려 positional parameter가 더 직관적이다. 또한,sub
처럼 인자의 순서가 일반적으로 정해져있는 함수 또한 positional parameter가 더 직관적이고 읽기도 쉽다.sub(a, b)
를 호출했을 때, 일반적으로 기대하는 내부 동작은a - b
이지,b - a
가 아니기 때문 ! 함수의 호출부에서 함수도의 동작을 예측 가능하다면, positional, named 둘 다 좋은 선택지이다.
다음처럼 named parameter
를 지원하는 함수로 정의하고, named argument
를 사용하자.
// named parameter 지원
String sayHello({String name, int age, String country}) {
return "Hello $name, you ar $age, and you come from $country";
}
void main() {
print(sayHello(
name: '주삐',
age: 25,
countryL 'Korea'
));
}
Dart에서는 null safety를 지원하기 때문에, 함수 호출부에서 필요한 모든 인자를 넘겨주지 않을 때를 고려해야한다.
아래 두 가지 옵션으로 위 문제를 해결할 수 있다.
named parameter에 default value 정하기
String sayHello({String name = '주삐', int age = 24, String country = "Korea"}) {
return "Hello $name, you ar $age, and you come from $country";
}
required modifier
사용하기
String sayHello({
required String name,
required int age,
required String country
}) {
return "Hello $name, you ar $age, and you come from $country";
}
파라미터에 앞에 required 키워드를 붙여서 해당 파라미터가 반드시 필요하다는 것을 명시해준다. 이렇게하면, 컴파일러가 호출부에서 필요한 인자를 입력하지 않은 경우에 알려줄 수 있다.
String sayHello(String name, int age, String country) =>
'Hello $name, you ar $age years old from $country';
위 함수의 parameter는 모두 required이며 순서가 정해져 있다.
만약, named parameter를 사용하지 않고, country는 optional로 설정하고 싶으면 아래처럼 수정할 수 있다.
String sayHello(String name, int age, [String? country = 'Korea']) =>
'Hello $name, you ar $age years old from $country';
➡️ 대괄호([]
)로 감싸주고, nullable(?
)임을 알려주고, default value 부여하기 !
String capitalizeName(String name) => name.toUpperCase();
위와 같은 함수가 있을 때, 사용자가 null을 입력할 수 있게 해보자.
String capitalizeName(String? name) {
if (name != null) {
return name.toUpperCase();
}
return 'ANON';
String capitalizeName(String? name)
=> name != null ? name.toUpperCase() : 'ANON';
String capitalizeName(String? name)
=> name?.toUpperCase() ?? 'ANON';
qq operator는 좌항이 null이면, 우항을 return 함 (위 경우에서는 name이 null이면 toUpperCase()
를 호출할 수 없기 때문에 ? 를 추가 !)
javascript의 nullish 연산자
??
는null
과undefined
를 둘 다 체크한다는 점에서 dart의??
와 차이가 있다.
void main() {
String? name;
name ??= 'juppi';
name ??= '!!';
print(name); // juppi
좌항이 null이면 할당하는 연산자이다. name이 null인 상태에서 juppi를 할당했기 때문에 !! 는 할당되지 않는다.
자료형이 헷갈릴 때 도움이 될 alias를 만드는 방법 ! 자료형이 복잡해질 때 유용하다.
typedef ListOfInts = List<int>;
List<int> reverseOfNumbers(List<int> list) {
var reversed = list.reversed;
return reversed.toList();
}
ListOfInts reverseOfNumbers(ListOfInts list) {
var reversed = list.reversed;
return reversed.toList();
}
typedef UserInfo = Map<String, String>;
String sayHi(Map<String, String> userInfo) {
return "Hi ${userInfo['name']}";
}
String sayHi(UserInfo userInfo) {
return "Hi ${userInfo['name']}";
}