Dart에서 final
과 const
는 불변 값을 생성하는 데 사용되지만, 둘 사이에는 몇 가지 중요한 차이점이 있습니다.
final
final
변수는 한 번 초기화되면 그 값을 변경할 수 없습니다.final
변수는 런타임 시점에 계산된 값을 가질 수 있습니다.final
변수는 고유한 인스턴스를 가집니다.const
const
변수도 한 번 초기화되면 그 값을 변경할 수 없습니다.const
변수는 컴파일 시점에 상수로 평가되어야 하며, 런타임에 계산된 값을 가질 수 없습니다.const
변수는 동일한 인스턴스를 공유합니다.void main() {
final finalVar = DateTime.now(); // 런타임에 평가되는 값
// const constVar = DateTime.now(); // 오류: 인스턴스 생성은 상수 값이어야 합니다.
const constList = [1, 2, 3]; // const 리스트
final finalList = [1, 2, 3]; // final 리스트
// constList[0] = 10; // 오류: 상수 값은 수정할 수 없습니다.
finalList[0] = 10; // 성공: final 리스트의 내용은 수정할 수 있습니다.
}
finalVar
는 런타임에 평가되므로 DateTime.now()
와 같은 현재 시간을 가져와서 할당할 수 있습니다. 반면, const
변수는 컴파일 시점에 평가되어야 하므로 이런 식의 할당은 불가능합니다.
constList
는 상수 리스트이므로, 그 내용을 변경할 수 없습니다. finalList
는 final 리스트이지만, 그 내용은 변경할 수 있습니다. 그러나 finalList
자체를 다른 리스트로 변경할 수는 없습니다.
이러한 차이점들로 인해 final
과 const
는 Dart에서 다른 상황에 사용됩니다. const
는 컴파일 시점 상수를 필요로 하는 곳에서 사용되며, final
은 런타임에 계산된 값을 한 번 할당하려 할 때 사용됩니다.
한편, Dart에서 const
와 final
키워드를 사용할 때 타입을 생략할 수 있습니다. Dart는 타입 추론 기능을 제공하기 때문에, 변수의 타입을 명시적으로 선언하지 않아도 컴파일러가 값을 기반으로 타입을 유추할 수 있습니다.
const
예시:const name = 'John Doe'; // String 타입으로 추론
const age = 30; // int 타입으로 추론
const height = 1.80; // double 타입으로 추론
위의 예제에서 name
, age
, height
변수는 각각 String
, int
, double
타입으로 추론됩니다. const
키워드를 사용하여 값을 상수로 만들었고, 타입을 명시적으로 선언하지 않았습니다.
final
예시:final name = 'Jane Doe'; // String 타입으로 추론
final age = 28; // int 타입으로 추론
final height = 1.65; // double 타입으로 추론
final
변수 역시 타입을 명시적으로 선언하지 않고 타입 추론을 사용하여 초기화할 수 있습니다. final
키워드를 사용하면 변수는 한 번만 값을 할당받을 수 있고, 이후에는 값을 변경할 수 없습니다.
타입을 생략하면 코드가 더 간결해지지만, 명확성이 떨어질 수 있으므로 상황에 따라 적절히 사용해야 합니다. 특히 코드의 의도를 명확하게 전달하거나, 특정 타입을 강제하고 싶을 때는 타입을 명시적으로 선언하는 것이 좋습니다.