앱 개발/Dart

Dart Functions(함수) - Optional Positional Parameters, QQ Operator, Typedef

태기 2024. 5. 9. 07:59

1. Optional Positional Parameters

String sayHello(
  String name,
  int age,
  [String? country = 'korea']
) =>
    'Hello $name, you are $age years old from $country';

void main() {
  var result = sayHello('taek', 20);
  print(result);
}

일부 parameter에 null을 받으면 default value를 설정할 수 있게 한다.

형식은 메서드의 매개변수에 대괄호[]를 하고 타입 뒤에 ?를 붙여서 null이 가능하게 만든 다음, 뒤에 default value를 설정해주는 것이다. 

 

 

2. QQ Operator(Question Question Operator)

'??' or '?='

Flutter에서 자주 사용된다.

 

예를 들어 내 이름을 대문자로 반환하는 메서드를 만들어보겠다.

String capitalizeName(String name) => name.toUpperCase();

void main() {
  capitalizeName('taek');
}

여기서 name에 null을 입력하면 좋겠다고 해서 아래와 같이 작성해주면, toUpperCase()가 오류가 뜬다. null일지도 모르는 값에 toUpperCase()를 호출할 수 없기 때문이다.

따라서 이것을 해결하는 방법은
첫번째, if 조건문으로 null일 때와 아닐 때 구분하여 return한다.

두번째, 이걸 fat arrow를 이용해서 짧게 만들 수 있다.

그런데 여기서 더 짧게 만들 수 있다. -> qq operator

 

 

다음으로 넘어가기 전에 하나 더 알아야 할 것.

 

qq equals || qq assignment operator 

 

null 일 수 있는 name variable을 만들고 다음과 같이 적어주는데, 

??= 의 의미는 '만약 name이 null이라면 다음의 값을 할당해라' 이다.

위처럼 두번 작성하면 경고창이 뜨면서 실행이 되는데,

name ??= 'anon';

위에서 'taek'을 할당해 주기 때문에, 'null이 될 수 없어서 name ??= 'anon'; 은 절대 실행될 수 없다' 라고 알려주는 것이다.

 

 

3. Typedef

자료형이 헷갈릴 때 도움이 될 alias을 만드는 방법이다.

typedef는 자료형에 alias를 붙일 수 있게 해준다.

List<int> reversListOfNumbers(List<int> list) {
  var reversed = list.reversed;
  return reversed.toList();
}

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

reversListOfNumbers() 메서드를 보면 매개변수로 받는 자료형도 List<int>이고 반환형도 List<int>로 동일하다. 위 소스코드에서 이걸 typedef로 정의해서 바꾼다면,

이렇게 수정이 가능하다.

 

typedef는 우리가 원하는 만큼 생성할 수 있다.

 

Map도 typedef로 정의해서 예시를 작성해보겠다.

이렇게 작성할 수 있는데, Map처럼 구조화된 data의 형태를 지정하고 싶다면, class를 배워야한다.

class에 대한 내용은 다음 포스팅에서 보겠다.