Primary Constructors(주 생성자)

개념 파악하기

최소 Dart 언어 버전 3.13

기능: 클래스 선언 첫 줄에 필드 + 주 생성자를 한 번에 선언할 수 있어 상용구 코드를 크게 줄입니다. 런타임 동작 방식은 기존 일반 생성자와 완전히 동일하며 문법만 간소화된 형식입니다.

  1. Declaring parameters(선언형 매개변수): 클래스 헤더 매개변수에 var / final을 붙이면 동일한 이름의 인스턴스 필드가 자동 생성됩니다.
  2. Non-declaring parameters(일반 매개변수): 매개변수 앞에 var/final이 없으면 단순 생성자 입력값일 뿐 클래스 필드가 생성되지 않습니다.
  3. In-body constructors(클래스 내부 생성자): 클래스 중괄호 안에 작성하는 명명 생성자 / 팩토리 생성자 / 리다이렉트 생성자를 의미합니다.
  4. 강제 규칙: 주 생성자를 보유한 클래스에는 리다이렉트 생성자가 아닌 일반 생성형 생성자를 별도로 둘 수 없습니다. 모든 인스턴스가 반드시 주 생성자를 거치도록 강제하기 위함입니다.

기존 문법과 주 생성자 축약 문법 비교

// 기존 전통 문법 (중복 코드 발생)
class Point {
  int x;
  int y;
  Point(this.x, this.y);
}

// 주 생성자 축약 표기
class Point(var int x, var int y);Code language: JavaScript (javascript)

필드 자동 생성 규칙

1. var / final 키워드 사용 시

인스턴스 필드가 자동 생성됩니다.

클래스명 뒤 괄호 안에 직접 필드 변수를 선언하면 됩니다.

// x, y가 클래스의 멤버 변수로 자동 생성됨
class Point(var int x, final int y);

void main() {
  final p = Point(10, 20);
  print(p.x); // 10
  print(p.y); // 20
  // p.y = 30; // 컴파일 오류 발생, y는 final로 선언되었기 때문
}Code language: JavaScript (javascript)

위 코드를 실행하면 오류가 발생합니다.

D:\dartdemo\firstdart\bin>dart run
Building package executable...
Failed to build firstdart:firstdart:
firstdart.dart:2:13: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);
            ^^^
firstdart.dart:2:12: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);
           ^
firstdart.dart:2:36: Error: This requires the experimental 'primary-constructors' language feature to be enabled.
Try passing the '--enable-experiment=primary-constructors' command line option.
class Point(var int x, final int y);Code language: JavaScript (javascript)

오류 원인: class Point(var int x, final int y); 형식의 주 생성자 축약 문법(Primary Constructors)는 Dart의 실험적 기능이므로 현재 안정 버전 Dart에서는 기본적으로 비활성화되어 직접 실행할 경우 문법 오류가 표시됩니다.

현재 시점은 2026년 7월 10일 오후 2시 55분이며, 독자가 본 글을 읽을 때쯤 Dart가 새 버전을 정식 출시해 기본적으로 해당 문법을 지원할 수도 있습니다.

임시 테스트를 실행하려면 아래 명령어를 사용하세요.

dart run --enable-experiment=primary-constructors

2. var / final 키워드 미사용 시

단순 임시 매개변수로만 취급되며 클래스 필드가 생성되지 않습니다.

class User(String name) {
  // print(name); // 클래스 내부에서 매개변수에 직접 접근 가능하지만 this.name 필드는 생성되지 않음
  final String msg = "Hi $name"; // 컴파일 오류 발생
}

void main() {
  final u = User("Tom");
  // print(u.name); // 컴파일 오류, name 필드가 존재하지 않음
}Code language: JavaScript (javascript)

Previous:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다