Flutter

Flutter Null Safety

딧츠이즈 2021. 4. 19. 21:37

Null Safety

Null Safety

Flutter 2.0부터 null safety를 지원합니다.

개발되는 코드가 null 안정성을 보장한 상태로 개발되게 하고자 하는 개념

?

Nullable과 Non-Nullable을 구분해서 사용할 수 있게 해준다.
기본적으로 변수를 선언할 때 Non-Nullable(null값 허용 X)로 선언되지만 처음 변수를 선언할 때 변수 타입 앞에 ?를 붙이면 Nullable(null값 허용)로 선언된다.

Kotlin을 보는 것 같은 느낌?

String str1 = 'Null 테스트';
String? str2  = 'Null 테스트';

str1 = null; // error 발생
str2 = null;


// 클래스의 경우도 똑같음
Class TestClass {}

TestClass test1 = null; // error 발생
TestClass? test2 = null;

//Non-Nullable 변수는 선언과 동시에 초기값을 주어야 한다.
int a; // error 발생 -> int a = 0;(error 발생 X)
int? b;

//Non-Nullable 변수에 Nullable값을 담는 건 불가능하지만
//Nullable 변수에 Non-Nullable값을 넣는 건 가능
int c = 100;
int? d = 100;

c = d; // error 발생
d = c;

var일 경우

var는 타입 유추이다. 변수에 넘는 값에 따라 타입이 결정되며 Nullable과 Non-Nullable도 자동 유추가 된다.
따라서 var타입 뒤에는 ?를 붙일 필요가 없다.

var a = 10; // int, Non-Nullable
var b = null; // Nullable
var c; // Nullable
var? d = 4; // error 발생

dynamic일 경우

dynamic은 값을 한정하지 않고 모든 타입의 데이터가 대입될 수 있다(Nullable도 포함).

따라서 dynamic타입일 경우 ?를 써도 되고 안 써도 된다.

// 모두 가능
dynamic a = 10;
dynamic b = null;
dynamic c;

a = null;
b = 10;
c = null;

!

변수 뒤에 붙이며 그 변수의 값이 null일 경우 runtime error(프로그램 실행 중 발생한 오류)를 발생

int? a = 10;
a!; // error X
a = null; // a값을 null로 변경
a!; // error 발생

late

Non-Nullable로 변수를 선언하려면 초기값을 주어야 하지만 late를 사용해서 늦게 값을 지정해줄 수 있다.

String str1; // error 발생
late String str2;

print(str2); // error 발생
str2 = 'Hello World';
print(str2); // Hello World 출력

기타

Null-aware operators

변수의 값이 null일 경우에만 변수에 값을 넣어준다.

int? a;
a ??= 3;
print(a); // 3 출력

// a의 값이 null이 아닌 3이기 때문에 값을 넣어주지 않음
a ??= 5;
print(a); // 3 출력

// ??를 이용하여 표현식의 값이 null일 경우 좌우에 표현식 중 왼쪽에 표현식을 반환하고
// 아닐 경우 오른쪽에 표현식을 반환 

int b?;
b = 1 ?? 3;
print(b); // 1 출력

// b의 값이 null이 아닌 1이기 때문에 오른쪽 표현식 반환
b = 10 ?? 11; 
print(b); // 11 출력

Conditional property access

null 일 수도 있는 객체의 속성 또는 메소드일 경우 점(.) 앞에 ?를 넣어준다.

myObject?.someProperty;
// 위에 코드는 아래와 같다.
//null이 아닌 경우는 그대로 실행 하지만 null일 경우 null을 반환
(myObject != null) ? myObject.someProperty : null;

 



참고 : https://kkangsnote.tistory.com/98
https://dart.dev/codelabs/dart-cheatsheet