Flutter

Flutter: Dart Class Constructors 생성자 [Constructors, Named Constructors, Initializer List]

helperwoo Dev 2021. 6. 16. 01:45
반응형

 

생성자(Constructors)


- 생성자는 클래스 안에 클래스와 같은 이름의 함수를 추가한다.

class Point {
  double x = 0;
  double y = 0;

  // 방법1: 생성자의 매개변수로 값을 받아 생성자 본문에서 변수를 초기화
  Point(double x, double y) {
    this.x = x;
    this.y = y;
  }
  
  // 방법2: 생성자의 매개변수를 인스턴스의 변수로 할당
  Point(this.x, this.y);
}

// this 키워드는 현재 인스턴스(Point)를 의미
// this 키워드는 인스턴스 변수와 일반 변수의 이름이 겹치는 경우에만 사용

 

생성자의 특징


➡️ 생성자가 없는 경우 기본생성자(Default Constructor)가 자동으로 제공된다.
반대로 생성자가 존재하는 경우 기본생성자는 제공되지 않는다.

class Test {
  String name;
  // 생성자를 정의하지 않을 경우 기본적으로 Test(); 생성자를 제공
  // Test();
  // 별도의 생성자가 존재하므로 기본생성자를 제공하지 않는다.
  Test(this.name);
  // 하지만, 선택적 매개변수를 사용할 경우 기본생성자도 제공이 된다.
  Test({this.name});
}

- 기본생성자(Default Constructor)란?
생성자의 이름이 클래스 이름과 동일하고, 매개변수가 없는 생성자이다.
위 예제의 class Test의 기본생성자는 Test(); 이다.


➡️ 하위 클래스는 상위 클래스의 생성자를 상속받지 않는다.

class Super {
  Super();
}

class Sub extends Super {
  // 기본생성자만 갖고있음
  // Sub();
}



➡️ 명명된 생성자(Named constructors)를 사용하면 하나의 클래스에 여러 종류의 생성자를 생성할 수 있다.
하위 클래스는 생성자를 상속받지 않기 때문에 명명된 생성자 또한 별도로 생성하여야 한다.

const double xOrigin = 0;
const double yOrigin = 0;

class Point {
  double x = 0;
  double y = 0;

  Point(this.x, this.y);

  // 명명된 생성자
  Point.origin()
      : x = xOrigin,
        y = yOrigin;
}




➡️ 초기화 목록(Initializer List)을 사용하여 생성자 실행 전에 인스턴스의 변수를 초기화를 할 수 있다.
* 클래스의 생성자 실행 순서(필수실행, 선택적 실행):
초기화 목록(Initializer List)상위 클래스(extends가 있는 경우)의 기본생성자하위 클래스의 기본생성자

Initializer List는 생성자 옆에 콜론( : )으로 시작하여 콤마( , )로 구분한다.
Initializer List 목록 중 "=" 우측에는 인스턴스의 변수를 적용할수 없다.

class Point {
  double x, y;
  Point.fromJson(Map<String, double> json)
      : x = json['x']!,
        y = json['y']! {
    print('In Point.fromJson(): ($x, $y)');
  }
}



상위 클래스의 기본생성자가 없는 경우에 하위 클래스 생성자는 에러가 발생한다. 이유는 하위 클래스는 생성자의 본문을 실행하기 전에 상위 클래스의 기본생성자를 호출하기 때문이다. 이때 상위 클래스의 다른 생성자를 호출하여야 하는데, 이를 처리할 수 있는 방법이 Initializer List를 이용하여 해결할 수 있다.

class Super {
  String name;
  // 상위 클래스의 기본생성자
  // Super();
  // Super.fromJson(Map data) 생성자
  Super.fromJson(Map data) {
    print('Super Class');
  }
}

class Sub extends Super {
  // Error: The superclass, 'Super', has no unnamed constructor that takes no arguments.
  Sub.fromJson(Map data) {
    print('Sub Class');
  }
  
  // Initializer List로 해결
  Sub.fromJson(Map data) : super.fromJson(data) {
    print('Sub Class');
  }
}

void main() {
  var sub = Sub.fromJson({});
  print(sub);
}


 

A tour of the Dart language

A tour of all the major Dart language features.

dart.dev

 

반응형

'Flutter' 카테고리의 다른 글

Flutter: Dart의 final과 const 선언자 비교  (0) 2020.11.25