쉽게 정리하면 다음과 같다
코드 실행의 결과로 인해 결정되는 상수는 final
코드 실행 이전부터 결정되어야 하는 상수는 const => DateTime.now()와 같이 실행의 결과로 나오는 값 사용 불가
구분하기 어려우면 그냥 final을 쓴다고 생각하자.
immutable하다는 것은 바뀌면 안된다는 것이다. 따라서 뭔가 바꾸려면 기존에 있던 값을 아예 날리고 새로 만들어서 대체해야 한다는 것이다.
이를 플러터에 적용해보자면 stateless 위젯은 immutable이다. stateful 위젯은 mutable이다. 따라서 satateless 위젯에 사용하는 변수가 있다면 해당 값은 한 번 지정되면 바뀌지 않아야 한다. 이 경우 해당 변수의 타입에 final을 붙여줘야 한다.
즉, stless 위젯은 state가 없는 위젯이기 때문에 (대개 final 키워드가 붙은) 상수만 존재할 수 있다.
붙여주지 않으면 다음과 같은 경고 문구가 뜬다.
This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: ResuableCard.
class ResuableCard extends StatelessWidget {
// constructor
ResuableCard({@required this.colour});
// final은 이 값이 한 번 설정된 후에는 바뀌지 않음을 의미
// 코드 실행 다음에 결정되므로 const가 아닌 final 변수로
final Color colour;
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.all(10.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.0),
color: colour,
// color: Color(0xff1d1e33),
),
);
}
}
그런데 final 외에도 const를 사용하는 것을 종종 볼 수 있다. 둘의 사용도 비슷하기 때문에 더 헷갈린다.
void main() {
const int myConst = 3;
final int myFinal = 6;
// 둘 다 오류. const, final 변수에는 재할당이 불가능하기 때문
myNum1 = 7;
myFinal = 3;
}
공식 문서에서는 다음과 같이 차이를 구별한다.
A final variable can be set only once; a const variable is a compile-time constant. (Const variables are implicitly final.) A final top-level or class variable is initialized the first time it’s used.
(https://dart.dev/guides/language/language-tour#final-and-const)
const는 final을 이미 내포하고 있는데 (const가 final을 이미 가지고 있다는 것) const가 final과 비교되는 것은 const가 compile-time constants라는 것이다. 이 말인 즉,
다트 코드 작성 -> 컴퓨터가 이해할 수 있는 언어로 컴파일(const 고정) -> 컴퓨터 처리로 코드가 실행(final 고정)
의 과정에서 const 변수는 컴파일될 당시에 값이 고정된다는 것입니다.
따라서 다음 코드에서 const로 값을 할당하면 오류를 냅니다.
int one() {
return 1;
}
void main() {
const myConst = one();
final myFinal = one();
// 오류!(컴파일 실패) one()이 실행된 후에 1을 반환하기 때문
// 반면 const는 실행 이전인 compile 단계에서 값이 정해지기 때문에 오류.
print(myConst);
// 정상 출력
print(myFinal);
}
DateTime.now()와 같은 함수를 통해 현재 시간을 출력하는 것도 코드를 실행한 후에 결정이 나는 것이니 const 타입에 할당하면 컴파일이 되지 않습니다.
그렇다면 const는 언제 써야 할까요? 함수의 실행 결과로 나오는 값을 이용하는 것이 아닌 단순한 값을 주고 사용할 때 사용하면 됩니다.
import 'package:flutter/material.dart';
const double bottomContainerHeight = 75.0;
const bottomContainerColor = Color(0xffFF2A4E);
... 중략
Container(
color: bottomContainerColor,
margin: EdgeInsets.fromLTRB(0, 10, 0, 0),
width: double.infinity,
height: bottomContainerHeight,
)
'📱 Mobile > 📱 (old) Flutter v 1.0' 카테고리의 다른 글
빠른 코딩을 위한 상수 전용 페이지 구성과 .copywith 메서드 (0) | 2020.05.20 |
---|---|
커스텀 위젯 만들기 (0) | 2020.05.19 |
Theme, ThemeData 살펴보기 + Hex 값으로 Color 사용하기 (0) | 2020.05.18 |
캡슐화를 위한 변수 private화 (은닉화) (0) | 2020.05.18 |
내장 assets 오디오 파일 재생하기 (0) | 2020.05.17 |