Flutter 2.0 버전의 주요 업데이트 중 하나가 바로 Dart의 버전이 2.12.0이 적용 되면서 Null Safety가 적용 된 것일 겁니다.
생겨서 불편하기만 하다고 생각 하는 분들이 생각보다 꽤 있는 듯 하여, Null Safety가 왜 Dart에 적용되게 되었고, 이걸 어떻게 활용 하면 효과적인 지에 대해 2.0이 나온지 1년이 넘어가는 시점에 한 번 정리 해 보고자 합니다.
NPE(NullPointException)라는 Exception을 Compile 과정 전에 알 수 있느냐, 알 수 없느냐 가 가장 큰 이유 입니다.
이것만 하더라도 Null이 의도되지 않은 상황에 서비스 중 접근이 되어 예외가 발생하는 상황을 줄일 수 있고,
특히 코드의 수정 / 적용이 플랫폼의 심사가 필요한 Mobile Application에서는 가장 큰 요소라 할 수 있습니다.
그 외에도 소소한 장점이라면, 앱이 실행되고 작동하는 과정에서 Null 검증 과정이 줄어들기 때문에 성능상의 이점도 있을 수 있으며, Null 값에 대한 별도 처리를 하는 과정이 연산자를 통해 쉽게 처리할 수 있다는 것을 장점이라 들 수 있습니다.
특정 객체를 Null의 값을 허용할 지 알 할지 입니다.
일반적으로 2.15 이후 모든 일반적인 Dart에서의 객체는 Non Nullable 즉, Null을 허용하고 있지 않습니다.
그렇기 때문에 특정 객체가 Null을 허용하려는 경우에 별도의 작업을 필요로 하게 되는데,
이 때 사용 되는 것이 타입 뒤에 오는 ‘?’ 연산자입니다.
void main() {
String nonNull = '이 변수는 Null을 허용하지 않습니다.';
String? nullable;
nullable = '이 변수는 Null을 허용합니다.';
// 정상 출력 - 이 변수는 Null을 허용하지 않습니다.
print(nonNull);
// 정상 출력 - 이 변수는 Null을 허용합니다.
print(nullable);
// 정상 처리
nullable = null;
// 예외 발생
// A value of type 'Null' can't be assigned to a variable of type 'String'.
print(null);
}
위의 예제를 확인 해 보시면
nonNull 이라는 변수의 타입으로는 ? 이 붙지 않는 String 타입이,
nullable 이라는 변수의 타입으로는 ? 이 붙은 String을 선언하여
nullable 객체에 null 허용 처리를 하였습니다.
그렇기 때문에 코드 진행 상에서 평범하게 사용할 떄에는 전혀 문제가 없으나,
null값을 부여 하려는 코드를 실행 할 경우
A value of type 'Null' can't be assigned to a variable of type 'String'.
이라는 예외를 발생하게 됩니다.
바로 해당 변수가 Null 허용을 하고 있지 않기 때문입니다.
nullable로 선언을 하였음에도, 코드가 진행 하는 방식에 따라서, 개발자는 이 값이 어느 시점에서는 null인 경우에는 예외를 발생시켜야 하는 상황이 생기곤 합니다.
(사실 그렇기 보단 다른 함수에 nullable 변수를 활용하려 하는데 compiler가 비명을 지르는 경우가 대다수이긴 하죠)
그럴 땐 일반적으로 nullable 변수 뒤에 !을 붙여 이 값는 null이 아닐거라고 compiler에게 선언 할 수 있습니다.