[Dart] 함수(Function) 사용 방법

Dart에서 함수(Function) 사용 방법에 대해 알아보겠습니다.

Functions

Dart는 진정한 객체 지향 언어이므로 함수도 객체이며 타입이 Function입니다. 이는 함수를 변수에 할당하거나 다른 함수에 인수로 전달할 수 있음을 의미합니다.

1
2
3
4
5
6
7
8
// 하나의 표현식만 포함하는 함수의 경우 아래와 같이 단축 구문을 사용할 수 있습니다.
String sayHello(String name) => "Hello ${name} nice to meet you!";

num plus(num a, num b) => a + b;

void main() {
print(sayHello("eden")); // Hello eden nice to meet you!
}

Positional Paramaters

함수을 호출할 때 필요한 매개변수와 매개변수의 위치를 정확하게 알아야 합니다. 함수의 매개변수가 많아질수록 함수 호출할 때 다 기억해야 하므로 사용하기 어렵습니다.

1
2
3
4
5
6
7
String sayHello(String name, int age, String country) {
return "Hello $name, you are $age, and you come from $country";
}

void main() {
print(sayHello('eden', 30, 'Korea'));
}

Named Paramaters

위의 Positional Paramaters 방식은 함수를 호출할 때 사용자가 요소들의 순서를 잊어버릴 수도 있고, 코드를 봤을 때 인자가 뜻하는 것이 무엇인지 바로 이해를 못 할 수도 있습니다. 이 문제를 해결하기 위해 Dart 에서는 Named Paramaters를 지원합니다.

다음과 같이 매개변수 앞뒤로 중괄호를 붙여주면 함수를 호출할 때 매개변수의 이름과 값을 함께 입력할 수 있어 사용자에게 훨씬 편리합니다. 이때 매개변수들의 순서는 지키지 않아도 됩니다.

1
2
3
4
5
6
7
String sayHello({String name, int age, String country}) {
return "${name} / ${age} / ${country}";
}

void main() {
print(sayHello(name: "eden", age: 30, country: "Korea"));
}

하지만 여기서 또 문제가 발생합니다. Dart는 null safety가 적용되는데, 매개변수 중 하나가 null 일 수도 있기 때문입니다. 다시 말해, 사용자가 name과 age, country 3개의 매개변수 중 하나라도 빼고 보낼 수 있습니다.

이때는 두 가지 옵션이 있습니다.

default value

1
2
3
4
5
6
7
8
9
10
11
String sayHello({
String name = 'ko',
int age = 99,
String country = 'Italy',
}) {
return "Hello $name, you are $age, and you come from $country";
}

void main() {
print(sayHello());
}

함수를 호출할 때 아무것도 전달하지 않아도 default value가 이미 있으므로 null safety에 걸릴 일이 없습니다.

required

다음과 같이 매개변수 앞에 required를 적어주면, 함수가 호출될 때 반드시 required가 적힌 매개변수가 포함되어야 한다는 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
String sayHello({
required String name,
required int age,
required String country
}) {
return "Hello $name, you are $age, and you come from $country";
}

void main() {
print(🚫sayHello());
// name, country, age가 모두 포함되어야 하기 때문에 dart에서 컴파일하지 않음
}

Optional Positional Paramaters

Dart에서 []은 optional, positional parameter를 명시할 때 사용됩니다.
name, age 는 필수값이고 []를 통해 country를 optional 값으로 지정해 줄 수 있습니다.

1
2
3
4
5
6
7
8
String sayHello(String name, int age, [String? country = "Korea"]) {
return 'Hello ${name}, You are ${age} from the ${country}';
}

void main() {
var result = sayHello("eden", 3);
print(result); // Hello eden, You are 3 from the Korea
}

QQ Operator

?? 연산자를 이용하면 왼쪽 값이 null 인지 체크해서 null 이 아니면 왼쪽 값을 리턴하고 null 이면 오른쪽 값을 리턴합니다.

1
2
3
4
5
6
7
8
String capitalizeName(String? name) {
return name?.toUpperCase() ?? "NONE";
}

void main() {
print(capitalizeName("eden")); // EDEN;
print(capitalizeName(null)); // NONE
}

위의 코드를 더욱 간략하게 만들 수 있습니다.

1
String capitalizeName(String? name) => name?.toUpperCase() ?? "NONE";

??= 연산자를 이용하면 변수 안에 값이 null 일 때를 체크해서 값을 할당해줄 수 있습니다.

1
2
3
4
5
6
7
void main() {
String? name;
name ??= "eden";
name = null;
name ??= "ko";
print(name); // ko
}

TypeDef

자료형에 사용자가 원하는 alias 를 붙일 수 있게 해 줍니다. (자료형 이름의 별명을 만들 때 사용)

1
2
3
4
5
// 사용 전
List reverseListOfNumbers(List list) {
var reversed = list.reversed;
return reversed.toList();
}
1
2
3
4
5
6
7
8
9
10
11
// 사용 후
typedef ListOfInts = List;

ListOfInts reverseListOfNumbers(ListOfInts list) {
var reversedList = list.reversed.toList();
return reversedList;
}

void main() {
print(reverseListOfNumbers([1, 2, 3])); // [3, 2, 1]
}

참고

Share