공부 기록/Flutter

Flutter: constant, final

naraewool 2021. 12. 3. 00:23
728x90

코딩쉐프 님의 조금 매운맛 강좌 6 정리:

변수는 mutable하다. 

https://dart.dev/guides/language/language-tour#final-and-const

Final and const

If you never intend to change a variable, use final or const, either instead of var or in addition to a type. A final variable can be set only once; a const variable is a compile-time constant. (Const variables are implicitly final.)

> final 변수는 오직 한번만 설정할 수있다. const 변수는 컴파일 시간에 상수가 된다. 

final, const와 같은 키워드를 modifier라고 함. 

접근제어자

final, const 변수의 값을 변경하면 에러 발생 -> 선언한 후 변경할 수 없음 -> immutable.

그럼 이 final, const의 차이는 무엇일까?

final
초기화하는 방법
1) 변수 선언시 초기화(위의 이미지)
2) 객체 선언시 외부데이터를 받아 생성자를 통해 초기화 (아래 이미지): Person 클래스 안에서 age, name 변수를 선언하고, Person(this.age, this.name);이라는 생성자를 만듬. 메인함수에서 p1이라는 객체를 생성하면서 생성자를 통해 age라는 final 변수에 21을 할당해서 초기화 

어떻게 초기화하든지간에 final 변수는 immutable 하기에 다른 값으로 변경될 수 없다. 단, 초기화되는 시점이 앱이 실행되는 순간이다. 따라서 final 변수를 run-time constant라고 부름. (예:

한번 초기화되면 변할 수 없기 떄문에 value값을 변경하려면 새롭게 리빌드해야함.

( 변경되는 요소를 build method로 리빌드하는 stateless widget처럼)

아래 예제는 await 키워드로 인하여 앱이 실행된 후 해당 웹의 데이터가 전송될 때까지 기다렸다가 값이 저장되므로, response의 변수는 컴파일 시가 아닌 앱이 실행될 때 초기화되도록 'final' 키워드를 붙여 run time constant로 지정해준 것이다. 

 

 

const

: 컴파일 시에 상수가 됨.  (compile-time constant)

대표 예제: 현재 시간을 알려주는 DateTime.now 를 사용할 때. -> 이 메소드에 const를 선언하면 에러가 발생. 현재시간은 호출될 때마다 값이 변경되야하므로 런타임 시 지정이 되어야함. -> final로 변경 필요

 

컴파일 시 할당된 변수가 런타임시에도 변하지 않고 사용될 때 키워드 const 변수 사용하기 (예: const pi = 3.14;) -> 프로그램 어디에서 사용되더라도 값이 변경되지 않아야 하므로 컴파일 시부터 상수화하는 것임  

 

정리:

3. 컴파일 시 생성된 변수는 런타임 시에도 변하지 않고 유지된다는 의미. 

 

 


또다른 설명 (출처: https://www.youtube.com/watch?v=AJ6jXAjCU9E) 

코드를 작성해서 compile하면 해당 코드가 기계가 이해할 수 있는 기계어로 변환됨(compile time이라고 함). 이 때. 디바이에서 실행할 수 있는 패키지가 형성됨.  -> const는 이 때 생성됨. const는 global variable로 존재함. Collection, List안에 있는 안에 존재하는 값들도 const

디바이스에 설치하고 실행되는 시간을 runtime이라고 함. -> final는 이 때 생성됨. Collection, List안에 있는 안에 존재하는 값들은 변경 가능함. 

API를 통해 값을 가져와 사용하는 경우에는 final 사용하기!