먼저 Null Safety 에러 하나를 해결하고, 플러터에서 얘기하는 Null Safety가 무엇이고 왜 적용되었는지 알아본 뒤, 코딩할 때 마주치는 null safety 관련 연산자 ?와 !, late에 대해 알아봅시다.
패키지를 추가한 뒤 마주친 Null Safety 에러 해결하기
제가 현재 포스트 작성 시점에서 사용 중인 플러터 버전은 3.3.3이고, 다트(Dart) 버전은 2.18.2입니다. 플러터 프로젝트에서 로그인 페이지를 구현하기 위해 flutter_signin_button 패키지를 추가했더니 dependencies에 있는 flutter_signin_button와 font_awesome_flutter가 null safety를 지원하지 않는다는 에러가 떴습니다. pubspec.yaml 파일을 봤더니 flutter_sigin_button 0.2.5 버전이 깔려있습니다.
pub.dev에서 flutter_signin_button 패키지 내용을 확인하니, flutter_signin_button의 최신 버전은 2.0.0이고 Null Safety를 지원한다고 합니다. 그래서 pubspec.yaml 파일의 flutter_signin_button 버전을 2.0.0 으로 수정한 뒤 저장하니 에러가 사라지고 앱이 잘 런칭되었습니다!
Null Safety는 무엇이고 왜 적용했을까?
TL;DR Null Safety는 한 마디로 앱 사용 중에 변수에 값이 없어 예상하지 못한 에러가 발생하는 경우를 방지하겠다는 Dart 언어의 사용 규칙입니다.
다른 말로 하면 'null 상태가 되면 안 되는 변수가 런타임에서 null 상태로 문제를 일으키지 못하도록, 컴파일 타임에 정적 체크를 통해 알려주겠다'라고도 이해할 수 있습니다. 사용자 인터페이스를 담당하는 앱에서, 앱이 실행 중에 런타임 에러가 발생하면 골치 아프니까요. dart 페이지 설명에 따르면, 기존 시스템에서는 Null 타입이 Object와 자식 클래스인 Iterable, num 등 모든 타입에서 null을 허용하기 때문에 null 참조 에러가 발생했습니다. 예시로 설명된 List의 경우, myList라는 List의 값이 할당이 안 된 상태에서 myList[0]나 myList.add(1) 등등 myList를 참조하려고 하는 경우는 모두 에러가 발생했겠죠. 이런 상황을 막고자 Dart에서는 Null 클래스를 기존 Object 클래스에서 따로 분리시켰습니다. 즉, Null을 제외한 모든 타입은 반드시 값을 할당해야한다고 못박은거죠.
하지만 런타임 에러의 주범 Null은 코딩에서 값이 반드시 할당될 필요가 없을 때 약방의 감초같이 유용하게 쓰이기 때문에, 이 경우에는 타입 옆에 ?를 추가해 null 할당이 예외적으로 가능하게 했습니다. ?를 붙이면 해당 변수 타입을 Nullable, 즉 'null 값 할당이 가능한 상태'로 만들어 줍니다. String? myString으로 String 타입을 선언했다면 myString은 값이 할당되지 않을 수도 있습니다. 단, 이런 경우에 반드시 if (myString == null) 등으로 myString이 null인지 체크하는 구문을 넣어야 안전하게 사용할 수 있습니다.
반대로 String 값이 반드시 있어야 한다면, String myString = "Hello, world!"; 와 같이 String 변수에 대해 선언과 동시에 값을 대입해야 합니다. 다만 에러 체크를 안해도 된다고 판단하는 경우나 다른 코드에서 값을 반드시 대입하기 때문에 그냥 넘어가도 괜찮다고 생각되는 경우에는 String! myString; 과 같이 ! 연산자를 사용해 값을 할당하지 않아도 컴파일 에러가 발생하지 않게 적용할 수도 있습니다. 디버겅 용도로 사용할 수도 있겠죠.
?나 !보다 late 키워드를 쓰면 변수 선언과 값 할당이 서로 떨어져 있는 경우를 좀 더 유연하게 처리할 수 있습니다. late String myString; 은 myString 값이 다른 코드에서 값이 할당된다는 걸 개발자에게 명시적으로 알려줍니다. 따라서 null 값이 할당된다고 착각하지 않고 변수를 처리할 수 있겠죠. 실제 현업에서는 개발 담당자가 바뀌며 변수 사용에 대한 히스토리가 없어서 어떤 용도로 사용하는 변수인지 잘 모르는 경우가 종종 발생합니다. 이럴 때 null이 사용되지 않지만 바로 값을 대입하지 않는 변수에 대해, late 키워드를 넣어주면 다른 개발자가 해당 변수에 null을 할당하는 실수를 방지할 수 있습니다.
'Flutter' 카테고리의 다른 글
플러터(Flutter) - Android 앱과 Firebase 연동 (0) | 2022.10.12 |
---|---|
플러터(Flutter) - 코드 작성이 쉬워지는 IDE 단축키 알아보기 (0) | 2022.10.10 |
Flutter 데모 앱 살펴보기 3 - interactivity, navigation (0) | 2022.10.08 |
Flutter Material 디자인 - BottomNavigationBar (탭 바) (0) | 2022.10.06 |
Flutter 데모 앱 살펴보기 2 - Widget과 외부 패키지 사용법, 스크롤 기능 (0) | 2022.10.05 |
댓글