상수 변수는 초깃값을 대입한 후에 값을 바꿀 수 없습니다. 즉, 처음에 대입한 값으로만 사용할 수 있습니다. 여기까지는 다른 언어의 상수 변수와 큰 차이가 없습니다. 그런데 다트에서는 상수가 되는 시점에 따라 컴파일 타임과 런 타임 상수 변수로 구분됩니다.
컴파일 타임 상수 변수 - const
컴파일 타임 상수 변수는 const 예약어로 선언합니다. const 변수는 톱 레벨이나 함수 내에 지역 변수로 선언할 수 있지만, 클래스에 선언할 때는 static 변수로만 선언할 수 있습니다. const 변수는 컴파일 단계에서 상수가 되므로 변수를 선언할 때 초깃값을 대입해야 하며 이 후에 그 값을 바꿀 수 없습니다. 다음 코드는 const 변수를 선언할 때 초깃값을 대입하지 않아서 오류가 발생합니다.
const String data1; // 오류
Class User {
static const String data2; // 오류
void some() {
const String data3; // 오류
}
}
다음 코드는 const로 변수를 선언하면서 초깃값을 대입해 오류가 발생하지 않지만, 초깃값을 바꿀 수 없는 상수 변수에 다시 값을 대입한 부분에서 오류가 발생합니다.
const String daga1 = 'hello';
class User {
static const String data2 = 'hello';
void some() {
const String data3 = 'hello';
data1 = 'world'; // 오류
data2 = 'world'; // 오류
data3 = 'world'; // 오류
}
}
런 타임 상수 변수 - final
final 예약어로 선언하는 런 타임 상수 변수는 톱 레벨뿐만 아니라 클래스나 함수 내부에도 선언할 수 있습니다. final로 선언한 변수도 상수이므로 const와 마찬가지로 값을 바꿀 수 없지만, 초깃값을 대입하는 시점이 꼭 선언문이 아닐 수도 있습니다.
다음 코드를 보면 클래스에서 no2 변수를 final로 선언했습니다. 그런데 변수 선언과 동시에 초깃값을 대입하지 않았으며 객체를 생성할 때 생성장에서 값을 대입하도록 했습니다. 이렇게 해도 오류가 발생하지 않습니다. 또한 no3 변수는 함수에서 final로 선언했는데 변수 선언과 동시에 초깃값을 주지 않고 그 이후에 값을 대입했습니다.
final int no1; // 초깃값이나 이후에 값을 대입하지 않아서 오류
class MyClass {
final int no2;
MyClass(this.no2);
void some() {
final no3;
no3 = 10;
no3 = 20; // 값을 바꿀 수 없어서 오류
}
}
결국 final로 선언한 변수도 상수이므로 초깃값을 대입한 후에는 값을 바꿀 수 없지만, 먼저 선언해 놓고 객체를 생성할 때나 함수에서 값을 참조하기 전에 초깃값을 대입할 수 있습니다. 즉, 앱이 실행될 때 값이 결정되므로 런 타임 상수 변수입니다.
상수 변수와 문자열 템플릿
문자열 템플릿에 상수 변수를 사용할 때 주의할 점이 있습니다. const 예약어로 선언한 String 타입 상수 변수에 문자열 템플릿으로 값을 대입할 때는 템플릿 내부에도 컴파일 타입 상수를 사용해야 합니다.
다음코드를 보면 s5는 const 예약어로 선언한 문자열 변수입니다. 이 변수에 s2를 문자열 템플릿으로 대입했는데 s2도 const로 선언한 컴파일 타임 상수 변수이므로 문제가 없습니다. 하지만 s6은 const로 선언했는데 문자열 템플릿에 const로 선언하지 않은 s1과 s3을 사용해서 오류가 발생합니다.
main() {
String s1 = 'hello';
const String s2 = 'world';
final String s3 = 'helloworld';
String s4 = '$s1, $s2';
const String s5 = '$s2';
const String s6 = '$s1, $s2, $s3'; // 오류
final String s7 = '$s1, $s2, $s3';
}
'Flutter' 카테고리의 다른 글
컬렉션 타입 - List, Set, Map (0) | 2024.11.11 |
---|---|
var와 dynamic 타입 (0) | 2024.11.11 |
데이터 타입 (0) | 2024.11.11 |
다트 언어란? (1) | 2024.11.11 |
플러터 프로젝트 분석하기 (0) | 2024.11.11 |