Dart에서 const와 final 키워드의 차이

Dart에서는 변경할 수 없는 값, 즉 상수를 선언할 때 constfinal 키워드를 사용할 수 있습니다. 이 두 키워드는 비슷해 보이지만, 사용 목적과 동작 방식에서 차이가 있습니다. 이번 글에서는 constfinal의 차이를 비교하며 언제 어떤 키워드를 사용해야 하는지 살펴보겠습니다.
기본적으로 최초의 값이 한번 할당되면 다시 할당할 수 없다는 논리가 적용됩니다.

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❌ 한 번만 할당 가능컴파일 타임❌ 변경 불가

finalconst 차이점 예제

void main() {
  final now = DateTime.now(); // 실행 시점에 값 결정 (런타임 상수)
  // const fixedTime = DateTime.now(); // 오류 발생 ❌ (컴파일 타임에 결정되지 않음)

  const maxValue = 100; // 컴파일 타임에 값 결정
}

4. 언제 finalconst를 사용할까?

사용 상황추천 키워드
값이 한 번만 할당되어야 하지만, 실행 중 결정됨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를 사용하면 불필요한 객체 생성을 방지할 수 있으며, 메모리 사용을 최적화할 수 있습니다.

어렵네요.~

답글 남기기

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