[Flutter #7] Flutter에서 const vs final 정리

도경원's avatar
Sep 26, 2025
[Flutter #7] Flutter에서 const vs final 정리
Flutter를 배우다 보면 constfinal을 헷갈리기 쉽습니다.
둘 다 값을 변경할 수 없다는 공통점이 있지만, 빌드 과정과 메모리 사용에서 차이가 큽니다.

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

Gyeongwon's blog