Dart의 named parameter

김흰돌·2024년 9월 20일

글쓴이는 Dart를 사용하다 보면 가끔 헷갈릴 때가 생기곤 한다.

class IsarRepository {
  final Isar isar;

  IsarRepository(
    this.isar,
  );
}

class IsarRepository {
  final Isar isar;

  IsarRepository({
    required this.isar
});
}

IsarRepository({}), IsarRepository()의 차이가 뭐였지???

이번 기회에 글로 정리하여 Dart에 대한 기본 개념을 다지려고 한다.

IsarRepository(this.isar)

이 방식은 위치 매게변수를 사용한다.

  • 매개변수가 필수이며, 순서대로 전달해야 한다.
  • 간결하지만, 매개변수의 의미를 이해하기 위해 생성자 정의를 봐야 할 수 있다.

IsarRepository({required this.isar})

이 방식은 명명된 매개변수를 사용한다.

  • 매개변수 이름을 명시적으로 지정해야 한다.
  • required 키워드로 인해 이 매개변수는 필수이다.
  • 코드의 가독성이 향상되며, 매개변수의 의미가 더 명확하다.

주요 차이점

  • 가독성: 명명된 매개변수 방식({required this.isar})이 일반적으로 더 가독성이 좋다. 특히 여러 매개변수가 있을 때 유용하다.
  • 유연성: 명명된 매개변수를 사용하면 매개변수의 순서를 신경 쓰지 않아도 된다.
  • 필수 여부: required 키워드를 사용하면 해당 매개변수가 반드시 제공되어야 함을 명시할 수 있다.
  • API 설계: 명명된 매개변수를 사용하면 나중에 새로운 선택적 매개변수를 추가하기 쉽다.

예제

class IsarRepository {
  final Isar isar;
  final String? name;
  final bool debugMode;

  // 위치 매개변수만 사용
  IsarRepository(this.isar) : name = null, debugMode = false;

  // 명명된 매개변수 사용, 일부는 선택적
  IsarRepository({
    required this.isar,
    this.name,
    this.debugMode = false,
  });

  // 위치 매개변수와 명명된 매개변수 혼합
  IsarRepository(this.isar, {this.name, this.debugMode = false});
}

// 사용 예
void main() {
  final isar = Isar.getInstance()!;
  
  // 위치 매개변수
  final repo1 = IsarRepository(isar);

  // 명명된 매개변수
  final repo2 = IsarRepository(isar: isar, name: 'MyRepo', debugMode: true);

  // 혼합 사용
  final repo3 = IsarRepository(isar, name: 'AnotherRepo');
}

이 예제에서 볼 수 있듯이, 명명된 매개변수를 사용하면 코드의 가독성이 향상되고, 선택적 매개변수를 쉽게 추가할 수 있다.
또한 매개변수의 의미가 더 명확해져 API를 사용하는 개발자들이 쉽게 이해할 수 있다.

profile
Android, Flutter

0개의 댓글