Flutter 공부 이전에 그 언어인 Dart를 공부하며 기록한 포스트입니다.
변수 선언
Dart에서 일반적인 변수를 선언 및 정의하는 방법은 크게 두 방법이 있습니다. Compiler가 타입을 유추해 주는 var
, 그리고 C/C++와 같이 타입을 지정해주는 방식이 있습니다. 전자의 경우 Python의 방식, 혹은 C++의 auto
syntax와 같다고 보면 될 것 같네요. 추가로 아래 예제에서 볼 수 있듯이 두 방법 모두 mutable variable을 선언합니다. 즉, 이후에 타입만 일치한다면 값의 변경이 가능합니다.
Dart convention에서는 일반적인 local variable의 경우 var
을 통한 선언을, class 멤버 변수나 property의 경우 명시적으로 선언을 해주길 권장하고 있습니다.
void main() {
var name = 'YoungJ';
String blog = 'Thread Through';
name = 'youngj';
blog = 'thread through';
name = 12; // Error. cannot assign int to string
}
동적 변수 선언
var로 선언한 변수의 초기화를 해주지 않는다면 해당 변수의 타입은 어떻게 결정될까요? Dart에서는 dynamic variable을 선언할 수 있습니다. 동적 변수는 타입이 변할 수 있는 변수인데요. 아래 예제에서 볼 수 있듯이 초기화 없는 var syntax로 묵시적으로 선언하거나 dynamic syntax를 통해 명시적으로 선언할 수 있습니다.
void main() {
var name;
name = 12;
name = 'YoungJ';
dynamic blog;
blog = 'Searching Fundamental';
blog = 21;
}
Null Safety
Dart에서는 null safety를 보장하고 있습니다. C++/Java 등 다른 프로그래밍 언어들에서 함수나 메서드의 인자가 null이어서 런타임 에러가 난 경험이 다들 있으리라 생각합니다. Dart는 null 사용이 가능한 경우를 제한해 프로그래머의 의도적인 설계가 아닌 이상 방지하고 있습니다. ?
syntax를 통해 null safety를 보장하고 있으며, 변수 선언에 오게 될 경우 null이 될 수도 있다고 컴파일러에게 알리는 것이며, 이후 사용에서 쓰이게 된다면 null이 아닌 경우에만 해당 구문을 수행하라는 의미가 됩니다.
void main() {
String name = null; // Error. type Null cannot be assigned to type String
String? name, blog;
name = null;
blog = 'Searching Fundamental';
print(name.isEmpty); // Error. name can be type Null
if (name != null) {
print(name.isEmpty); // name cannot be null
}
print(name?.isEmpty); // null
print(blog?.isEmpty); // false
}
불변 변수 선언 (1)
Dart에서 변수는 기본적으로 mutable입니다. 그러나 프로그래머의 실수나 기타 다른 이유로 변경되어서는 안 될 변수들의 경우 immutable 속성 부여가 필요한데요. C++에서는 const
syntax를 사용해 해당 기능을 사용합니다. Dart에서는 final
syntax를 사용해 이를 수행하는데요. 특이한 점은 final
을 사용할 경우 변수 선언을 위한 var
syntax가 필요 없습니다. 다만 명시적으로 타입을 지정하는 것은 허용됩니다.
void main() {
final name = 'YoungJ';
final String blog = 'Searching Fundamental';
name = 'youngj'; // Error. the final variable 'name' can only be set once
}
불변 변수 선언 (2)
Dart에서는 두 가지 방법의 immutable variable 선언을 지원합니다. 첫 번째는 앞서 다룬 final
syntax이며, 두 번째는 const
syntax입니다. 앞서 final을 다룰 때 C++에서의 const
syntax와 같은 기능이라고 했었습니다. 그런데 진짜 const
syntax가 등장한 지금, 조금 당황스럽네요? 둘의 차이는 초기화가 언제 되어야 하는가로 결정됩니다. final
로 선언된 변수의 경우 런타임에 API를 통해 받은 정보를 통한 초기화를 허용합니다. 반면에 const
는 compile-time constant이기 때문에 이를 허용하지 않습니다. 즉, 컴파일러가 초기화 값을 모르는 경우 에러를 발생시킵니다.
void main() {
final name = InitializeWithFetchedData(); // Possible
const name = InitializeWithFetchedData(); // Impossible
final name = 'YoungJ'; // Possible
const name = 'YoungJ'; // Possible
}