DART

[DART] 상수와 final / const 키워드에 대하여 - Final and const

예나부기 2022. 4. 11.

참고 : 아래의 설명은 타 개발 언어(C, Java 등)를 이미 숙지한 상태라고 가정 후 설명하는 것이다.

필자는 Java에 익숙하므로, 대부분의 설명이 Java와 비교하여 이루어 질 것이다.

모든 설명은 https://dart.dev/guides/language/language-tour 를 참고하며 개인적인 해석을 덧붙인 것이다.

틀린 부분이나 부족한 부분의 보충이 필요할 시 언제든 댓글을 달아주시길!!

 

1) 상수 Constant

상수란, '한 번 정의한 후에는 값이 고정되여 변경할 수 없는 메모리 공간'이라고 정의한다.

예를 들어, 일주일은 7일이고, 1년은 365일이라는 것은 변함이 없다. 

이런 경우 상수로 선언해 주게 되면, 유지보수가 쉬워지며, 성능 향상의 효과도 있다.

 

Dart에서는 변수에 const 혹은 final을 붙여 변수를 상수로 만들 수 있다.

final name = 'Bob'; // 1.데이터 타입을 명시하지 않고 쓰는 경우
final String nickname = 'Bobby'; // 2.데이터 타입이 명시된 경우

상수로 선언된 변수 name, nickname의 값은 이제 변경할 수 없다.

만약, 변경하려고 한다면 에러가 나게된다.

name = 'Alice'; // Error: a final variable can only be set once.

 

2) final과 const

프로그래밍을 통해 작성된 코드가 컴퓨터가 이해할 수 있는 형태로 번역되는 과정을 '컴파일'이라고 하는데,

Dart역시 이러한 컴파일 과정을 거친다.

갑자기 왜 컴파일에 대한 이야기가 나오는지 궁금한가?

바로 상수를 만드는 키워드인 final과 const의 차이점을 알기 위해서이다.

 

const는 컴퓨터 언어로 번역되는 컴파일 과정에서 상수가 된다. (compile-time constant)

         >> 런타임 시점에 결정되는 값은 const에 담을 수 없다.

반명, final은 번역 후 실제로 프로그램이 실제 실행되는 과정에서 상수가 된다. (runtime constant)

 

코드가 실행되는 시간을 가져오는 함수를 final과 const에 각각 담아보자.

const DateTime rightNow = DateTime.now(); //1. const사용
final DateTime rightNow = DateTime.now(); //2. final사용

1번과 2번 중, 어떤 코드에서 에러가 날까? 10초간 생각해보자.

 

 

정답은, const에서 에러가 난다. 이유가 무엇일까?

현재 시간을 가져오는 DateTime.now(); 는 런타임 시점에서 결정되기 때문이다.

 

final과 const를 선언할 때 위의 차이점을 적절히 활용하여, 클린 코드를 작성할 수 있길 바란다.

 

댓글