Dart 언어 오답노트 : 8. final vs const

샤워실의 바보·2023년 10월 24일
0
post-thumbnail

Dart에서 finalconst는 불변 값을 생성하는 데 사용되지만, 둘 사이에는 몇 가지 중요한 차이점이 있습니다.

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 자체를 다른 리스트로 변경할 수는 없습니다.

이러한 차이점들로 인해 finalconst는 Dart에서 다른 상황에 사용됩니다. const는 컴파일 시점 상수를 필요로 하는 곳에서 사용되며, final은 런타임에 계산된 값을 한 번 할당하려 할 때 사용됩니다.

한편, Dart에서 constfinal 키워드를 사용할 때 타입을 생략할 수 있습니다. 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 키워드를 사용하면 변수는 한 번만 값을 할당받을 수 있고, 이후에는 값을 변경할 수 없습니다.

타입을 생략하면 코드가 더 간결해지지만, 명확성이 떨어질 수 있으므로 상황에 따라 적절히 사용해야 합니다. 특히 코드의 의도를 명확하게 전달하거나, 특정 타입을 강제하고 싶을 때는 타입을 명시적으로 선언하는 것이 좋습니다.

profile
공부하는 개발자

0개의 댓글