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

2021. 6. 16. 01:45·Mobile/Flutter
반응형

 

생성자(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 키워드는 인스턴스 변수와 일반 변수의 이름이 겹치는 경우에만 사용

 

생성자 특징

1. 기본생성자(Default Constructor)

생성자가 없는 경우 기본생성자가 자동으로 제공된다. (단, 생성자가 존재하는 경우 기본생성자는 제공되지 않는다.)

기본생성자(Default Constructor)란?

클래스와 동일한 이름의 매개변수가 없는 생성자이다.

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

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

class Super {
  Super();
}

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

3. Named constructors

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

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;
}

4. Initializer List

생성자의 body를 실행하기 전 initializer list를 사용하여 인스턴스의 변수를 초기화를 할 수 있다. 생성자 이름 옆에 콜론(:)과 콤마(,)로 구분하여 사용한다. 값에 this 접근자 사용할 수 없다.

생성자의 실행 순서(필수/선택)

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

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Mobile > Flutter' 카테고리의 다른 글

Dart의 final / const 선언자 비교  (0) 2020.11.25
'Mobile/Flutter' 카테고리의 다른 글
  • Dart의 final / const 선언자 비교
helperwoo
helperwoo
\ೕ( ・ㅂ・)و /
  • helperwoo
    WooLog
    helperwoo
  • 전체
    오늘
    어제
    • All (55)
      • Web (25)
        • PHP (6)
        • Java (5)
        • Javascript (8)
        • Laravel (2)
        • Spring Boot (0)
        • React.js (1)
        • Electron.js (1)
        • Vue.js (1)
        • Nest.js (1)
      • Mobile (2)
        • Flutter (2)
      • SQL (1)
        • MySQL (4)
      • Docker (6)
      • Server (7)
      • Git (2)
      • Tool (3)
      • AI (2)
      • Tip (3)
      • Log (0)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      코드
      Compose
      MYSQL
      recursive
      Laravel
      php
      dart
      알고리즘
      DB연동
      with
      frankenphp
      websocket
      vscode
      git
      image
      CTE
      nginx
      docker
      apache
      flutter
      프로그래머스
      ollama
      CLI
      데이터베이스
      엘리스
      http
      deepseek
      챌린지
      JavaScript
      ignorecase
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    helperwoo
    Dart Class Constructors 생성자 [Constructors, Named Constructors, Initializer List]
    상단으로

    티스토리툴바