Flutter 개발자가 가장 많이 헷갈리는 키워드 중 하나가 바로 final과 const가 아닐까요?
두 키워드는 '값을 바꿀 수 없다'는 공통점 때문에 비슷해 보이지만, 실제로는 동작 시점과 불변성의 범위가 완전히 다르답니다.
두 키워드의 차이를 명확하게 이해할 수 있도록 정리해보겠습니다.
✔ 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 객체는 내부도 변경 불가
📌 결론
final과 const는 단순히 '고정된 값'을 표현하기 위한 키워드가 아니에요.
둘의 값 결정 시점, 불변성 범위, 용도를 이해하면 Flutter/Dart 코드를 훨씬 더 안정적으로 설계할 수 있을 겁니다.
