Flutter

[Flutter] Optional Positional Parameters, Named Parameters란?

참깨빵위에참깨빵_ 2024. 8. 20. 20:35
728x90
반응형

제목의 2가지 키워드는 함수 포스팅에서 잠깐 나왔었다.

 

https://onlyfor-me-blog.tistory.com/737

 

[Dart] 함수(Function) 알아보기

Dart에도 당연히 함수는 존재한다. 그러나 사용법이 자바 / 코틀린과 매우 달라서 주의깊게 확인할 필요가 있다. 공식문서부터 쭉 읽어본다. https://dart.dev/language/functions Functions Everything about function

onlyfor-me-blog.tistory.com

 

이번엔 이 2가지 키워드에 대해 알아본다. 관련 공식문서는 아래를 확인한다.

 

https://dart.dev/language/functions#parameters

 

Functions

Everything about functions in Dart.

dart.dev

Named parameters(명명된 매개변수)는 명시적으로 required를 쓰지 않는 한 선택 사항(optional)이다. 함수 정의 시 {param1, param2} 형태로 명명된 매개변수를 지정한다. 기본값을 넣지 않거나 명명된 매개변수를 required로 표시하지 않으면 기본값이 null이 되기 때문에 그 타입은 nullable이어야 한다
/// bold, hidden 플래그 설정
void enableFlags({bool? bold, bool? hidden}) {...}

 

위 함수를 실제로 호출할 때는 paramName: value 형태로 명명된 매개변수를 지정해야 한다.

 

enableFlags(bold: true, hidden: false);

 

null 이외의 명명된 매개변수에 대한 기본값을 정의하려면 =를 써서 기본값을 지정한다. 이 때 지정하는 값은 컴파일 타임 상수여야 한다.

 

void enableFlags({bool bold = false, bool hidden = false}) {...}

// bold는 true가 되고 hidden은 false가 된다
enableFlags(bold: true);

 

이제 required를 사용하는 명명된 매개변수의 예시를 확인한다. 공식문서에서 말하는 것처럼 required를 지정해서 함수 호출 시 그 매개변수 값을 반드시 제공하게 한다.

 

void enableFlags({bool? bold, required bool? hidden}) {
  // 함수 로직
}

 

이 때 bold 파라미터의 값만 설정하고 hidden 파라미터는 설정하지 않았다면 vs code 기준 아래 에러가 발생한다.

 

The named parameter 'hidden' is required, but there's no corresponding argument. Try adding the required argument

명명된 매개변수 'hidden'이 필수지만 해당 매개변수가 없다. required 매개변수를 추가하라

 

IDE 선에서 컴파일 에러를 띄워주기 때문에 hidden 파라미터를 추가하면 곧바로 에러가 사라진다.

명명된 매개변수와 Positional Parameters를 같이 쓰는 경우, 명명된 매개변수는 먼저 호출하든 나중에 호출하든 상관없다. dart가 명명된 매개변수를 반드시 어느 위치에서 사용하라고 만들지 않았기 때문에 본인의 코드 스타일에 맞춰 작성하는 것만 생각하면 된다.

 

다음은 Positional Parameters에 대한 내용이다.

 

