본문 바로가기
Flutter/Dart 입문

[Dart] 11. Null Safety

by Couldi 2021. 11. 4.
반응형

21. 11. 4.

- Could -

 

이 글은 프로그래밍 입문을 Flutter 때문에 Dart로 시작하는 사람들을 위한 글입니다.
프로그래밍 언어가 가지고 있는 기본 컨셉 자체를 Dart라는 언어를 통해 설명하고,
많은 분들이 Flutter를 위해 학습한다고 생각해, 추후 Flutter 학습에 도움이 되는 방향으로 작성되었습니다.
1. Null 이란?
2. Null Safety 사용
3. 정리

널 세이프티에 대해서 알기위해서는 결국 Null이 뭔지 부터 알아야한다. 널이 대체 무엇이길래 언어 자체에서 Null Safety라는 개념을 도입해 안전을 도모하는 것일까..

대부분의 답은 이 영상에 담겨있다. 왜 Dart에 Null Safety가 도입되게 되었으며, 어떤 것들을 생각하고 도입했는지, 그리고 어떤 효과가 있었는지 자세히 설명해준다.

https://youtu.be/tP9TcrUZoIs

자막도 지원해 주니 편안하게 한번 보자.

 

사실 Null Safety라는 개념이 낯설어서 그렇지, 알아야할 것과 배워야 할 것은 많지 않다.

 

 

1. Null 이란?

정말 적절한 비유다!

위 영상에서 Bob Nystrom은 Null을 갓난아기에 비유하며, '많은 일을 할수 있지만 감독 없으면 무언가 파괴하는 존재'라고 말한다. 개발 과정 중에 Null 관련 에러로 고통받은 경험이 있다면 탁월한 비유라는 생각에 절로 박수를 칠지도 모른다.

Null은 기본적으로 빈 상자이다. 상자 안에 아무것도 없는 상태. 앞서 변수를 상자라고 비유하는 이유, 변수를 선언하는 부분과 할당하는 부분을 나눠서 설명한 이유 모두, 이 Null의 개념을 쉽게 설명하기 위한 빌드업이였다!

(거짓말이다. 원래 다들 그렇게 설명한다.)

 

Null은 빈상자이다.



2. Null Safety란?

Null Safety는 모든 것을 파괴하는 저 갓난아기로 부터 코드를 안전하게 작성하는 법 정도로 이해하면 된다. Null Safety를 지원하는 언어가 Dart만 있는 것은 아니다. 많은 개발자들이 Null로 인해 고통을 받아왔기 때문에 코틀린이나 자바에서도 Null Safety를 지원하고, Null Safety를 지원하지 않는 언어에서는 개발자들이 Null Safety를 고려하여 개발을 진행한다.

https://dart.dev/null-safety

 

Sound null safety

Information about Dart's null safety feature

dart.dev

항상 Doc을 보는 습관을 들이라고 했으니, 이것도 시간이 되면 찬찬히 읽어보자.

 

Null Safety 문법

데이터타입 뒤에 붙이는 ?

String name;

String? name;

 

둘다 name이라는 String타입이 들어가는 변수를 만드는 건데 무슨 차이가 있을까?

먼저 위의 코드는 우리가 일반적으로 다뤘던 변수의 선언방식이다. Dart는 기본적으로 위와 같이 선언하면, Null을 허용하지 않는 변수로 본다. 쉽게 설명하면 아래와 같다.

  • String name;
    Non-nullable variable. Null 허용 X, 값이 꼭 들어가 있어야함. 값을 넣어주지 않고 변수를 사용하면 Null 에러 발생. 
    Non-nullable variable 'name' must be assigned before it can be used.
  • String? name;
    Nullable variable. Null 허용 O,  선언하는 순간 바로 Null이 초기값으로 들어감.

