Option Parameter

BC_kkingkkang·2025년 11월 17일

Dart의 파라미터 종류

1. Required Parameter
2. Optional Positional Parameter
3. Optional Named Parameter

Optional은 다시 nullable 기반인지(default가 없는지), 기본값(nullable value) 기반인지에 따라 동작이 달라진다.


Optional Positional Parameter - 선택적 위치 파라미터 ([])

1. nullable 형태 (기본값 없음 -> 생략 시 null)

void func(String a, [int? b]) {
    print('$a, $b');
}
func("hello");		// b -> null
func("hello", 3);	// b -> 3
  • []안의 파라미터는 전달해도 되고 생략해도 된다.
  • 기본값을 지정하지 않으면 nullable(?)로 만드는 것이 일반적이다.
  • 생략 시 null이 들어간다.

2. 기본값 형태 (nullable 필요 없음)

void func(String a, [int count=1]) {
	print('$a $count');
}
func("Apple");		// Apple 1
func("Apple", 10);	// Apple 10
  • 기본값을 지정하면 nullable(?)이 필요없다.

Optional Named Parameter - 선택적 이름 파라미터({})

1. nullable 형태 (기본값 없음)

void show({String? name, int? age}) {
	print('name=$name, age=$age');
}
show();							// name=null, age=null
show(name : "BCKkingkkang");	// name=BCKkingkkang, age=null
  • {} 내부 파라미터는 이름 기반 전달
  • 생략해도 되며 기본 값이 없으면 nullable이 일반적이다.

2. 기본값 형태

void show({String name='none', int age=0}) {
	print('$name, $age');
}
show();							// none, 0
show(name : 'BCkkingkkang');	// BCKkingkkang, 0
show(age : 27);					// none, 27

required가 붙으면 Optional이 아니다

void createUser({required String name, int age=0}) {}
  • 이런 경우 name은 필수, age는 optional이다.

변수에 쓰는 ?

Nullable Type (Null Safety)

String? name;
  • namenull을 가질 수 있다는 의미
  • 단순히 변수 타입 선언에 사용되는 문법으로 Optional Parameter와 관련이 없다.

Java의 오버로딩 대체 가능

Java

void print(String a) {}
void print(String a, int b) {}

Dart

void print(String a, [int? b]) {}

선택적 위치 파라미터를 쓰는 이유

void func(int a, [int? b, int? c]) {}
  • 순서가 중요함
  • 호출 시 순서대로 전달해야 함
  • 인자가 많지 않고 의미가 명확할 때 적합하다.

왜 필요한가?

  • 가벼운 함수, 단순한 함수에 좋다.
  • 파라미터가 많지 않고, 이름을 굳이 붙일 필요가 없을 때
move(10);		// x = 10
move(10, 20);	// x = 10, y = 20

여기서 x, y는 순서가 명확하기 때문에 이름을 붙일 필요가 없다.

선택적 이름 파라미터를 쓰는 이유

void func({int? a, int? b}) {}
  • 순서가 중요하지 않음
  • 호출할 때 이름을 함께 써야 함
  • 인자가 많거나 의미가 모호할 때 매우 유용

왜 필요한가

  • 실수를 줄이기 위해
  • 어떤 값이 어떤 역할인지 명확하게 보이기 위해
  • 파라미터가 많아질수록 이름 필수
createUser(age : 20, name : 'K');

이런 식이면 실수가 거의 없다. 하지만 위치 파라미터라면

createUser(20, 'K');

agename이 헷갈릴 가능성이 있다.

결론 - 선택적 이름/위치 파라미터를 구분하는 이유

  1. 가독성 차이
    • 위치 파라미터는 빠르고 간단하여 가벼운 함수에 좋다
    • 이름 파라미터는 명확하고 안전하여 중요한 파라미터가 많을 때 좋다.
  2. 실수 방지
    • 이름 파라미터는 어떤 값을 넣는지 명확하기 때문에 대규모 프로젝트에서 버그를 크게 줄여준다.
  3. 기본 값 처리 차이
    • 위치 optional []
    • 이름 optional {}
    • Dart는 null safety 때문에 이름 파라미터는 거의 항상 required와 세트로 사용된다.

0개의 댓글