Flutter
Dart - Null Safety
봄석
2021. 5. 31. 03:50
Dart - Null Safety
Dart 언어는 이제 Null Safety를 지원한다.
Null Safety를 적용하면 코드의 유형은 기본적으로 nullable이 아니다.
Null Safety를 적용하면 null에 의한 Exception을 런타임이 아닌 컴파일 타임에 체크하게 된다.
Nullable과 Non-Nullable의 구분
기본적으로 선언하는 변수는 Nullable이 아니며, Nullable로 선언할 경우?를 붙인다.
int a1=10;
int? a2=10;
Non-Nullable 변수 선언과 동시에 초기화 필요
Non-Nullable 변수는 선언과 동시에 초기화가 필요하다.
초기화하지 않으면 컴파일 에러가 발생한다.
int a1; // compile error
int? a2;
var 타입에서의 Null Safety(자동 유추)
var은 자동으로 타입을 유추한다.
var? 은 허용되지 않는다.
var a1=10; // non-nullable로 자동 유추
var a2=null; // nullable로 자동 유추
var a3; // 자동 null대입, dynamic타입으로 유추
var? a4=null; // compile error
Local Variable에서만 Non-Nullable 변수 선언과 동시에 초기화 않음
Non-Nullable인 로컬 변수는 선언과 동시에 초기화하지 않아도 된다.
int a1; // compile error
class User {
int a1; // compile error
}
testFun() {
int a1;
a1=null; // compile error
}
testFun() {
int a1;
print(a1+10); // compile error
}
testFun() {
int a1;
a1=10;
print(a1+10); //ok
}
Nullable, Non-Nullable 변수 간의 캐스팅
Nullable 변수는 Non-Nullable 변수의 상위 타입이다
Non-Nullable 변수가 Nullable에 대입되는 것은 스마트 캐스팅에 의해 자동으로 형 변형됨
Nullable 변수가 Non-Nullable에 대입되는 것은 에러이며 하고자 한다면 명시적 캐스팅이 필요
int a1=10;
int? a2=10;
main() {
a1=a2; // compile error
a2=a1; //ok
a1=a2 as int; //ok
}
Null Safety Operation 추가
변수 뒤에! 을 붙일 시 Non-nullable로 취급한다.
int? a2=20;
main() {
a2!; // ok
a2=null; // ok 이전 ! operator 무시하고 null 삽입가능
a2!; // exceptoin(Null check operator used on a null value)
}
late 키워드 추가
late 키워드를 사용하면 Non-Nullable 변수를 바로 초기화하지 않아도 된다.
int a1; // compile error
late int a2; // ok
@required를 required로 변경
NullSafety이전의 @required는 런타임에 에러를 체크하는 문제가 있다.
NullSafety의 required는 컴파일 타임에 에러를 체크한다.