메뉴 닫기

Flutter null Safety 및 null 다루기

Flutter 2.0부터 null safety(null 안정성)가 적용되었습니다.

null safety는 null로 인해 의도하지 않은/예상치 않은 동작을 대비하는 것에 목적이 있습니다. 이를 위해, 데이터 타입(int, double, string 등…)은 null 값을 허용하거나(Nullable type) 또는 허용하지 않는 식(Non-nullable type)으로 나누어 졌습니다.

DartPad에서 Flutter 및 Dart 코드를 실행할 수 있습니다.

https://dartpad.dev/


1) Nullable types VS Non-nullable types 

null safety가 지원된 이후부터, 아래 Dart 코드를 실행하게 되면 오류가 납니다.



기본적으로 모든 타입은 null을 허용하지 않습니다.

null safety 이후, 기본적으로 모든 데이터 타입은 null을 허용하지 않는, Non-nullable type입니다. 그렇다면 null 값을 보유할 수 있는 Nullable type으로 선언하려면 어떻게 해야 할까요? 데이터 타입 뒤에 ? 를 사용하면 됩니다.



타입 뒤에 ?를 붙이면 null 값이 대입됩니다.

제네릭 타입도 마찬가지 입니다.



Non-nullable type이어서 오류가 발생함

위 코드는 Correction 및 Generic type이 Non-nullable type으로 선언되었습니다. 3번째 줄은 List 초기화가 되지 않았고,  4번째 줄은 List 항목 값에 null 값이 포함되어 있어서 오류가 발생하였습니다.



오류 해결

문제가 되는 코드를 nullable type으로 바꾸어 오류를 해결하였습니다.


2) null check 하기

Nullable type의 변수를 선언하게 되면 필연적으로 null check를 해야 하는데요, 3가지 방법을 소개하려 합니다.

  1. if else 문 사용
  2. 삼항연산자 사용
  3. ?? 연산자 사용: 변수가 null이면, ?? 뒤의 값으로 대체됩니다.



3) null assertion 연산자: !

nullable type의 변수를 선언하고 이 변수에 절대로 null이 대입되지 않는다고 100% 확신할 수 있는 경우, null assertion 연산자(!)를 사용할 수 있습니다. 사용법은 변수 바로 뒤에 ! 를 붙이면 됩니다.

당연히 null이 대입되면 오류가 납니다. null이 대입될 가능성이 아주 조금이라도 있다면 사용하지 않는 것이 좋습니다.



Non-Nullable type에 null값을 가진 Nullable type을 대입



null값을 가진 Nullable type에 !를 붙여 Non-nullable type에 대입



Non-Nullable type에 정상 값을 가진 Nullable type을 대입


4) required 키워드

Non-nullable 타입의 매개변수가 포함된 함수를 선언하려면 어떻게 해야 할까요? 함수를 호출하는 쪽에서 매개변수를 입력하지 않으면 null 값이 들어가게 되므로, 컴파일러는 아예 에러를 내 버립니다. 이를 해결하기 위해서는 두 가지 방법이 있습니다.

  1. 매개변수의 초기값을 설정해 줍니다.
  2. required 키워드 붙여서, 함수를 호출할 때 입력을 강제할 수 있습니다.

아래 예시에서 addThreeValues 함수를 호출할 때, 반드시 first, second, third 값이 입력되어야 합니다.



아래 예시는 클래스 변수 초기화를 위한 선택적 매개변수에 대한 것입니다. String name 변수는 non-nullable type 이므로 required 키워드를 사용하거나 기본값을 설정해주면 됩니다.




5) late 키워드

변수를 당장 초기화하고 싶지는 않은데, 그렇다고 nullable type으로 선언하고 싶지도 않을 경우 late 키워드를 사용하면 유용합니다.

단, 값이 할당되기 전에 해당 변수를 읽으면 오류가 발생하므로 주의하여야 합니다. (아래 예시코드에서 11줄과 12줄의 위치를 서로 바꾸면 오류가 납니다)



※ 참고: null safety workshop

https://dartpad.dev/workshops.html?webserver=https://dartpad-workshops-io2021.web.app/null_safety_workshop

DartPad Workshops

expand_more

dartpad.dev

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다