플러터 Null Safety 개념

뭉탱이·2023년 3월 5일
0

> Intro

플러터를 아무런 기초지식 없이 뛰어든 바람에 초장부터 Null 문제를 맞닿뜨렸다.

이 기회에 플러터의 Null Safety에 대한 개념을 확실히 잡아보는 시간을 가져본다.


> Null Safety?

프로그램이 실행되고 있는 런타임 상태에서 Null Exception(Null 참조 에러)이 발생하게 되면 프로그램이 오류와 함께 중지된다.

다음과 같은 코딩이 내 프로그램 어딘가에 있다고 생각해보자.

Cat schrodinger;    // 슈뢰딩거라는 고양이를 만들거라고 선언
schrodinger.mew();  // 슈뢰딩거가 야옹(에러 발생!)

Cat 클래스로 schrodinger라는 고양이변수를 만들겠다고 선언만 하고 실체인 고양이 객체를 할당해주지는 않았다.

존재하지 않는 고양이가 '야옹' 할 수 있는가?

양자역학의 세상에선 그럴 확률이 존재하겠지만 우리가 사는 거시세계에선 존재하지 않는 고양이가 '야옹'거릴수는 없는 노릇이다.

시간이 흐르다가 세계가 이 코드를 만나면 조물주에게 Null Exception을 던져버리고 세상을 멈춰버리는 끔찍한 상황이 발생할 것이다.

이런 멍청한 창조자가 되기 싫으면 다음과 같이 코딩할 것이다.

Cat schrodinger;          // 슈뢰딩거라는 고양이를 만들거라고 선언
schrodinger = new Cat();  // 진짜 고양이를 창조해 슈뢰딩거라고 이름지어주다
schrodinger.mew();        // 슈뢰딩거가 야옹

이제야 제대로 동작한다.

하지만 첫번째, 두번째 예제 모두 컴파일은 문제없이 진행된다.

단지, 런타임 상황에서 에러가 발견될 뿐이다.

따라서 런타임 상황에서 에러가 발생하는 것을 코드 단계에서 체크를 할 필요성이 생겼고, 이런 필요에 의해 만들어진 문법적인 기법이 Null safety라고 할 수 있다.

요즘(2023년 3월 5일 기준)에는 이런 Null Safety를 지원하는 기술이 많아졌다고들 하는데 플러터도 이런 트렌드에 탑승하여 2.12.0 버전 이상부터 Null Safety를 지원한다.


> 실제 예시

따라서 모든 객체를 사용할 때 초기화가 동시에 진행되어야 한다.

string txt; // 문자열 선언
print(txt); // 에러

플러터 혹은 dart에서 위 예제는 오류를 발생한다.

txt가 초기화 되어 있지 않아 null을 발생시킬 수 있기 때문이다.

기본적으로 non-nullable이라는 것을 항상 명심해야 한다.

그렇다면 null을 절대 사용하지 않는 것인가?

그렇지는 않다.

null은 매우 훌륭한 '아무것도 없다'는 표현이기에 이를 표현하는 방법도 존재해야한다.

dart에서는 ? 연산자를 사용하여 nullable 자료형(클래스)를 지원한다.

string? txt; // 문자열 선언
print(txt);  // null 출력

즉, 위의 예제는 null safety하다.


> 마무리

이제서야 플러터와 dart를 제대로 시작하고 있어 많은 개념과 기초가 부족하다.

하지만 앞으로도 꾸준히 공부하면서 계속 보완해 나갈 계획이다.

오늘의 한줄로 로그를 마무리한다.

'항상 null을 조심하자!'

profile
메타유목민을 꿈꾸는 청년

0개의 댓글