Flutter를 배우다 보면
const
와 final
을 헷갈리기 쉽습니다.둘 다 값을 변경할 수 없다는 공통점이 있지만, 빌드 과정과 메모리 사용에서 차이가 큽니다.
1. 공통점
- 둘 다 재할당 불가 (immutable reference)
- 한 번 초기화되면 다시 값 변경 불가
- 변수 선언 시 “이 값은 바뀌지 않는다”는 의도를 나타냄
2. 차이점
✅ final
- 런타임에 값 확정 (프로그램 실행 중 처음 할당될 때 결정)
- 새로운 객체를 매번 생성 가능 → 위젯 리빌드 시 객체 재생성
- 성능 최적화 효과 없음
예시:
final now = DateTime.now(); // 실행 시점에 값이 정해짐
✅ const
- 컴파일 타임에 값 확정 (코드 작성 시 이미 결정 가능)
- 같은
const
객체는 메모리에 한 번만 생성 → 캐싱 & 재사용
- 위젯 빌드 과정에서 불필요한 객체 생성을 방지 → 성능 최적화
예시:
const pi = 3.14; // 이미 컴파일 시점에 확정 가능
3. 위젯 빌드 과정에서의 차이
❌ final
만 사용한 경우
class MyPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text("Hello", style: TextStyle(color: Colors.black)),
// final 객체처럼 매번 새로 생성됨
);
}
}
build()
가 호출될 때마다TextStyle
객체가 새로 생성됨
- 위젯 트리 비교 시 "다른 객체"로 인식 → 불필요한 리빌드 발생 가능
✅ const
를 사용한 경우
class MyPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return const Center(
child: Text("Hello", style: TextStyle(color: Colors.black)),
// const 객체는 캐싱되어 재사용됨
);
}
}
const
덕분에TextStyle
은 컴파일 타임에 고정
- 위젯 트리 비교 시 동일 객체로 인식 → 불필요한 리빌드 방지
- 메모리, 성능 모두 이득
4. 사용 가이드라인
- 항상 const 먼저 고려하기
- 빌드 시점에 값이 바뀌지 않는다면
const
사용 - 예: 색상, 아이콘, 텍스트 스타일, static 위젯
- 런타임에만 알 수 있는 값이면 final
- 예:
DateTime.now()
, API 호출 결과, 사용자 입력 값
5. 한눈에 보는 비교표
구분 | const | final |
값 확정 시점 | 컴파일 타임 | 런타임 |
객체 생성 | 한 번 생성 후 캐싱, 재사용 | 호출 시마다 새 객체 생성 가능 |
빌드 최적화 | ✅ 불필요한 위젯 리빌드 방지 | ❌ 없음 |
사용 예시 | 색상, 아이콘, 텍스트 스타일 | API 데이터, 실행 중 계산 값 |
6. 결론
- Flutter 위젯 트리에서 성능 최적화를 원한다면
const
를 적극 활용하자
- 값이 런타임에만 정해지는 경우는 어쩔 수 없이
final
.
- 일반적인 UI 코드에서는
const
를 습관적으로 붙여두는 게 베스트 프랙티스입니다.
Share article