본문 바로가기
Dart & Flutter

Dart의 상수: const와 final의 차이점 (컴파일 타임, 런타임)

by Devinus 2024. 1. 25.

dart
dart

1. 개요

Dart에서 상수는 final 또는 const 키워드를 사용하여 선언될 수 있습니다.

const와 final은 모두 값을 할당한 후 변경할 수 없는 변수를 나타냅니다.

그러나 두 키워드 간에는 중요한 차이가 있습니다.

 

2. 컴파일 타임 상수와 런타임 상수

  • const는 컴파일 타임 상수로, 컴파일 시에 값이 정해져야 합니다. 따라서 리터럴 값만 const로 선언할 수 있습니다.
리터럴 값은 코드에서 직접 표현된 고정된 값을 나타냅니다. 이 값은 프로그램 실행 중에 변경되지 않고 고정된 상태를 유지합니다. 간단하게 말하면, 코드에서 그대로 사용되는 값이 리터럴 값입니다.
  • final은 런타임 상수로, 런타임에 값이 결정될 수 있습니다. 따라서 런타임에 결정되는 값을 final로 선언할 수 있습니다.
더 쉽게 예시를 들자면, 함수 호출로 추후에 값이 할당되는 경우를 말합니다.
추후에 값이 할당된다 하더라도 상수는 상수이기때문에 값이 할당된 이후엔 값을 변경할 수 없습니다.
const int compileTimeConst = 42; // 컴파일 타임 상수
final int runtimeConst = DateTime.now().second; // 런타임 상수

 

컴파일 타임과 런타임이란?

컴파일 타임(Compile Time)과 런타임(Runtime)은 프로그램의 실행 생명주기에서 중요한 단계를 나타내는 용어입니다.

컴파일 타임(Compile Time):컴파일 타임은 소스 코드가 기계어로 번역되는 시간을 의미합니다. 이 단계에서는 코드를 작성한 프로그래머가 작성한 언어(예: Dart)로 작성된 코드가 컴파일러에 의해 기계어로 변환됩니다.에러 검사, 최적화, 언어에서 기계어로의 변환 등이 이루어지는 시간입니다.실행 파일이 생성되고, 이후에는 이 실행 파일을 사용하여 프로그램을 실행할 수 있습니다.

런타임(Runtime):런타임은 프로그램이 실행되고 있을 때의 시간을 나타냅니다. 즉, 프로그램이 실제로 동작하고 데이터를 처리하는 단계입니다.프로그램이 사용자에 의해 실행되면서 동적으로 메모리를 할당하고, 함수를 호출하며, 데이터를 조작하는 등의 작업이 이루어집니다.런타임 환경에서는 프로그램이 실행 중인 동안 발생하는 여러 가지 상황을 다룹니다.

간단히 말하면, 컴파일 타임은 코드가 컴파일되는 시간이며, 런타임은 프로그램이 실행되고 작동하는 시간입니다.

 

3. 활용 목적

지금 까지 final과 const를 나누는 기준에 대해 설명 했을 때, 왜 굳이 나눠야 하나 의문을 가질 수도 있습니다.

 

final은 컴파일타임이거나 런타임이거나 모두 포용할 수 있으니 final만 사용하면 되는거 아니야?

 

 

하지만 다 이유가 있습니다. 그 이유는 다음과 같습니다.

 

  • const는 컴파일 타임 상수이므로 성능 최적화 및 메모리 절약에 기여할 수 있습니다. 주로 리터럴 값이나 다른 const 변수를 할당할 때 사용됩니다.
  • final은 런타임 상수로, 런타임에 결정되는 값이 필요한 경우에 사용됩니다.

 

final은 컴파일타임 또는 런타임을 모두 포용할 수 있으나, const는 컴파일 타임 상수로 성능 최적화 및 메모리 절약에 기여할 수 있습니다. 따라서 가능한 컴파일 타임 상수는 const로 선언하여 성능 최적화를 진행하는 것이 권장됩니다.