본문 바로가기

# 02/Flutter

[Flutter] final & const

반응형

final & const 공통점


한 번 설정한 값을 변경할 수 없다. 다른 값으로 변경하려고 시도하면 컴파일 오류가 발생한다.





final & const 차이점


const의 경우, 컴파일 타임에서 상수를 정의할 수 있다. 


즉, const로 정의한 상수는 런타임에서 정의되는 값을 설정할 수 없다는 의미다.


예를 들어, DateTime.now()의 경우 런타임에서 호출 될 때마다 결과 값이 다른데 이러한 값은 const로 설정할 수 없다. 결국 const로 설정 하는 값은 대부분 리터럴이 될 것이다.


반면, final은 런타임에서 결정되는 값도 설정할 수 있다.




그렇다고 모든 인스턴스화 과정에서 const 를 사용할 수 없는 것은 아니다. 



const Color(int value)


Color 클래스의 생성자는 const로 선언되어 있으며, 이러한 생성자를 사용하여 선언하는 변수에는 const를 사용할 수 있다.

const color = Color(0xFF42A5F5);    // 가능


반면, 앞에서 살펴본 DateTime.now() 의 경우, 생성자를 살펴보면 const로 선언되어 있지 않기 때문에 이를 인스턴스화 할 때에는 const를 사용할 수 없다.


final List<String> languages = [];
const List<String> companies = [];
languages.add('dart');
/*
// compile error
companies.add('Google');
languages = ['Java'];
*/


languages 는 final 로 선언되어 있음에도 불구하고 배열에 값을 추가 할 수 있지만, const 로 선언된 companies 배열에는 값을 추가할 수 없다. 

대신 두 배열 모두 새로운 배열로 변경하는 것은 불가능하다. 결국 final 로 선언된 변수는 해당 변수에 새로운 값이 설정되는 것은 불가능하지만, 객체나 배열에 값을 추가하는 행위에 대해서는 관여하지 않는다는 것을 확인 할 수 있다.



변수에 선언한 값을 변경하지 못하게 하면 예기치 않은 상황에서 값이 변경되어 발생하는 문제들을 손쉽게 해결할 수 있다.

특히 멀티 스레딩을 지원하는 경우에는 접근하는 변수의 값이 불변함을 보장 할 수 있기 때문에 별도의 예외 처리 없이 간결하면서도 동작을 확신하는 코드를 작성할 수 있다. 





그런데 왜 const 를 써야 되지?


둘 다 불변의 상수를 의미하지만 const가 더욱 불변의 강도가 강하다. 


const는 app의 lifecycle에서 절대 변치 않음을 의미하기 때문에 색상, 글자 크기 등이 고정일 때 그 변수의 앞에 const를 붙여주어야 flutter 의 build method가 그 부분을 rebuild 하지 않게 되어 app의 속도가 빨라진다. 


final 도 기본 적으로 고정 상수이기는 하지만, 상황에 따라 변할 수 있는, 즉, 주로 constructor에서 설정되어야 하는 변수 등의 앞에 주로 선언해 주어야 한다. 


final은 widget이 생성되는 시점마다는 변경될 수 있지만 한 번 생성된 위젯 내에서의 const 상수는 변경할 수 없음을 의미한다. 


Stateless Widget이 그 대표적인 예이며, 이 위젯은 자체적으로 상태를 가지지 않기 때문에 다른 속성을 가지는 StatelessWidget 으로 바꾸려면 constructor에 새로운 property 값을 전달하면서 새로운 위젯을 만들어야 한다. 

이때 사용되는 것이 const variable이다. StatelessWidget의 모든 property는 const variable 이다.







출처 - https://medium.com/dartlang-korea/dart-final-%EA%B3%BC-const-bc8c6c024ef4

출처 - https://codinghub.tistory.com/199

반응형