void main() {
// 변수는 mutable한 속성을 가지고 있다
int age;
age = 20;
age = 50;
}
// - final 변수는 단, 한 번만 설정할 수 있다
// - const 변수는 컴파일 시간에 상수가 된다
// ------------------------------------------------
// - final, const 같은 변수를 modifier(제어자)라고 한다
// - 제어자라는 것은 클래스, 변수, 메서드를 정의할 때, 함께 쓰여서 이것들을 사용하기위한 옵션을 정해주는 역할을 한다. 가령, 접근 제어자라고 하면 클래스, 변수, 메서드에 접근을 제한하는 역할을 하는 것이다.
// - final, const의 가장 중요한 역할은 일단 변수값이 한 번 초기화되면 바꿀 수 없게 하는 것이다. immutable(불변의)
// ------------------------------------------------
// Final 변수 초기화 방법 2가지
// 1. 변수 선언 시, 초기화
// 2. 객체 생성 시, 외부 데이터를 받아서, 생성자를 통해서 초기화를 하는 방법
void main() {
// #1
final int myFinal = 30;
const int myConst = 30;
myFinal = 20; // error
myConst = 50; // error
}
class Person{
int age;
String name;
// 생성자를 통해서 값이 초기화되면
Person(this.age, this.name);
}
void main() {
// #2
Person p1 = new Person(21, 'Tom');
// 이후에 final 변수는 절대로 변하지않는 immutable한 특징을 가지게 된다
print(p1.age);
}
Final 변수는 초기화되는 시점이 앱이 실행될 때이다. 그래서 Final 변수를 run-time constant라고 부른다
Final 변수는 런타임 시에 한 번 초기화되면 그 후로는 절대로 변하지 않는다. 그렇다면, 사용자가 두 번째로 다른 값을 선택하면 어떻게 될까? Final 변수는 한 번 초기화 되면 immutable한 특성을 갖기 때문에 value 값을 바꾸려면 아예 새롭게 다시 rebuild해야한다.
final response = await http.get ...
response 변수는 컴파일 시에 변수 값이 초기화 되지 않고, 앱이 실행 된 후, 앱 상에서 데이터가 전송될 때까지 기다렸다가 그 후에 값이 저장이 된다. 그래서 이 response 변수는 컴파일 시가 아니라 앱이 실행되고 나서 초기화가 되기때문에 final 키워드를 사용해서 런타임 constant로 지정한 것이다
void main() {
// 현재 시간 나타내는 DataTime 클래스를 사용하면 에러난다
// 현재 시간은 매 번 호출될 때마다 그 값이 변경되기때문에
// 런타임 시에 지정이 되어야한다.
// 그래서 컴파일 시에 상수 값이 되는 const 변수에는 이 값을 할당할 수 없다
const time = DateTime.now(); // error
}
void main() {
final time = DateTime.now();
}
// 아래 질문과 답변들은 한 번 정해지면, 컴파일 이후에 변경이 될 필요가 없다
// 그래서 이런 경우 앞에 const 키워드를 붙여준다.
// 즉, 컴파일 시부터 상수화 되어서 런타임 시에도 반드시 그 값이
// 유지되어야하면 변수는 const 변수를 사용하면 된다
const survey = [
{
'질문': '좋아하는 음식은',
'답변': ['김치찌개', '불고기', '비빔국수'],
},
{
'질문': '좋아하는 색상은?',
'답변': ['파랑', '노랑', '보라'],
},
{
'질문': '좋아하는 캐릭터는?',
'답변': ['아이언맨', '배트맨', '스파이더맨'],
},
];
// 원주율
const pi = 3.14; // 컴파일 시부터 상수화