> 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을 조심하자!'