변수는 값이 변경되어 의도치 않게 에러가 발생할 가능성이 있다.
그래서 가급적으로 값이 변하지 않도록 상수로 사용하는 것이 좋다.
선언할 때 final, const 키워드를 제일 앞에 붙이면 값이 수정되지 않는 상수로 사용이 가능하다.
final String name = '태종';
const String name2 = '세종;'
name = '이방원'; // 에러
name2 = '이도'; // 에러
final name3 = '세종'; // 타입을 생략하여 작성 가능
var대신 final로 변수를 만들게 되면 이 변수는 수정할 수 없게 된다. (딱 한 번만 설정할 수 있음)void main() {
final f = [1, 2, 3];
final g = [4, 5, 6];
// Error: Can't assign to the final variable 'f'.
// f = g;
}
위와 같이 새로운 final 상수 f에 새로운 컬렉션을 대입하는 것은 불가능하다.void main() {
final f = [1, 2, 3];
f.add(5); // 원소를 추가할 수 있다.
print(f); // [1, 2, 3, 5]
}
f 변수가 바라보는 컬렉션의 주소는 변경이 되지 않았다. 하지만 대상이 되는 컬렉션의 원소는 추가 되었다.const를 사용할 수 있는 부분에서 사용하면 성능상의 이점을 가져갈 수 있음const는 compile-time constant를 만들어준다.const는 컴파일할 때 알고 있는 값을 사용해야 한다.const가 아닌 final이나 var가 되어야 한다.const와 final의 가장 큰 차이점은 컴파일이 되는 시점에 그 값을 알 수 있는지 없는지의 차이다.const 상수는 컴파일 시점에 그 값이 확정적이어서 한 번 대입하면 그 값을 변경할 수 없다.const는 값의 성질을 바꾼다.const [1, 2, 3]과 같이 컬렉션 타입의 값에 const 속성을 주거나 const Point(2, 3)과 같이 인스턴스에 const 속성을 주면 해당 객체는 전체 상태 값이 모두 컴파일 시점에 결정되어 불변(immutable) 속성이 된다.const 상수는 deeply, transitively, recursively 불변속성이다.final 변수를 선언해도 그 안에 컬렉션의 값은 변경할 수 있다.const 값을 만들어야 한다.final 상수와 달리 const 상수로는 아래 예제에서 c.add(5); 같은 코드를 실행할 수가 없다.void main() {
const c = [1, 2, 3];
// 잡히지 않은 에러: 지원되지 않는 연산: add
// Uncaught Error: Unsupported operation: add
// c.add(5);
print(c); // [1, 2, 3]
}