본문 바로가기
Flutter/Dart 입문

[Dart] 12. final vs. const

by Couldi 2021. 11. 6.
반응형

21. 11. 5.

- Could -

 

이 글은 프로그래밍 입문을 Flutter 때문에 Dart로 시작하는 사람들을 위한 글입니다.
프로그래밍 언어가 가지고 있는 기본 컨셉 자체를 Dart라는 언어를 통해 설명하고,
많은 분들이 Flutter를 위해 학습한다고 생각해, 추후 Flutter 학습에 도움이 되는 방향으로 작성되었습니다.
1. 컴파일 언어 vs. 스크립트 언어
2. Final vs. const

 

1. 컴파일 언어 vs. 인터프리터 언어

final과 const에 대해 알기 위해서는 Dart의 언어적 특징 중 하나인 '컴파일 언어' 라는 것에 대해서 알아야한다.

앞서 Dart공부를 시작할때 프로그래밍 언어를 컴퓨터가 이해하기 쉬운 수준의 언어는 저급언어, 사람이 이해하기 쉬운 수준의 언어는 고급언어라고 분류했었다. Dart는 비교적 고급언어에 속하는 언어로, 사람이 이해하기 쉬운 수준의 언어이다. 

 

문제는 여기 있다. 사람이 이해하기 쉬운 언어라는 얘기는 반대로 말하면, 컴퓨터가 이해하기 어려운 언어라는 이야기이다. 그래서 나오는 개념이 '컴파일러'와 '인터프리터'이다. '컴파일러'와 '인터프리터'는 사람이 작성한 코드를 컴퓨터가 바로 알아먹을수 있도록 번역을 해주는 프로그램이다. 둘다 번역해준다는 점은 동일하지만 번역 방식에 차이가 있고, 각 언어별로 컴파일러를 사용하는 언어인지, 인터프리터를 사용하는 언어인지에 따라 코드가 동작하고 작성되는 방식에 있어 차이를 보이게 된다.

 

먼저 컴파일러는 전체 코드를 한번에 번역해서 컴퓨터에게 전달해준다. 반면 인터프리터 언어의 경우 코드를 한 줄씩 번역해서 전달하는 과정을 반복한다. 각 방법마다 장점과 단점이 존재하고, 이 성질에 따라 프로그램의 실행속도나 방법, 코드 작성 방법등에서 작은 차이를 보이게 된다. 이 차이가 궁금하다면 구글링을 통해 자세히 알아보기 바란다.

 

우리가 공부하는 Dart는 컴파일 언어이고, 코드를 작성해 실행시키면, 전체 코드를 컴파일하여 컴퓨터에게 전달한다. 덕분에 인터프리터 언어보다 실행 속도면에서 빠르다는 이점을 가진다.

 

주절주절 설명했지만, 결론적으로 우리가 알아야 할것은 하나다. Dart는 컴파일 언어이다.

 

2. final vs. const

앞서 컴파일 언어 대해 설명한 이유는 컴파일 시점과 런타임 시점의 구분 때문이다. 컴파일 시점은 컴퓨터의 용어로 번역하는 시점, 런타임 시점은 실제 컴퓨터가 프로그램을 실행하는 시점이다.

 

final String firstName = 'James';
const String lastName = 'Potter';

final과 const는 변수 선언시 앞에 붙는 키워드로 값이 할당 되고 난 후, 변경을 허용하지 않는 '상수'로 만들겠다는 키워드이다. 둘다 상수로 만드는건 똑같은데 뭐하러 이런 구분을 해야할까. 이 둘의 차이는 컴파일 시점에 상수가 되는지, 런타임 시점에 상수가 되는지에 있다.

 

const의 경우는 컴파일 시점에 상수가 되어버린다. 이 말은 컴파일 시점에 값이 할당되고 고정된다는 의미고, 정말 미세한 차이이겠지만 컴파일 시점부터 상수값으로 처리되어 프로그램이 런타임시점에 처리할 일을 줄여준다. 그 말은 즉, 프로그램의 성능이 조금더 나은 퍼포먼스를 보이게 해준다는 이점이 있다.

 

final은 런타임 시점에 코드가 실행되는 과정 중에 상수값이 할당된다.

 

뭐야.. 그러면 구분할 필요가 없는거 아냐?

 

아니다. 구분해야한다.

왜 final과 const를 구분해야하는가?

고작 언제 상수가 되는지 시점의 차이고, 차이라고 해봤자 아주 미세한 속도의 차이라고 한다면 이 둘을 구분할 필요는 없어보인다. 하지만 코드를 작성하다보면 런타임시점의 값을 상수로 받아야 하는 경우도 생긴다. 예를들어 우리가 변수에 코드가 실행된 시간을 담고 싶다고 하자.

 

const DateTime rightNow = DateTime.now();

final DateTime rightNow = DateTime.now();

 

위의 const와 final은 어떤 차이를 보이게 될까? DartPad로 실행을 해보면 아마, const로 선언한 경우에는 에러가 날것이다. DateTime.now()는 코드가 실행되는 시점의 시간을 가져오는 명령어이기 때문이다. 코드가 실행된 시점의 시간을 가져와서 변수에 할당해야하는데, 앞서 설명했듯 const는 컴파일 시점에 값이 할당 되어야 한다. 즉, 시간을 받아와 상수값으로 사용하고 싶어도 const를 이용해서는 할 수가 없다. 이럴때는 const가 아닌 final을 이용해서 상수로 다뤄야한다.

 

위의 DateTime.now()는 그저 한가지 사례일 뿐이다. 코드를 작성하다보면 특정 함수가 실행될때 변수를 생성하고 값을 할당해야하는 경우도 있다. 즉, 프로그램이 실행되고 있는 시점에 함수가 실행되고, 당시의 상태값이 변수에 할당되어 상수 역할을 해야하는 상황이 존재한다. 

 

복잡하게 설명했지만, 정리하자면 다음과 같다.

  • 변수를 상수로 만들어야한다면 final과 const 키워드를 사용한다.
  • final은 런타임 시점, const는 컴파일 시점에 할당된다.
  • 이 둘을 명확하게 이해하고 구분해 사용할 수 있다면 좋다.
  • 만약 구분이 어렵다면, 상수를 써야하는 대부분의 경우에는 final을 이용하자.
    그리고 const는 절대로, 죽어도 값이 안 변할 것 같은 곳에만 써주자.

 

반응형

'Flutter > Dart 입문' 카테고리의 다른 글

[Dart] 14. 형변환 - Casting  (0) 2021.11.12
[Dart] 13. 예외처리 - try, catch 구문  (0) 2021.11.12
[Dart] 11. Null Safety  (0) 2021.11.04
[Dart] 10-2. 클래스(class)  (4) 2021.10.27
[Dart] 10-1. 클래스(class)  (3) 2021.10.22

댓글