변수 선언 시점에 데이터 타입 뒤에 ?를 붙여주면 Null이 들어갈수 있는 상자가 만들어진다. 그래서 코드를 짤 때, 각 변수가 Null을 허용해야하는지 여부를 잘 고려해서, 허용해야할때만 ?를 붙여주면 된다.

 

변수나 클래스 사용시 뒤에 적는 !

변수나 클래스를 사용하다 보면, 각 값이 null일 경우 사용할 수 없는 메소드나 인스턴스 변수 값들이 있다. 보통 선언시 ?를 붙여 Null이 들어갈 수 있게 만들어둔 변수나 클래스를 활용할때 이런 문제가 발생하는데, '이거 실행하려면 Null이면 안되는데, Null이 올 수도 있어서 곤란하다.'라는 식의 메세지가 나온다.

이때 Null이 올지도 모른다고 공포에 휩쌓인 Dart를 안심시키는 방법이 바로 ! 이다.

진정해 친구, 여기에 널이 오는 일은 없을꺼야.

Null이 오지 않는 확실한 상황임에도 불구하고, Null이 올지도 모른다고 에러가 난다면 '여기에는 널이 절대 안와!' 라고 보증하듯 붙여주는게 바로 ! 이다.

print(name.length)


//여기에는 Null이 안올꺼란다 얘야!
print(name!.length)

물론 이건 그저 보증일 뿐이다. 실제로 코드를 잘못짜서 !로 보증을 했음에도 불구하고 Null이 들어간다면 결국 다시 빨간 에러메세지를 마주하게 될거다.

 

late 연산자

late는 변수를 선언하는 시점에 붙이는 키워드이다. 이건 Dart에게 '지금 당장은 아니고 나중에 데이터가 들어올꺼야' 라고 약속하는 키워드이다. 물론 약속을 어기는 순간 에러난다.

일반적으로 코드를 짜다보면 변수를 선언한 시점에 변수에 값을 넣어주는데(이 부분을 변수를 초기화한다고 하기도하고 할당한다고 하기도 하고 사람에 따라 다양하게 표현한다.), 항상 변수를 선언하는 시점에 값을 넣어줄 수 있는 건 아니다.

코드에 따라 나중에 값을 할당해야하는 경우도 생기는데, 문제는 Dart가 Non-nullable변수에 값이 할당되어 있지 않으면 'Null이오면 어떡하지' 라는 불안에 휩쌓인다는데 있다. 이때 불안에 떠는 Dart를 진정시켜주는 약속이 late이다.

late String name;

나중에 name값 할당해줄께. null로 내버려두지는 않을꺼야.

다시 한번 말하지만, 이건 그저 약속일 뿐이고, 약속을 어기는 순간 에러난다.

나중일은 모르는 거지..

 

 

 

class와 Null Safety

이건 class를 설명하면서 어쩔수 없이 설명했다. 아래 글을 참고하면 된다.

https://couldi.tistory.com/27?category=927475 

 

[Dart] 10-2. 클래스(class)

21. 10. 27. - Could - 이 글은 프로그래밍 입문을 Flutter 때문에 Dart로 시작하는 사람들을 위한 글입니다. 프로그래밍 언어가 가지고 있는 기본 컨셉 자체를 Dart라는 언어를 통해 설명하고, 많은 분들

couldi.tistory.com

인스턴스변수를 어떻게 선언하는지, 그 선언에 따라 생성자를 어떻게 작성해야하는지에 대해 이해하고 있다면, 굳이 또 볼 필요는 없다.

 

3. 정리

https://news.dartlang.org/2015/08/dart-112-released-with-null-aware.html

 

Dart 1.12 Released, with Null-Aware Operators and more

Dart 1.12.0 is now released ! It contains the new null-aware operators language feature, and enhancements to pub, Observatory, dartdoc, and ...

news.dartlang.org

https://dart.dev/codelabs/null-safety

 

Null safety codelab

Learn about and practice writing null-safe code in DartPad!

dart.dev

위 링크들을 읽으면서 정리하면 된다 이제.

반응형

댓글