개념 파악하기
최소 Dart 언어 버전 3.13
기능: 클래스 선언 첫 줄에 필드 + 주 생성자를 한 번에 선언할 수 있어 상용구 코드를 크게 줄입니다. 런타임 동작 방식은 기존 일반 생성자와 완전히 동일하며 문법만 간소화된 형식입니다.
- Declaring parameters(선언형 매개변수): 클래스 헤더 매개변수에
var/final을 붙이면 동일한 이름의 인스턴스 필드가 자동 생성됩니다. - Non-declaring parameters(일반 매개변수): 매개변수 앞에
var/final이 없으면 단순 생성자 입력값일 뿐 클래스 필드가 생성되지 않습니다. - In-body constructors(클래스 내부 생성자): 클래스 중괄호 안에 작성하는 명명 생성자 / 팩토리 생성자 / 리다이렉트 생성자를 의미합니다.
- 강제 규칙: 주 생성자를 보유한 클래스에는 리다이렉트 생성자가 아닌 일반 생성형 생성자를 별도로 둘 수 없습니다. 모든 인스턴스가 반드시 주 생성자를 거치도록 강제하기 위함입니다.
기존 문법과 주 생성자 축약 문법 비교
// 기존 전통 문법 (중복 코드 발생)
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: 생성자