final과 const는 Dart 언어의 대표적인 상수 선언 키워드입니다.
final과 const는 어떤 차이가 있는지 알아보겠습니다.
final int a = 10;
a = 5; // 오류: The final variable 'a' can only be set once.
const int b = 10;
b = 5; // 오류: Constant variables can't be assigned a value.
두 키워드는 값이 변하지 않아야 하는 상수의 특성을 가지고 있습니다.
final은 런타임 시점에 값이 할당되어 상수가 되고,
const는 컴파일 시점에 값이 할당되어 상수가 됩니다.
컴파일이 된 후에 런타임 상태가 되므로,
const는 프로그램이 실행되기 전에 컴파일하는 과정에서 할당이 되는데
이 때문에 차이가 생깁니다.
final a = DateTime.now();
print(a);
> 2024-03-05 19:27:27.106124
const b = DateTime.now();
// 오류: Const variables must be initialized with a constant value
DateTime.now()는 현재의 시간을 알려주는 코드입니다.
여기서의 현재란 코드가 실행되었을 때를 말하는데
final의 경우에는 코드가 실행되는 런타임 시점 동안에 할당이 되는 반면
const는 그 전에 할당을 받아야하기 때문에 오류가 발생합니다.
따라서 const는 프로그램을 실행하기 전에 값이 할당되어 있어야 정상적으로 사용할 수 있습니다.
생성자의 경우에서도 차이점을 살펴볼 수 있습니다.
class Warrior() {
static final int maxHp = 100;
String name;
String hp;
Warrior(this.name, this.hp = maxHp);
// 오류: The default value of an optional parameter must be constant
}
class Warrior() {
static const int maxHp = 100;
String name;
String hp;
Warrior(this.name, this.hp = maxHp);
}
static과 생성자는 런타임 전에 값이 결정되어야 하기 때문에
런타임 시점에 할당되는 final은 이 경우에 사용할 수 없습니다.
따라서 이런 상황에서는 const를 사용하여야 합니다.
또한 처음 상수를 선언할 때에도 다른 부분이 있습니다.
final int a;
final int a = 1;
const int b;
const int b = 1;
// 오류: The constant 'b' must be initialized.
final의 경우 선언하면서 값을 할당하지 않아도 나중에 1번 할당이 가능하지만
const는 선언하면서 바로 할당을 해줘야 합니다.