Dart에서 final과 const

Flutter 개발자가 가장 많이 헷갈리는 키워드 중 하나가 바로 finalconst가 아닐까요?

두 키워드는 '값을 바꿀 수 없다'는 공통점 때문에 비슷해 보이지만, 실제로는 동작 시점과 불변성의 범위가 완전히 다르답니다.

두 키워드의 차이를 명확하게 이해할 수 있도록 정리해보겠습니다.

final 키워드란?

Dart에서 final은 변수에 값을 한 번만 할당할 수 있음을 의미합니다.

👉 핵심 특징

  • 재대입이 불가능(assignment 1회만 가능)
  • 런타임에서 값이 결정될 수 있어요.
  • 참조 불변이지만, 내부 데이터는 변할 수 있어요.

✔ 예제: 재대입 불가

final name = 'John';
name = 'Mike'; // ❌ Error: final 변수는 재할당할 수 없어요.

✔ 내부 값은 수정 가능

final list = [1, 2, 3];
list.add(4); // ⭕ 가능 (내부 요소 변경)
list = [5, 6]; // ❌ 재대입 불가

즉, final은 '변수 자체'만 고정합니다.
가리키는 객체의 내용까지 불변으로 만들지는 않는다는 점, 헷갈릴 수도 있어요.

const 키워드란?

const는 컴파일 타임 상수를 의미합니다.

👉 핵심 특징

  • 컴파일 시점에 값이 반드시 결정되어야 합니다.
  • 재대입 불가
  • 내부 값도 절대 변경 불가 (완전한 immutable)

✔ 예제: const는 내부 변경도 불가

const numbers = [1, 2, 3];
numbers.add(4); // ❌ Error: const 리스트의 내부까지 불변

🔥 final vs const 핵심 요약

키워드값 결정 시점재대입내부 값 변경대표 사용 예
final런타임❌ 불가⭕ 가능API 응답, DateTime.now()
const컴파일 타임❌ 불가❌ 불가상수값, const 위젯

💡 왜 Flutter는 final을 많이 사용할까?

Flutter 위젯은 기본적으로 immutable하게 설계되어 있어요.
위젯 필드는 값이 다시 바뀌지 않으므로 자연스럽게 final이 적합해요.

class MyWidget extends StatelessWidget {
  final String title; // 일반적인 위젯 패턴

  const MyWidget({super.key, required this.title});
}

여기서 title은 런타임에 전달되지만 이후 바뀌지 않기 때문에 final이 정확한 선택.

🧠 정리

  • final → 런타임에서 한 번만 할당
  • const → 컴파일 타임 완전한 상수
  • final 객체는 내부 변경 가능, const 객체는 내부도 변경 불가

📌 결론

finalconst는 단순히 '고정된 값'을 표현하기 위한 키워드가 아니에요.
둘의 값 결정 시점, 불변성 범위, 용도를 이해하면 Flutter/Dart 코드를 훨씬 더 안정적으로 설계할 수 있을 겁니다.

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