저번에는 null safety 에 대해 알아보았다. 이번에는 final, late, const 키워드를 사용하여 변수를 생성하는 방법과 해당 키워드가 가진 기능에 대해 알아보도록 하자.
Final
먼저 final 에 대해 알아보자. 해당 키워드는 변수를 생성하고 최초로 준 값 이후에는 값을 수정할 수 없도록 하는 기능이 있다. 그렇기 때문에 변수의 값을 바꿀 수 없게 고정하고 싶다면 사용하면 된다.
void main() {
final name = '돗개진';
name = 'las'; // Error : The final variable '돗개진' can only be set once.
}
위 코드를 확인해 보면 name 이라는 변수를 final 키워드를 사용해 생성한 뒤 해당 변수에 다른 값을 넣으려고 시도하지만 에러가 뜨게 된다. 왜냐하면 final 변수는 단 한 번만 값을 넣을 수 있기 때문이다.
+ final String name = '돗개진'; 과 같이 변수의 타입을 지정해 줘도 되지만 그냥 final name 이라고 생성해도 된다. 어차피 컴파일러가 알아서 타입을 추론해 줄 것이기 때문이다...
++ final 뒤엔 var 가 올 수 없다. var 변수는 선언할 때 초기값을 기준으로 타입이 추론되며 '값이 변경 가능' 하기 때문이다.
Late
late 키워드는 초기 데이터 없이 변수를 선언할 수 있게 해준다. 해당 기능은 flutter 로 data fetching 을 할 때 상당히 유용하니 알아두도록 하자.
void main() {
late final String key;
print(key);
// Error : The late local variable 'key' is definitely unassigned at this point.
}
위 코드에서는 key 라는 변수를 late 키워드를 사용해 생성하고 print 함수를 사용하여 key 의 값을 출력하려고 한다. 하지만 이는 에러 때문에 실행할 수 없는데, 그 이유는 데이터가 빈 상태이기 때문이다. 변수가 값 없이 사용될 때 해당 오류가 발생한다는 것을 확인할 수 있다.
void main() {
late final String key;
key = 'Dart';
print(key);
}
그렇기 때문에 위처럼 늦은 시점에 key 값을 할당해 준 뒤 print 로 값을 출력하도록 하면 오류 없이 실행되는 것을 확인할 수 있다. late 키워드는 초기 변수를 생성할 때 값 없이 생성할 수 있지만, 해당 변수를 사용하려면 늦은 시점에 꼭 변수의 값을 할당해 줘야 한다.
해당 키워드는 api 요청으로 받은 데이터를 late 변수에 담아 사용하는 방식으로 진행할 수 있다. 사용할 값이지만 그 값에 대한 요청을 초기값에 지정해 줄 수 없을 때 활용하면 된다.
Constant
const 키워드로 compile-time constant(상수) 를 만들 수 있다. 컴파일 할 때 알고 있는 값에 사용해야 하며 이는 앱스토어에 앱을 올리기 전부터 가지고 있는 값이라고 생각하면 이해가 편하다. 예를 들어 api key 처럼 앱스토어에 앱을 올리기 전부터 compile-time 때 알아야 하는 상수가 있을 경우 사용하면 된다.
void main() {
const api_key = '12121212112';
}
위처럼 앱을 설치한 사용자가 앱을 실행하는 동안 생성되는 것이 아닌 컴파일 시점에서 필요한 상수가 있을 때 const 키워드를 사용하여 변수를 생성해 주면 된다. (위 코드 예제는 api_key 의 값이 하드코딩 된 모습이지만 실제로는 보안 처리를 해야 한다. api key로 api 요청을 남용할 수 있기 때문이다.)
이번 포스트에선 final, late, const 키워드의 기능과 사용 방법에 대해 알아보았다. 마무리로 헷갈릴 수 있는 const 와 final 의 차이점에 대해 알아보도록 하자.
const & final 의 차이점
이 두 가지 키워드는 모두 해당 키워드로 생성하여 값을 준 변수는 초기값 외 값을 변경할 수 없다는 공통점이 있기 때문에 역할에 대해 모호할 수 있지만 가장 큰 차이점이 존재한다.
final 은 런타임 중에서도 생성될 수 있다는 것이다. 사용자가 앱을 실행하면서 변수를 만들 수 있다는 뜻으로 예를 들어 final String username; 과 같이 사용되는 경우를 말한다. 반면에 cosnt 는 런타임 중에 생성되는 것이 아닌 컴파일 시점에 반드시 값이 정해져 있어야 한다.
헷갈릴 수도 있는 부분이기 때문에 해당 키워드를 사용할 때 주의할 필요가 있다!
'Dart' 카테고리의 다른 글
(Dart) QQ Operator 와 Typedef (0) | 2024.10.16 |
---|---|
(Dart) Named Parameters (0) | 2024.10.16 |
(Dart) Dart의 특징에 대해 알아보자 (0) | 2024.10.07 |
(Dart) null safety 와 nullable 변수 (0) | 2024.10.06 |
(Dart) var, dynamic 키워드 (0) | 2024.10.06 |