본문 바로가기
2023년 부터/Flutter

Dart - 널 안정성

by JeongUPark 2023. 10. 19.
반응형

널 안정성이란 널 포인트 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