함수 매개변수 집합을 대괄호로 묶으면 Optional positional parameters로 표시된다. 기본값이 없으면 null이 되므로 해당 타입은 nullable해야 한다
String say(String from, String msg, [String? device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}
아래는 optional parameter 없이 함수를 호출하는 예시, 3번째 매개변수를 써서 함수를 호출하는 예시다
assert(say('Bob', 'Howdy') == 'Bob says Howdy');

assert(say('Bob', 'Howdy', 'smoke signal') ==
    'Bob says Howdy with a smoke signal');
null 외의 optional positional parameter에 대한 기본값을 정의하려면 =를 써서 기본값을 지정한다. 지정된 값은 컴파일 타임 상수여야 한다
String say(String from, String msg, [String device = 'carrier pigeon']) {
  var result = '$from says $msg with a $device';
  return result;
}

assert(say('Bob', 'Howdy') == 'Bob says Howdy with a carrier pigeon');

 

이제 다른 곳에선 두 개념을 어떻게 설명하는지 확인한다.

 

https://www.dhiwise.com/post/the-ultimate-guide-to-dart-named-parameters

 

Mastering Dart Named Parameters

Know about the Dart named parameters and their advantages.

www.dhiwise.com

(중략)...명명된 매개변수는 함수에 매개변수를 전달하는 고유 접근방식을 제공해서 코드 가독성, 유지보수성을 향상시킨다. dart에서 명명된 매개변수는 함수 매개변수 목록에서 중괄호 안에 정의된다. 이렇게 하면 이 매개변수가 선택사항이고, 함수 호출 시 해당 이름으로 참조할 수 있다고 dart 컴파일러에 알릴 수 있다
void main() {
    calculateArea(length: 10, width: 5); // Calling function with named parameters
}

void calculateArea({int length, int width}) {
    print('Area is ${length * width}');
}
위 예시에서 length, width는 명명된 매개변수다. calculateArea() 호출 시 매개변수 이름을 지정해서 전달하므로 함수 호출을 쉽게 이해할 수 있다

< 명명된 매개변수의 장점 >

- 가독성 : 매개변수 이름을 지정하면 각 매개변수가 뭘 나타내는지 명확하게 알 수 있어서 함수를 더 읽기 쉽고 이해하기 쉽다
- 유연성 : 명명된 매개변수를 쓰면 매개변수 순서는 중요하지 않다. 매개변수 이름만 지정하면 어떤 순서로든 인수를 전달할 수 있어서 잘못된 매개변수 순서로 인한 오류 발생 가능성을 줄일 수 있다
- 선택적 파라미터 : 명명된 매개변수는 기본적으로 선택 사항이다. 즉 함수 호출 시 각 명명된 매개변수에 대한 값을 전달할 필요가 없다

positional parameter(위치 매개변수)는 함수에 매개변수를 전달하는 전통적 방법이지만 dart의 명명된 매개변수는 더 유연하고 읽기 쉬운 접근법을 제공한다. 위치 매개변수에선 순서가 매우 중요하다. 함수에 정의된 순서와 동일한 순서로 매개변수를 전달해야 한다...(중략)...또한 위치 매개변수는 기본적으로 필수(required)지만 명명된 매개변수는 선택사항이다. 즉, 함수 호출 시 명명된 매개변수의 일부 또는 전부를 생략할 수 있지만 위치 매개변수는 명시적으로 선택사항으로 표시하지 않는 한 불가능하다

Optional parameters(선택적 매개변수)는 함수 호출에서 생략 가능해서 매개변수가 항상 필요하지 않을 때 유용하다. 선택적 매개변수가 있는 함수를 호출할 때 선택적 매개변수의 일부, 전체 또는 어느 값도 전달하지 않게 선택할 수 있다. 선택적 매개변수에 값이 제공되지 않고 기본값이 할당된 경우 기본값이 사용된다
선택적 매개변수는 optional positional parameters(선택적 위치 매개변수), optional named parameters(선택적 명명된 매개변수)의 2가지 방식으로 정의할 수 있다

아래 예시에서 age는 선택적 위치 매개변수다. printDetails()를 호출 시 생략할 수 있다. 그러나 선택적 명명된 매개변수는 함수의 매개변수 목록에서 중괄호 안에 정의된다
void main() {
    printDetails('John'); // 선택적 위치 매개변수 사용해서 호출
}

void printDetails(String name, [int age]) {
    print('Name: $name, Age: $age');
}
아래 예시에서 age는 선택적 명명된 매개변수다. printDetails()를 호출 시 생략 가능하다
void main() {
    printDetails('John'); // 선택적 명명된 매개변수 사용해서 호출
}

void printDetails(String name, {int age}) {
    print('Name: $name, Age: $age');
}
선택적 명명된 매개변수, 선택적 위치 매개변수 모두 함수 호출에 유연성을 제공하지만, 선택적 명명된 매개변수는 매개변수명을 지정해서 원하는 순서대로 전달할 수 있어 함수 호출을 더 읽기 쉽게 만들 수 있다. 그러나 선택적 위치 매개변수는 함수에 정의된 순서와 동일한 순서로 전달해야 한다. 또한 선택적 명명된 매개변수를 사용하면 매개변수에 기본값을 할당할 수 있고, 이렇게 하면 함수 호출 시 매개변수가 생략된 경우 사용된다. 선택적 위치 매개변수에선 이것이 불가능하다...(중략)

 

 

https://stackoverflow.com/questions/13264230/what-is-the-difference-between-named-and-positional-parameters-in-dart

 

What is the difference between named and positional parameters in Dart?

Dart supports both named optional parameters and positional optional parameters. What are the differences between the two? Also, how can you tell if an optional parameter was actually specified?

stackoverflow.com

dart에는 명명된 / 위치 매개변수가 있다. dart의 선택적 매개변수는 호출자가 함수를 호출할 때 매개변수에 대한 값을 지정할 필요가 없다는 점에서 선택적이다. 선택적 매개변수는 required 뒤에만 선언할 수 있다. 선택적 매개변수에는 호출자가 값을 지정하지 않을 때 사용되는 기본값이 있다

< 선택적 위치 매개변수 >

대괄호로 묶인 매개변수다
getHttpUrl(String server, String path, [int port=80]) {
  // ...
}

getHttpUrl('example.com', '/index.html', 8080); // port == 8080
getHttpUrl('example.com', '/index.html');       // port == 80
위에서 port는 선택 사항이고 기본값은 80이다. 3번째 매개변수를 포함하거나 포함하지 않고 함수를 호출할 수 있다
여러 위치 매개변수를 지정한 경우, 각 값이 무엇인지 알지 못하면 각 숫자가 뭔지 알기 어렵다. 명명된 선택적 매개변수를 써서 더 읽기 쉬운 API를 만들 수 있다

< 선택적 명명된 매개변수 >

중괄호로 묶인 매개변수다
getHttpUrl(String server, String path, {int port = 80}) {
  // ...
}

getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080
getHttpUrl('example.com', '/index.html');             // port == 80
3번째 매개변수를 포함하거나 포함하지 않고 함수를 호출할 수 있다. 함수 호출 시 매개변수 이름을 적어야 한다. 여러 매개변수를 지정할 수도 있으며 이름으로 참조되므로 선언된 순서와 다른 순서로 사용할 수 있다
getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', port: 8080);
getHttpUrl('example.com', '/index.html', port: 8080, numRetries: 5);
getHttpUrl('example.com', '/index.html', numRetries: 5, port: 8080);
getHttpUrl('example.com', '/index.html', numRetries: 5);

 

매개변수의 의미를 명확하게 알 수 있다면 선택적 위치 매개변수를 써도 문제 없겠지만, 이런 경우가 얼마나 있을지 모르겠다. 차라리 required를 붙여서 명명된 매개변수를 만든다면 사용하는 입장에서도 크게 문제없이 사용할 수 있을 것 같다.

반응형