[Flutter] Null safety를 이해해보자

kimiszero·2021년 5월 26일
2

Flutter

목록 보기
1/1
post-thumbnail

1. Null safety 도입배경

코드가 수천 수만줄이라고 가정했을 때 null값을 허용하지 않는 수많은 변수들 중에 어떤 변수에 실수로 값이 할당되지 않아 앱이 터져버린건지 찾아내기란 만만치 않다. 다트가 컴파일 시에 이 부분을 지적해주면 효율적이라는 논리 하에 개념을 추가하게 됐다.

2. Null safety 설명

  1. 모든 변수는 null이 될 수 없으며, non-nullable 변수에는 null 값을 할당할 수 없다.
  2. non-nullable 변수를 위한 null check가 필요 없다.
  3. "Class 내의 변수는" 반드시 선언과 동시에 초기화를 시켜야 함

3.Null safety 사용법.

Null safety 기능 하에서도 Null 값이 들어오도록 허용해줘야 하는 경우가 있다.
이 경우에 대한 사용법을 알아보자.

3-1 ? Nullable Type : 변수 타입 뒤에 ?을 붙여준다.

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

하지만 이 경우에도 null이 될 수 있기 때문에 null check 등의 조치를 취하라고 에러 메시지가 뜬다.

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

3-2 late late initialized : 선언이 먼저되고 나중에 할당한다.

class Person{
	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));
}

선언과 동시에 변수값이 할당되는 것이 아니라 나중에 할당되는 경우이다.
이럴 때 변수 앞에 late이라는 키워드를 붙여준다.

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));
}

3-3 ! Not nullable Type : nullable 변수가 항상 non-nullable 변수 값을 가진다는 확신이 있을 때 nullable 변수에 느낌표를 추가해주면 된다.

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

nullable value값은 non-nullable value값에 할당될 수 없을 때 나오는 에러메시지가 뜬다. 이런 경우 nullable 변수 y는 항상 non-nullable value값을 가질 거라고 알려줘야 한다. (! Exclamation or Bang)

3-4 required not optional :

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

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

add 메서드의 인자값은 int형으로 null 변수를 가질 수 없는 타입이기 때문에 컴파일 에러가 발생한다. 이 경우에는 type 앞에 required라는 키워드를 추가해준다.
그러면 반드시 add 메서드에 인자값을 전달해줘야하기 때문에 추가해달라는 컴파일 에러가 또 뜬다.
이 경우에도 하나만 값이 전달된다거나, null값으로 값을 전달하게 되면 역시 컴파일 에러가 발생한다. null 체크를 해주면 해결된다.

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;
}

🐣추가로 더 공부가 필요하다면 Dart codelab으로 가기

복습과 심화학습을 할 수 있는 문제들이 있다.


👍👍👍 참고한 자료

코딩쉐프님 - Null Safety 이해하기

Null Safety 사용방법

profile
Flutter&Dart

0개의 댓글