[Dart] final과 const 변수 이해하기

ryan·2021년 9월 28일
2

Dart/Flutter

목록 보기
21/21
post-thumbnail

링크

기본적인 변수 선언

void main() {
  // 변수는 mutable한 속성을 가지고 있다
  int age;
  age = 20;
  age = 50;
}

final과 const 변수 선언

// - final 변수는 단, 한 번만 설정할 수 있다
// - const 변수는 컴파일 시간에 상수가 된다
// ------------------------------------------------
// - final, const 같은 변수를 modifier(제어자)라고 한다
// - 제어자라는 것은 클래스, 변수, 메서드를 정의할 때, 함께 쓰여서 이것들을 사용하기위한 옵션을 정해주는 역할을 한다. 가령, 접근 제어자라고 하면 클래스, 변수, 메서드에 접근을 제한하는 역할을 하는 것이다.
// - final, const의 가장 중요한 역할은 일단 변수값이 한 번 초기화되면 바꿀 수 없게 하는 것이다. immutable(불변의)
// ------------------------------------------------
// Final 변수 초기화 방법 2가지
// 1. 변수 선언 시, 초기화
// 2. 객체 생성 시, 외부 데이터를 받아서, 생성자를 통해서 초기화를 하는 방법

void main() {
  // #1
  final int myFinal = 30;
  const int myConst = 30;
   
  myFinal = 20; // error
  myConst = 50; // error
}

final

#2

class Person{
  int age;
  String name;
  
  // 생성자를 통해서 값이 초기화되면
  Person(this.age, this.name);
}

void main() {
  // #2
  Person p1 = new Person(21, 'Tom');
  // 이후에 final 변수는 절대로 변하지않는 immutable한 특징을 가지게 된다
  print(p1.age);
}

Final 변수는 초기화되는 시점이 앱이 실행될 때이다. 그래서 Final 변수를 run-time constant라고 부른다

Final 변수는 런타임 시에 한 번 초기화되면 그 후로는 절대로 변하지 않는다. 그렇다면, 사용자가 두 번째로 다른 값을 선택하면 어떻게 될까? Final 변수는 한 번 초기화 되면 immutable한 특성을 갖기 때문에 value 값을 바꾸려면 아예 새롭게 다시 rebuild해야한다.

final 사용 참고

final response = await http.get ...

response 변수는 컴파일 시에 변수 값이 초기화 되지 않고, 앱이 실행 된 후, 앱 상에서 데이터가 전송될 때까지 기다렸다가 그 후에 값이 저장이 된다. 그래서 이 response 변수는 컴파일 시가 아니라 앱이 실행되고 나서 초기화가 되기때문에 final 키워드를 사용해서 런타임 constant로 지정한 것이다

const 변수

  • compile-time constant는 컴파일 시에 상수가 됨
  • const 변수는 선언과 동시에 초기화
void main() {
  // 현재 시간 나타내는 DataTime 클래스를 사용하면 에러난다
  // 현재 시간은 매 번 호출될 때마다 그 값이 변경되기때문에 
  // 런타임 시에 지정이 되어야한다.
  // 그래서 컴파일 시에 상수 값이 되는 const 변수에는 이 값을 할당할 수 없다
  const time = DateTime.now(); // error
}
void main() {
  final time = DateTime.now();
}

const 변수를 사용하는 예

// 아래 질문과 답변들은 한 번 정해지면, 컴파일 이후에 변경이 될 필요가 없다
// 그래서 이런 경우 앞에 const 키워드를 붙여준다.
// 즉, 컴파일 시부터 상수화 되어서 런타임 시에도 반드시 그 값이 
// 유지되어야하면 변수는 const 변수를 사용하면 된다
const survey = [
  {
    '질문': '좋아하는 음식은',
    '답변': ['김치찌개', '불고기', '비빔국수'],
  },
  {
    '질문': '좋아하는 색상은?',
    '답변': ['파랑', '노랑', '보라'],
  },
  {
    '질문': '좋아하는 캐릭터는?',
    '답변': ['아이언맨', '배트맨', '스파이더맨'],
  },
];

// 원주율
const pi = 3.14; // 컴파일 시부터 상수화

정리

  1. const 변수는 컴파일 시에 상수화
  2. final 변수는 런타임 시에 상수화
  3. Compile-time constant = Run-time constant(const 변수로써 컴파일 시에 상수가 된다는 것은 런타임 시에도 value 값이 절대로 변하지않는 상수로써의 특징을 그대로 유지한다는 의미이다)
  4. final 변수는 StatelessWidget처럼 immutable하기때문에 그 값이 변경되어야한다면 build 메서드 내에서 rebuild 되어야한다
profile
👨🏻‍💻☕️ 🎹🎵 🐰🎶 🛫📷

0개의 댓글