Dart에서는 변경할 수 없는 값, 즉 상수를 선언할 때 const
와 final
키워드를 사용할 수 있습니다. 이 두 키워드는 비슷해 보이지만, 사용 목적과 동작 방식에서 차이가 있습니다. 이번 글에서는 const
와 final
의 차이를 비교하며 언제 어떤 키워드를 사용해야 하는지 살펴보겠습니다.
기본적으로 최초의 값이 한번 할당되면 다시 할당할 수 없다는 논리가 적용됩니다.
1. final
키워드
final
키워드는 한 번만 할당할 수 있는 변수를 선언할 때 사용됩니다. 하지만 final
변수는 런타임에 값을 결정할 수 있습니다.
final
변수 선언 예제
void main() {
final String name = "Dart";
print(name); // Dart
final now = DateTime.now(); // 실행 시점에 할당됨
print(now);
}
특징
✅ 선언 후 값 변경 불가 (한 번만 할당 가능)
✅ 런타임에 값이 결정될 수 있음
✅ 객체의 내부 값은 변경될 수 있음 (mutable object 가능)
void main() {
final List<int> numbers = [1, 2, 3];
numbers.add(4); // 정상 동작 (리스트의 내부 요소 변경 가능)
print(numbers); // [1, 2, 3, 4]
}
하지만 numbers
자체를 다른 리스트로 변경하려고 하면 오류가 발생합니다.
numbers = [5, 6, 7]; // 오류 발생 ❌
2. const
키워드
const
키워드는 컴파일 타임에 결정되는 상수를 선언할 때 사용됩니다. 즉, const
변수는 프로그램 실행 전에 미리 결정되어야 합니다.
const
변수 선언 예제
void main() {
const double pi = 3.1415;
print(pi);
const int maxCount = 100;
print(maxCount);
}
특징
✅ 선언 후 값 변경 불가 (한 번만 할당 가능)
✅ 컴파일 타임에 값이 결정됨
✅ const
변수는 런타임 값을 할당할 수 없음
✅ 객체의 내부 값도 변경 불가 (immutable object)
void main() {
const List<int> numbers = [1, 2, 3];
numbers.add(4); // 오류 발생 ❌ (const 객체는 내부 값 변경 불가)
}
const
객체는 완전히 불변이므로, 내부 요소도 변경할 수 없습니다.
3. final
vs const
비교
키워드 | 값 변경 가능 여부 | 할당 시점 | 내부 값 변경 |
---|---|---|---|
final | ❌ 한 번만 할당 가능 | 런타임 | ✅ 변경 가능 |
const | ❌ 한 번만 할당 가능 | 컴파일 타임 | ❌ 변경 불가 |
final
과 const
차이점 예제
void main() {
final now = DateTime.now(); // 실행 시점에 값 결정 (런타임 상수)
// const fixedTime = DateTime.now(); // 오류 발생 ❌ (컴파일 타임에 결정되지 않음)
const maxValue = 100; // 컴파일 타임에 값 결정
}
4. 언제 final
과 const
를 사용할까?
사용 상황 | 추천 키워드 |
---|---|
값이 한 번만 할당되어야 하지만, 실행 중 결정됨 | final |
컴파일 타임에 미리 결정될 수 있는 상수 | const |
리스트, 맵 같은 컬렉션을 불변으로 유지해야 할 때 | const |
예제
final
을 사용하는 경우 (런타임 값 필요)
void main() {
final userName = getUserName(); // 실행 중 값이 할당됨
}
const
를 사용하는 경우 (컴파일 타임 값 사용)
void main() {
const maxUsers = 50; // 컴파일 타임에 결정 가능
}
5. const
생성자 활용
Dart에서는 클래스를 선언할 때 const
생성자를 사용할 수 있습니다. 이렇게 하면 객체를 완전히 불변(immutable) 상태로 유지할 수 있습니다.
class Point {
final int x, y;
const Point(this.x, this.y);
}
void main() {
const p1 = Point(10, 20);
const p2 = Point(10, 20);
print(identical(p1, p2)); // true (동일한 객체를 참조함)
}
const
생성자를 사용하면 같은 값을 가진 객체는 메모리를 공유하므로 성능이 향상됩니다.
마무리
final
은 한 번 할당되면 변경할 수 없는 값을 저장하며, 런타임에 결정될 수 있습니다.const
는 컴파일 타임에 결정되는 상수로, 완전한 불변성을 갖습니다.const
를 사용하면 불필요한 객체 생성을 방지할 수 있으며, 메모리 사용을 최적화할 수 있습니다.
어렵네요.~