프로그래밍 언어에는 컴파일(Compile) 언어와 인터프리터(Interpreter) 언어가 있다. 컴파일 언어는 전체 소스코드를 한 번에 번역하여 컴퓨터에게 전달하고, Python과 같은 인터프리터 언어는 각 라인을 실행하며 순차적으로 명령 줄들을 실행한다.
이 두 가지 타입의 언어 중 Dart는 컴파일 언어에 해당하며, 일반적으로 Dart는 Flutter를 이용해 모바일 앱을 구현할 때 주로 사용되고 있다. 컴파일 언어는 한 번에 번역하여 컴퓨터에게 명령을 전달하는 특성이 있고, 이에 따라 명령어를 실행하는 타이밍을 컴파일 타임(Compile Time)과 런타임(Run Time)으로 나눌 수 있다.
즉, 특정한 라인의 명령은 각각의 할당되어야 하는 실행 시간에 명령이 수행된다. 간략하게 말하면 컴파일 타임은 말 그대로 코드를 빌드하여 컴파일하는 시점에 할당되는 명령이 될 것이고, 런타임은 소스코드 실행 중 수행하게 되는 명령 실행 시간으로 볼 수 있다.
여기서 const와 final은 이 명령어 실행 타이밍과 관련이 있다. 우선 아래와 같이 선언했다고 가정한다.
const String userID = "Alien";
final String password = "password1234";
공통적으로 const와 final를 키워드로 붙여 변수를 할당하게 되면 이후 해당 변수에 대한 변경을 허용하지 않는 '상수'가 된다. 다만 const는 컴파일 시점에 변수를 상수로 만들어 컴파일 시점에 값이 할당되고 고정되는 반면 final은 런타임 시점에 코드가 실행되는 과정 중에 상수값이 할당된다.
물론 컴파일 시점부터 상수값으로 처리되게 되면 프로그램이 런타임 시점에 처리할 일을 줄여주게 되어 조금의 성능 향상을 기대할 수 있지만 현대의 하드웨어 성능은 상위단 어플리케이션의 변수 몇 개의 처리 성능 향상을 요구할 만큼 드라마틱한 역할은 수행하지 않는다.
하지만 아래와 같은 상황이 있다면 이 두가지 키워드로 인해 시스템의 프로세스가 의도와 달리 흘러갈 수 있다.
const DateTime cTime = DateTime.now();
final DateTime rTime = DateTime.now();
만약 원전에 들어갈 소프트웨어의 특정 프로세스의 실행 주기를 위와 같이 수행한다면 아주 치명적인 결과를 초래할 수 있다. 물론 많은 Flutter IDE들이 우리가 개발할 때 어떤 지점에 const 또는 final을 선언해야 하는지 잘 가르쳐준다.
다시 정리하자면 const는 컴파일 타임(Const => Compile)에 변수를 상수로 고정하여 할당하고, final은 런타임에 변수를 상수로 고정해 할당한다.
참고 자료
https://couldi.tistory.com/m/33