Mokyung

Dart의 Constructor 본문

컴퓨터/Flutter

Dart의 Constructor

Mokyung 2021. 9. 4. 19:17

Dart 언어에서 class는 아래와 같은 형태를 가진다.

class Person {
  String name;
  int age;
}
var person = Person();
person.name = 'Ho';
person.age = 30;
Dart의 특징 중 하나가 nullable 체크를 강하게 한다는 것인데, 웹에서 Dart를 사용해볼 수 있는 DartPad.dev 같은 곳에서도 쉽게 Null Safety 옵션을 사용할 수 있다.
해당 옵션을 사용할 경우 class instance의 field 중 Non-nullable인 field는 반드시 초기값이 있어야 한다.

Constructor에서 parameter를 받는 방식

1. Constructor with positonal arguments

class를 갖는 다른 언어들처럼 constructor도 가질 수 있다.

class Person {
  String name;
  int age;

  Person(this.name, this.age);
  // 위와 같은 뜻.
  // Person(String name, int age) {
  //   this.name = name;
  //   this.age = age;
  // }
}
var person = Person('Ho', 30);

여기서 Person('Ho', 30);에 사용된 arguments들은 순서에 따라 값이 들어가는 positional arguments이다.

2. Constructor with named parameters

Dart에서 class instance 생성시에 parameter 이름을 사용해서 값을 넣어줄 수도 있는데, 이 때에는 constructor의 파라미터에 중괄호를 추가해야한다.

class Person {
  String name;
  int age;

  Person({this.name, this.age}); // 중괄호 추가
}
var person = Person(name: 'Ho', age: 30);
// var person = Person('Ho', 30); Error

이렇게 중괄호로 묶어서 named parameter로 만들어주면 꼭 이름을 명시해서 파라미터를 넣어줘야한다.

named parameter는 기본적으로 optional하다고 인식되기 때문에, Null Safety 옵션이 켜져있을 경우에는 추가적인 작업이 필요하다.
non-nullable한 파라미터의 경우 required 키워드나 기본 값을 넣어줘야 한다.
Person({required this.name, this.age = 0});

3. Mixed

positional arguments와 named parameter를 혼용해서 사용도 가능하다.
하지만 헷갈리기 쉬울 수 있으니 꼭 필요한 상황에만 사용하는 것이 좋다.

class Person {
  String name;
  int age;
  
  Person(String name, {int age}) {
    this.name = name;
    this.age = age;
  }
}
var person = Person('Ho', age: 30);
Flutter의 Text 위젯의 경우 메인으로 받는 String data는 positional arguments, 나머지 style 등은 named parameter로 받는다.
꼭 받아야하는 메인 파라미터에 positional 방식을, 그 외의 optional한 파라미터를 받는데에 named 방식을 사용하는 경우가 흔한 것 같다.

Named Constructor

Dart에서 한 class는 여러 constructor를 가질 수 있는데, 특이한 점은 각 constructor에 이름을 붙인다는 것이다.

class Person {
  String name;
  int age;

  Person(this.name, this.age);
  
  Person.old(this.name) {
    this.age = 100;
  }
}
var person = Person.old('Ho');

Java 등의 언어에서는 보통 파라미터의 차이를 이용해서 constructor를 구분하곤 했는데, Dart는 특이하게 이름을 통해 구분한다.

이름을 통해 constructor를 구분하니 객체 생성시에 헷갈림 없이 정확히 원하는 constructor 사용이 가능하다.

느낀점

  • 중괄호를 통해 파라미터 받는 방식이 변경되는 점이 상당히 신기하다.
    두가지 입력방식을 다 지원하더라도, 보통 함수 선언측은 코드는 똑같았던 것 같은데.
    클래스를 작성할 때 받는 값이 적으면 positional arguments 방식, 받는 값이 많으면 named parameters만 혹은 섞어서 사용하도록 하는 편이 좋을 것 같다.
  • constructor에 이름을 붙이는게 참 신기하다. 팩토리 패턴의 느낌이 드는 것도 같고..

'컴퓨터 > Flutter' 카테고리의 다른 글

Flutter의 Flexible Widget & Expanded Widget  (0) 2021.09.07
Dart의 final vs const  (0) 2021.09.06
Dart의 private 선언  (0) 2021.09.05
Comments