This is unimportant

Flutter Null Safety 본문

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

'Flutter' 카테고리의 다른 글

Flutter http 통신(JSON)  (0) 2021.06.02
Flutter Future, async, await 심화  (0) 2021.04.17
Flutter Future, async, await  (0) 2021.04.16
Flutter 길이가 넘는 글자 변경  (0) 2021.04.04
Flutter Splash screen  (0) 2021.03.31
Comments