불변의 객체를 만들고 싶을때, 모든 인스턴스 변수가 final인 상수 생성자를 이용하면 컴파일시 상수 객체를 만들 수 있다.
상수 생성자는 프로퍼티가 같을 땐 반복 생성을 해도 새로운 객체를 생성하지 않고 기존의 객체를 참조하여 메모리를 절약 한다.
보통 상수 Widget 생성에 사용된다.
상수 생성자로 생성된 객체 비교 : 동일 객체
class User {
final String name;
final String nickname;
final int age;
final String job;
// const 키워드를 가진 상수 생성자는 모든 instance 변수가 final이어야 한다.
const User(this.name, this.nickname, this.age, this.job);
}
void main() {
// const 키워드를 사용하지 않으면 상수 객체가 많들어 지지 않는다.
User u = const User('A', 'AA', 12, 'AAA');
printUserInfo(u);
// const 키워드를 사용하지 않으면 상수 객체가 많들어 지지 않는다.
User u2 = const User('A', 'AA', 12, 'AAA');
printUserInfo(u2);
// 두 객체를 비교한 결과가 True가 아니라면 "Different object"메시지가 나온다.
assert(identical(u, u2), "Different object");
}
void printUserInfo(User u)
{
print("User's name is ${u.name}.");
print("User's nickname is ${u.nickname}.");
print("User's age is ${u.age}.");
print("User's job is ${u.job}.");
print("\n");
}
User's name is A.
User's nickname is AA.
User's age is 12.
User's job is AAA.
User's name is A.
User's nickname is AA.
User's age is 12.
User's job is AAA.
일반 생성자로 생성된 객체 비교 : 다른 객체 생성
class User {
String name;
String nickname;
int age;
String job;
// const 키워드 없는 일반생성자
User(this.name, this.nickname, this.age, this.job);
}
void main() {
// 일반적 객체 생성
User u = User('A', 'AA', 12, 'AAA');
printUserInfo(u);
// 일반적 객체 생성
User u2 = User('A', 'AA', 12, 'AAA');
printUserInfo(u2);
// 두 객체를 비교한 결과가 True가 아니라면 "Different object"메시지가 나온다.
assert(identical(u, u2), "Different object");
}
void printUserInfo(User u)
{
print("User's name is ${u.name}.");
print("User's nickname is ${u.nickname}.");
print("User's age is ${u.age}.");
print("User's job is ${u.job}.");
print("\n");
}
Uncaught Error, error: Error: Assertion failed: file:///tmp/dartpadFOZRVE/lib/main.dart:23:10
identical(u, u2)
"Different object"
const 키워드 없이 생성된 객체 비교 : 다른 객체 생성
class User {
final String name;
final String nickname;
final int age;
final String job;
// const 키워드를 가진 상수 생성자는 모든 instance 변수가 final이어야 한다.
const User(this.name, this.nickname, this.age, this.job);
}
void main() {
// 일반적 객체 생성
User u = User('A', 'AA', 12, 'AAA');
printUserInfo(u);
// 일반적 객체 생성
User u2 = User('A', 'AA', 12, 'AAA');
printUserInfo(u2);
// 두 객체를 비교한 결과가 True가 아니라면 "Different object"메시지가 나온다.
assert(identical(u, u2), "Different object");
}
void printUserInfo(User u)
{
print("User's name is ${u.name}.");
print("User's nickname is ${u.nickname}.");
print("User's age is ${u.age}.");
print("User's job is ${u.job}.");
print("\n");
}
Uncaught Error, error: Error: Assertion failed: file:///tmp/dartpadESKZWY/lib/main.dart:23:10
identical(u, u2)
"Different object"
https://dart.dev/language/constructors#constant-constructors
공식 Document에 있는 예제의 static const의 활용
class ImmutablePoint {
static const ImmutablePoint _origin = ImmutablePoint(0, 0);
final double x, y;
const ImmutablePoint(this.x, this.y);
ImmutablePoint get origin => _origin;
}
void main() {
ImmutablePoint a = const ImmutablePoint(1, 1);
ImmutablePoint b = const ImmutablePoint(1, 1);
print("${a.x}, ${a.y}");
print("${b.x}, ${b.y}");
print(identical(a, b));
print("");
print("${a.origin.x}, ${a.origin.y}");
print("${b.origin.x}, ${b.origin.y}");
print(identical(a.origin, b.origin));
;}
1, 1
1, 1
true
0, 0
0, 0
true