guricode

메모리 및 시점 비교 표 (Dart 기준)/final / const / static 비교 본문

앱/Flutter&Dart

메모리 및 시점 비교 표 (Dart 기준)/final / const / static 비교

agentrakugaki 2025. 9. 12. 19:10

구분 시점/영역 특징 예시

컴파일 시점 코드가 실행되기 전, 빌드 과정 const 값 확정. 상수 풀에 저장. 실행 전부터 값이 고정됨 const pi = 3.14;
런타임 시점 프로그램 실행 중 사용자 입력, 네트워크 응답, 시간 등 실행 중에만 결정 final now = DateTime.now();
스택(Stack) 메모리 실행 영역 함수 호출 시 지역 변수·매개변수 저장. 함수 종료 시 자동 해제 dart void f() { int x = 10; }
힙(Heap) 메모리 실행 영역 동적으로 생성된 객체 저장. 참조가 남아 있으면 유지. GC가 회수 var list = [1, 2, 3];var user = User(name: 'Kim');
Static 영역 메모리 실행 영역 static 변수, static const 값. 클래스 단위로 한 번만 초기화되고 프로그램 종료까지 유지 static const timeout = 3000;

final / const / static 비교 표 (Dart 기준)

구분 초기화 시점 소속 값 변경 가능 여부 메모리 영역/특징 대표 사용 예시

final 런타임 (실행 중 최초 한 번) 인스턴스 또는 지역 최초 1회만 대입, 이후 변경 불가 힙(객체), 스택(지역) 생성자 주입 값, API 응답 값 저장
const 컴파일 타임 (빌드 시점) 최상위, 지역, static const 변경 불가 (컴파일부터 고정) 상수 풀에 저장, 캐노니컬(동일 객체 공유) API 엔드포인트, 불변 토큰, const 위젯
static 최초 접근 시 런타임에 지연 초기화 클래스 단위 static final/static var 여부에 따라 다름 타입 소속, isolate 생존 동안 유지 유틸리티 함수, 전역 카운터, 캐시

 

  • final: 실행 도중 값이 정해지므로 사용자 입력, 현재 시간, 네트워크 값처럼 동적으로 결정되는 불변값에 적합
  • const: 빌드 시점에 값이 확정되어야 하므로 반드시 상수식만 가능. 성능상 이점(재사용, 캐노니컬) 있음
  • static: 인스턴스마다 달라질 필요 없는 값이나 기능을 타입 단위로 관리할 때 사용. static const를 함께 쓰면 타입 전역 상수가 됨

 

  • 불변인데 실행 중 정해져야 한다” → final
  • 아예 빌드 때부터 고정 상수다” → const
  • 클래스 전체에서 공유해야 한다” → static