타입 이름(매개변수타입 매개변수이름) {
실행할 코드
}
실행할 코드가 단 1개라면, 함수를 한 줄로 표현할 수 있다.
void helper() => print('Hello World');
아래의 코드를 살펴보자.
String introduction(String name, int age, String country) {
return "Hi, My name is ${name} and I'm ${age} and I live in ${country}";
}
void main() {
introduction('zenTechie', 26, 'nowhere');
}
introduction
함수를 호출할 때 각 인자가 의미하는 바가 무엇인지 바로 알아챌 수 있을까? 아니다.
각 인자가 어떤 의미를 가지는지 알려주기 위해 Named Parameters를 사용할 수 있다.
아래는 Named Parameters를 적용한 코드이다.
String introduction({String name = '', int age = 26, String country = ''}) {
return "Hi, My name is ${name} and I'm ${age} and I live in ${country}";
}
void main() {
introduction(
name: 'zenTechie',
age: 26,
country: 'nowhere');
}
위와 같이 작성하면, 각 인자가 어떤 의미를 가지는지 알 수 있다.
이때, 매개변수를 보면 default 값을 전달해주는 것을 볼 수 있다. 이는, 만약 사용자가 인자를 빼먹었을 때 null
전달을 막기 위함이다.
만약, default value를 지정하고 싶지 않고 사용자에게 인자를 받아야만 한다면 어떻게 할까?
이때는 required
키워드를 사용한다.
String introduction({
required String name,
required int age,
required String country
}) {
return "Hi, My name is ${name} and I'm ${age} and I live in ${country}";
}
void main() {
introduction(name: 'zenTechie', age: 26, country: 'nowhere');
}
즉,
required
는 반드시 값이 필요함을 의미한다. ➡️ null safety를 적용할 수 있게된다.+)
required
는 어디에서 사용할 수 있을까? 로그인 기능!
함수를 호출할 때 특정 매개변수가 꼭 필요로 되지 않는다면 이를 어떻게 표시할 수 있을까?
optional positional parameters는 아래의 조건을 만족해야 한다.
String introduction(String name, int age, [String? country = 'nowhere']) {
return "Hi, My name is ${name} and I'm ${age} and I live in ${country}";
}
void main() {
introduction('zenTechie', 26);
}
??
연산자를 사용하면 왼쪽 값이 null
인지 확인한다.
만약 null이 아니라면, 왼쪽 값을 return하고 null이면 오른쪽 값을 return한다.
left ?? right
예시 코드는 아래와 같다.
String isStringNull(String? str) {
return str ?? "String is null";
}
void main() {
String str1 = "Hello";
String? str2 = null;
print(isStringNull(str1)); // Hello
print(isStringNull(str2)); // String is null
}
??=
연산자도 있는데, 이는 왼쪽 변수의 값이 null이면 오른쪽 값을 왼쪽 변수에 할당하라는 의미이다.
left ??= right
void main() {
String? name;
name ??= 'John Doe';
print(name); // John Doe
}
Typedef
를 사용하면 사용자가 원하는 alias를 붙일 수 있게 해줌으로써 자료형을 간편하게 작성할 수 있다.
typedef NameList = List<String>;
NameList nameList(NameList names) => names;
// 동일한 코드
List<String> nameList(List<String> names) => names;