Dart

(Dart) null safety 와 nullable 변수

돗개진 2024. 10. 6. 15:35

이번엔 Dart 언어의 특징인 null safety 에 대해서 알아보도록 하자. kotlin 에서도 마찬가지로 개발자가 null 을 참조하는 것을 막아주는 기능을 제공하는데 해당 기능은 매우 중요하다.

 

왜냐하면 null 을 참조하게 될 경우 런타임 에러가 발생하게 되는데 이 에러는 앱을 사용하던 중에 발생하는 에러로 사용자가 해당 에러를 접하게 되기 때문이다.

 

따라서 컴파일 전에 해당 에러를 잡아내는 것이 이상적이다. 그렇다면 어떻게 해야 null 참조를 방지할 수 있으며 null 이 필요할 경우엔 어떤 방법으로 사용할 수 있을지 알아보도록 하자.

 

void main() {
    String name = '돗개진';
    name = null;
    // Error : null can't be assigned to a variable of type 'String'
}

 

위 코드를 확인해 보자 해당 코드를 실행하면 에러가 뜬다. 이유는 Dart 는 변수를 생성할 때 기본적으로 non-nullable 변수로 선언되기 때문에 아무 조건 없이 변수를 생성한 뒤 null 값을 가질 수 없기 때문이다.

 

null 값을 가질 수 있는 변수를 만들기 위해서는 아래와 같은 방법을 사용할 수 있다.

void main() {
    String? name = '돗개진';
    name = null;
}

 

위처럼 변수 타입을 지정할 때 '?' 를 붙이게 되면 nullale 변수로 생성이 가능하다. 이렇게 생성된 nullable 변수는 null 값을 가질 수 있게 된다.

 

void main() {
    String? name = '돗개진';
    name = null;
    name.isNotEmpty;
    // Error : The property 'isNotEmpty' can't be unconditionally accessed because the receiver can be 'null'.
}

 

위 코드를 확인해 보자 nullable 변수를 생성하고 변수의 값으로 null 을 준 뒤 해당 변수의 멤버 접근을 시도하면 에러가 뜬다. 이유는 name 이라는 변수가 null 일 가능성이 있기 때문에 isNotEmpty 속성에 바로 접근할 수 없기 때문이다.

 

따라서 name이 null이 아닌 경우에만 해당 메소드에 접근할 수 있다는 것인데 이에 대한 검사가 필요하기 때문에 조건문을 사용하는 경우가 있다.

void main() {
    String? name = '돗개진';
    name = null;
    if(name != null) {
    	name.isNotEmpty;
    }
}

 

위 코드를 확인하면 name 이 null 이 아닐 때에만 메소드에 접근하도록 조건을 줬고, name 이라는 변수가 null 이 아님이 증명되니 에러가 뜨지 않게 된다.

 

하지만 위처럼 조건문을 걸어서 실행하면 시간이 오래 걸리기 때문에 단축 문법을 사용하는 것이 좋다.

void main() {
    String? name = '돗개진';
    name = null;
    name?.isNotEmpty;
}

 

단축 문법을 사용하는 방법은 name?.isNotEmpty; 이다. 해당 문법으로 상대적으로 코드가 길고 시간이 걸리는 조건문의 기능을 똑같이 구현할 수 있기 때문에 해당 방법을 지향하는 것이 좋다.

 


 

이렇게 Dart 가 가지고 있는 null safety 기능에 대해 알아보며 null 을 사용하기 위해 필요한 변수 생성 방법과 문법에 대해서도 알아보았다. null 을 방지하는 언어로 앱을 개발하면 앱이 다운될 확률이 20% 가까이 줄어든다고 한다. (kotlin 공부할 때 확인한 정보)

 

또한 API 로 데이터를 요청하여 받을 때 해당 기능을 활용해 볼 수 있으니 잘 이해해 두는 것이 좋을 것 같다!