Dart

(Dart) Named Parameters

돗개진 2024. 10. 16. 15:21

Named Parameters

인자의 이름을 명시해서 값을 전달하는 방식으로 인자의 순서에 구애받지 않고 이름을 지정하여 값을 전달할 수 있기 때문에 가독성이 높아지고 선택적으로 인자를 전달할 수 있게 한다.

 

(조건)

- named argument 를 사용하기 위해서 parameter 리스트를 가지게 해야 함.

ex) sayHello({String name, int age, String country,}) { }

- null 값이 전달되고 해당 값을 참조하게 될 것을 Dart가 우려하기 때문에 매개변수의 기본값을 넣어줘야 함 (null 참조 방지)

 


 

null safety 방지 방법 2가지

 

1. default value를 줘서 방지하는 방법

String sayHello({
  String name = 'anon',
  int age = 99,
  String country = 'wakanda', // 마지막 아이템에 , 를 붙이면 알아서 포맷됨
}) {
  return "Hello $name, you are $age, and you come from $country";
}

 

위 코드는 argument 에 default value 를 주기 때문에 해당 함수를 호출할 때 null 값을 전달해도 기본값을 참조하여 null safety 방지가 가능하다.

 

 

 

2. require modifier 를 사용해서 '필수 값' 으로 만드는 방법

String sayHello({
// null safety 방지를 위한 두 번째 방법으로 인자에게 required 지정자를 붙여서 반드시 인자를 전달 받도록 하는 방법임
  required String name,
  required int age,
  required String country, // 마지막 아이템에 , 를 붙이면 알아서 포맷됨
}) {
  return "Hello $name, you are $age, and you come from $country";
}

 

위 코드에서 인자에게 required 지정자를 붙여 반드시 인자를 전달 받도록 하는 방법이며, 로그인 같은 기능을 구현할 때 사용자가 반드시 데이터를 넘겨줘야 실행 가능하기 때문에 해당 방법을 사용하면 적절하다.

 

void main() {
  print(sayHello(
    // 함수의 정의를 확인하고 순서에 상관없이 그에 맞게 인자를 명시하여 값을 넘김
    age: 20,
    country: 'korea',
    name: '슬슬',
  ));

  print(sayHello(
    age: 10,
    name: '산이',
    country: 'koera',
  ));
  // sayHello 함수를 호출하려면 required 인자를 반드시 전달해야 하기 때문에 오류가 뜸
}

 


 

Parameter 의 두 가지 종류

  •  Positional Parameter
    - parameter 의 순서를 지켜주며 인자를 전달해야 한다.
    - 문제점) 함수를 호출할 때마다 각각의 위치를 기억해야 한다.
String sayHello(String name, String country, int age) {
  return "Hello $name, you are $age, and you come from $country";
}

void main() {
  sayHello('nico', 'wakanda', 12); // 3 positional argument 를 요구함
}

 

=> 위와 같은 방법을 지양해야 함. 왜냐하면 해당 function이 같은 파일 내에 있지 않을 때 인자만 보고 이해하기가 어려움 (가독성 저하)
  

  •   Optional Positional Parameters
    - 매개변수 중 하나의 인자는 받지 않아도 되는 경우의 설정
    - 값을 받지 않아도 되는 인자에게 대괄호를 씌우고 nullable 하게 바꾼 뒤 default value 를 준다
    - 주의점) 잘 사용하지 않는다.
String sayHello(String name, int age, [String? country = 'cuba']) => 'Hello $name, you are $age years old from $country';

void main() {
  var result = sayHello('nico', 12,); // 따라서 country 인자를 넘겨주지 않아도 에러 X
  print(result);
}

 

=> 위 방법은 매개변수 중 값을 받지 않아도 되는 인자를 따로 설정해 주는 경우에 사용하는 방법이나, 잘 사용하지 않는다.