Dart의 final vs const

final과 const 키워드는 많은 프로그래밍 언어에서 사용된다.
Dart에서는 두 키워드 모두 사용되는데, 각각의 사용처가 조금 다르다.

final

final로 선언된 변수는 딱 한번 initialize 된 후 그 값이 변하지 않는다.
즉, run time constant라고 볼 수 있다.
코드의 첫 실행 혹은 객체의 첫 생성시에 값이 결정되고, 만약 새로 객체가 생성된다면 그 때에는 다른 값이 들어올 수 있다.

그렇다면 언제 사용 될 수 있는가?
주된 사용처는 constructor로 주입받는 class의 변수를 생각해 볼 수 있다.

class Person {
  final String name;
  Prerson(this.name);
}

위 클래스처럼 변하지 않는 값을 받을 때 사용할 수 있다.

const

const로 선언된 상수는 compile time에 값이 정해지고 절대 변하지 않는다.
말 그대로 constant(상수)이다.
compile time에 값이 정해지므로 위의 예제처럼 실행될 때 값을 알 수 있는 곳에서는 사용하지 못한다.

그렇다면 언제 사용 될 수 있는가?
상수 값을 하드 코딩으로 박아놓을 때 사용 할 수 있다.

class Person {
  void walk() {
    const speed = 3;
  }
}

하지만 class에서 instace field에 const 키워드를 사용하려 하면 static field에만 사용 할 수 있다는 메시지가 뜬다.
class 내부에 static이 아닌 불변하는 변수를 두려면 단순한 값은 final로, List 같은 값은 final과 const의 조합으로 가능하다.

class Person {
  // const kind = 'animal'; Error
  final kind = 'animal';
  final availableAction = const ['walk', 'talk', 'eat'];
}

마치며

최대한 immutable하게 만드는게 아무래도 버그 가능성을 줄여주겠지?
열심히 사용하자..

좋은 웹페이지 즐겨찾기