Dart에서 함수(Function) 사용 방법에 대해 알아보겠습니다.
Functions
Dart는 진정한 객체 지향 언어이므로 함수도 객체이며 타입이 Function입니다. 이는 함수를 변수에 할당하거나 다른 함수에 인수로 전달할 수 있음을 의미합니다.
1 | // 하나의 표현식만 포함하는 함수의 경우 아래와 같이 단축 구문을 사용할 수 있습니다. |
Positional Paramaters
함수을 호출할 때 필요한 매개변수와 매개변수의 위치를 정확하게 알아야 합니다. 함수의 매개변수가 많아질수록 함수 호출할 때 다 기억해야 하므로 사용하기 어렵습니다.
1 | String sayHello(String name, int age, String country) { |
Named Paramaters
위의 Positional Paramaters 방식은 함수를 호출할 때 사용자가 요소들의 순서를 잊어버릴 수도 있고, 코드를 봤을 때 인자가 뜻하는 것이 무엇인지 바로 이해를 못 할 수도 있습니다. 이 문제를 해결하기 위해 Dart 에서는 Named Paramaters를 지원합니다.
다음과 같이 매개변수 앞뒤로 중괄호를 붙여주면 함수를 호출할 때 매개변수의 이름과 값을 함께 입력할 수 있어 사용자에게 훨씬 편리합니다. 이때 매개변수들의 순서는 지키지 않아도 됩니다.
1 | String sayHello({String name, int age, String country}) { |
하지만 여기서 또 문제가 발생합니다. Dart는 null safety가 적용되는데, 매개변수 중 하나가 null 일 수도 있기 때문입니다. 다시 말해, 사용자가 name과 age, country 3개의 매개변수 중 하나라도 빼고 보낼 수 있습니다.
이때는 두 가지 옵션이 있습니다.
default value
1 | String sayHello({ |
함수를 호출할 때 아무것도 전달하지 않아도 default value가 이미 있으므로 null safety에 걸릴 일이 없습니다.
required
다음과 같이 매개변수 앞에 required
를 적어주면, 함수가 호출될 때 반드시 required
가 적힌 매개변수가 포함되어야 한다는 것입니다.
1 | String sayHello({ |
Optional Positional Paramaters
Dart에서 []
은 optional, positional parameter를 명시할 때 사용됩니다.
name, age 는 필수값이고 []를 통해 country를 optional 값으로 지정해 줄 수 있습니다.
1 | String sayHello(String name, int age, [String? country = "Korea"]) { |
QQ Operator
??
연산자를 이용하면 왼쪽 값이 null 인지 체크해서 null 이 아니면 왼쪽 값을 리턴하고 null 이면 오른쪽 값을 리턴합니다.
1 | String capitalizeName(String? name) { |
위의 코드를 더욱 간략하게 만들 수 있습니다.
1 | String capitalizeName(String? name) => name?.toUpperCase() ?? "NONE"; |
??=
연산자를 이용하면 변수 안에 값이 null 일 때를 체크해서 값을 할당해줄 수 있습니다.
1 | void main() { |
TypeDef
자료형에 사용자가 원하는 alias 를 붙일 수 있게 해 줍니다. (자료형 이름의 별명을 만들 때 사용)
1 | // 사용 전 |
1 | // 사용 후 |