변수는 값이 변경되어 의도치 않게 에러가 발생할 가능성이 있다.
그래서 가급적으로 값이 변하지 않도록 상수로 사용하는 것이 좋다.
선언할 때 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]
}