Null safety 이해하기

2022. 1. 10. 18:21Flutter

반응형

플러터 앱을 만들거나 dartpad를 이용하다 보면 'Compiling with sound null safety' 등과 같은 오류를 만날 수 있었다.

Null safety가 무엇이고 어떻게 적용하는 것인지 알아보자.

 

1. Null이란?

우선 Null이란 뭘까?

Null은 '값이 없음'을 나타낸다. 값이 없다는 것은 0이라는 것이 아니다! 그냥 존재도 하지 않는다는 뜻이다.

 

Null safety는 Flutter 2.0과 Dart 2.12부터 지원된 개념으로 null에게서 안전한 프로그램 코드를 작성하는 것을 의미한다.

null safety를 사용하면 컴파일러에서 코드를 실행하기 전에 버그를 찾아 내 수정할 수 있다.

null safety의 목표는 null을 제거하는 것이 아니다!

 

2. Null safety란?

Null Safety에 대해 꼭 기억해야 할 세 가지가 있다.

1. 모든 변수는 null이 될 수 없으며, non-nullable 변수에는 null값을 할당할 수 없음

2. non-nullable 변수를 위한 null check가 필요 없음

3. "Class 내의 변수는" 반드시 선언과 동시에 초기화를 시켜야 함

 

3. Null safety 사용하기

Null safety 임에도 우리는 변수에 Null 값을 허용해야 하는 경우가 생길 수 있다.

즉, null safety기능이 default값으로 지정되어 있지만 변수를 선언할 때 컴파일러에게 변수에 null값이 들어올 수도 있다는 것을 미리 설명해주는 것이다. 사용법에 대해 알아보자.

3-1. Type뒤에 물음표를 붙여준다.

class Person {
	String? name;
    
    String nameChange(String? name) {
    	this.name = name;
        return name.toUpperCase();
    }
}

하지만 이 경우에도 return 되는 name이 null이면 toUpperCase를 실행할 수 없다는 에러가 나온다.

null 체크를 추가해 이를 해결할 수 있다.

class Person {
	String? name;
    
    String nameChange(String? name) {
    	this.name = name;
        if(name == null){
        	return 'need a name';
        }else{
        return name.toUpperCase();
        }
    }
}

3-2. 선언을 먼저하고 나중에 할당한다.

class Person{
	late int age;
    
    int sum(int age, int num) {
    this.age = age;
    int total = age + num;
    
    return total + age;
    }
}

void main() {
	Person p = Person();
    print(p.sum(100, 50));
}

선언과 동시에 변수값이 할당되는 것이 아니라 나중에 할당이 되어야 하는 경우에는 변수의 type앞에 late를 붙여준다. 즉, 조금 늦게 변수값을 초기화하겠다는 뜻이다.

3-3. nullable 변수가 항상 non-nullable 변수값을 가진다는 확신이 있으면 nullable변수에 느낌표를 추가해준다

void main(){
	int x = 50;
   	int? y;
   	if(x > 0){
   		y = x;
   	}
   	int value = y;
   	print(value);
}

이 경우, nullable value값인 y는 non-nullable value값인 value에 할당될 수 없다는 오류가 뜬다.

이런 경우 우리는 nullable value값인 y가 항상 non-nullable 값을 가질 것이라고 알려줄 수 있다.

! (느낌표, Exclamation or Bang)를 추가해주면 문제없이 실행된다.

void main(){
	int x = 50;
   	int? y;
   	if(x > 0){
   		y = x;
   	}
   	int value = y!;
   	print(value);
}

3-4. required 추가하기

void main(){
	print(add());
}

int add({int a, int b}){
	int sum = a + b;
    return sum;
}

named argument 형식의 인자값은 optional 하기 때문에 아무 값도 전달하지 않을 수 있다.

따라서 null safety 오류가 발생한다. 

이럴 때는 type앞에 required라는 키워드를 추가해주면 된다. 그러면 반드시 add메소드에 인자값을 전달해주어야 한다.

void main(){
	print(add());
}

int add({required int a, required int b}){
	int sum = a + b;
    return sum;
}

하지만 add메소드에서 두 개의 인자값 중 하나의 인자값만 전달해주거나, 둘 중 하나라도 null이 전달되면 컴파일 에러가 발생한다.

하나의 값이 null일 경우에는 그 값에 대한 null check를 추가해주어야 한다.

void main(){
	print(add(a: null, b: 5));
}

int add({required int a, required int b}){	
	if(a == null) {
    	return b;
    }
	int sum = a + b;
    return sum;
}

 

 

 


참고

[코딩셰프] 플러터 뉴스 : Null safety 완벽하게 이해하기

반응형

'Flutter' 카테고리의 다른 글

GestureDetector와 InkWell  (0) 2022.01.11
Stack과 Positioned  (0) 2022.01.11
bottom navigation tab 만들기  (0) 2022.01.10
Flutter의 기본 구조를 알아보자  (0) 2022.01.07
Flutter Widget이 뭔가요  (0) 2022.01.06