Dart & Flutter

[Dart 기초] Dart Null safety

daehwi 2023. 1. 29. 00:59
반응형

Null safety란?

Dart는 기본적으로 Null safety를 제공하는 언어이다.

Null safety란, 프로그래머의 잘못된 null 값 사용으로 인해 생기는 문제를 컴파일러에서 막아주는 기능이다.

 

프로그래밍 언어에서 Null 은 "아무것도 없음"을 나타낼 수 있는 상태이며(0 또는 ""와는 다르다), 이는 종종 예상치못한 에러를 유발한다.

 

Null로 인해 발생하는 대표적인 문제인 널 포인터 역참조(Null pointer dereference)는,

프로그램의 예상치 못한 종료를 발생시킬 뿐만 아니라 보안문제를 야기하기도 한다.

 

따라서 개발자는 null 값으로 인한 문제가 발생하지 않도록 null pointer 체크나 정적분석도구를 활용한다.

하지만 Dart에서는 기본적으로 null safety 기능을 제공하여 개발자가 좀 더 손쉽게 에러를 예방할 수 있도록 돕는다.

 

다만, null safety 는 단순히 null 을 사용하지 못하도록 막기 위한 것이 아닌, null 로 인해 발생하는 예상치 못한 문제를 막기 위한 방법이라는 것을 알아두자.

 

Dart null safety 예시

1. Null safety로 인한 에러 발생 예시

bool isEmpty(String s) => s.length == 0;
void main(){
    isEmpty(null);
}

위와 같은 경우, Dart 컴파일러는 Null safety를 보장하기 위해 NoSuchMethodError 에러를 발생시킨다.

왜냐하면, isEmpty 함수에 전달된 null 은 Null class의 객체이지 String class의 객체가 아니기 때문이다.

따라서, Null class에는 존재하지 않는 length method를 호출한 것이 되어 오류가 발생하는 것이다.

 

2. Null을 사용하는 방법

void main() {
    String? s = null;
    if(s != null) {
    	s.length;
    } else {
        ...
    }
}

Dart 언어가 Null safety를 보장하는 언어라고 해서 Null을 절대 사용할 수 없는 것은 아니다.

위와 같이 변수를 선언할 때 자료형 뒤에 ? 키워드를 붙혀주어 null 값을 담을 수 있는 변수를 선언하면 Null 을 담을 수 있는 변수를 선언할 수 있다.

이 경우에는, if문과 연산자를 활용하여 변수가 String 객체인지 null 객체인지 알 수 있게되고, null 인 경우 예외처리가 가능하다.

 

추가로,

String? s = "hi";
s?.isEmpty;

예시와 같이 if 문을 사용하지 않고도 간단하게 사용이 가능하다. 이 경우에는, 변수 s가 null이 아니면 isEmpty 메소드를 호출하게 된다.

반응형