객체가 Null인 상태에서 발생할 수 있는 에러를 runtime이 아닌 edit-time에 발생시키겠다는 의미로, 컴파일러가 NPE(Null Pointer Execption)이 발생할 수 있는 가능성을 미리 체크해 NPE가 발생할 수 없는 코드를 작성하도록 한다.
Null Safety의 기본은 Nullable과 Non-Nullable의 구분!
?
를 추가하여 작성한다.int a1=10; //Non-Nullable
int? a2=10; //Nullable
testFun() {
a1=null;//error
a2=null;
}
int a1;//error
int? a2;
var
Dart에서 var은 타입유추이므로 대입되는 값에 의해 타입이 결정된다. Nullable과 Non-Nullable도 자동 유추가 가능함 즉 var 타입에는 ?추가가 불가능하다.
dynamic
dynamic 타입은 모든 타입의 데이터가 대입될 수 있다는 의미로 Nullable도 마찬가지이다. dynamic타입에서 ?가 추가되는 것은 의미가 없다.
Nullable이 Non-Nullable로 선언된 변수에 대입이 가능한지 그 반대는 가능한지에 대한 문제는 타입적으로 Nullable 변수는 Non-Nullable 변수의 상위 타입이다. 즉 int? 타입이 int 타입의 상위 타입이 되므로 명시적 캐스팅을 해줘야 한다.
Dart 에서 명시적 캐스팅 연산자는 as 이다
int a1=10;
int? a2=10;
main() {
a1=a2;//error
a2=a1;//ok
}
int a1=10;
int? a2=20;
main() {
a1=a2 as int;//ok
print("a1: $a1, a2: $a2");//a1: 20, a2: 20
}
?
는 null을 사용해도 된다는 의미라면, !
는 이것이 절대 null이 아니라고 전달하는 명령이다.태마 선언과 사용
theme: ThemeData(
textTheme: const TextTheme(
displayLarge: TextStyle(
color: Color(0xFF232B55),
),
),
),
heme.of(context).textTheme.displayLarge.color, //error
heme.of(context).textTheme.displayLarge!.color,
displayLarge는 nullable이고 null인경우 Color를 사용할 수 없다는 오류가 나온다 >
사용시 displayLarge는 null값이면 안되므로 dart에게 null값이 아닌 것을 전달해야 오류가 발생하지 않는다.