널 안정성이란 널 포인트 Exception에 대하여 프로그램을 실행하기 전 코드를 작성하는 시점에 점검하는 것을 말한다.
널 허용(Nullable)과 널 부허(Nonull)은 ?를 통하여 선언한다
int a1 = 10;
int? a2 = 10; // null 허용 변수
test(){
a1 = null; // 오류
a2 = null;
}
String s1 = null; //오류
String? s2 = null;
다트에서 모든 변수는 객체라 초기값을 너어주지 않으면 자동으로 널로 초기화 된다. 다만, 함수에서 지역 변수를 NonNull로 선언할 떄는 초기화 하지 않아도 된다.
int a1; //오류
int? a2;
test(){
int a1;
a1 = null // 오류
}
var 타입은 대입하는 값에 따라 타입이 결정됩니다. 그래서 var 뒤에는 ?를 붙일 수 없다.
var a1 = 10; // int로 결정
var a2 = null; // 널로 초기화 했으므로 dynamic 타입
var a3; // 초깃값을 너어주지 않았기 떄문에 dynamic 타입
var? a4 = null; //오류
dynamic 타입의 ?를 추가할 수 있지만 의미가 없다. dynamic 타입은 모든 타입의 데이터를 대입할 수 있으므로 null도 허용한다.
dynamic a1 = 10;
dynamic a2;
dynamic a3;
NonNull변수에서 Nullable변수로 형변환은 가능 하지만 반대는 불가능하다.즉 Nullable이 NonNull의 상위 타입이다.
late를 사용하면 초기화를 미룰 수 있다. 이렇게하면 변수를 null로 쓰다가 앱이 실행될 되서야 값을 결정할 수 있다.
int a1; //오류
late int a2;
main(){
print("($a2 +10)"); // 오류 a2가 null이기 때문
a2 = 10;
print("($a2 +10)");
}
어떤 변수가 널인지 점검할 때는 !연산자를 사용한다. 변수 뒤에 !를 붙이면, 그 변수가 null일 경우 오류가 발생한다.
널 허용 객체나 리스트의 멤버에 접근할 때는 ?이나 ?[]연산자를 사용한다. ?연산자를 사용하면 객체가 널이 아닐 때만 멤버에 접근하며, 널이면 멤버에 접근할 수 없고 null을 반환한다.
String? str = "hello";
test(){
str.isEmpty; //오류
}
//str 변수를 널 허용으로 선언했는데,
//str의 멤버인 isEmpty에 접근할때
//?을 쓰지 않아 오류 발생
main(){
int? no = 10;
bool? result1 = no?.isEven;
print("result 1 : $result1"); // true
no = null;
bool? result1 = no?.isEven;
print("result 1 : $result1"); //null
}
main(){
List<int>? list = [10,20,30];
print('list[0]: $(list?[0])'); // 10
list = null;
print('list[0]: $(list?[0])'); // null
널 허용 변수에 널이 아닌 값을 넣고 싶다면 ??= 연산자를 사용한다. ??= 연산자는 오른쪽 값이 널이 아닐때만 대입하고 널일 경우에는 대입하지 않는다.
main(){
int? dat3;
data3 ??= 10;
print("$data3"); // 10
data3 ??= null;
print("$data3"); // 10
}
널 허용 변수가 널일 떄 대체할 값을 지정하고 싶을 경우 ?? 연산자를 사용한다.
main(){
String? str1 = "str1";
String? str2 = str1 ?? "str2";
print("$str2"); // str1
str1 = null;
str2 = str1 ?? "str2";
print("$str2"); // str2
}
'2023년 부터 > Flutter' 카테고리의 다른 글
Dart - 믹스인(mixin) (0) | 2023.10.19 |
---|---|
Dart - 클래스와 객체 (0) | 2023.10.19 |
Dart - 함수와 제어문 (2) | 2023.10.19 |
Dart - 데이터 타입 (0) | 2023.10.19 |
Dart 언어란? (0) | 2023.10.19 |