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는 컴파일 타임에 에러를 체크한다.