티스토리 뷰

흥미/Dart

#6 Nullable Variables

RadderNepa 2023. 1. 16. 01:15

 도입

- Dart의 Null Safety에 대해 알아보자

- Null Safety는 간단히 말해 null 값을 참조할 수 없도록 하는 것이다.(데이터가 null 일 때는 참조하지 않도록 만든다.)

- 보통 null 값을 참조하면 Runtime Error이 발생하는데 이를 방지하고자 하는 것이다.

- 전제 : Dart의 변수는 기본적으로 nullable이 아니다.(= null이 될 수 없다.)

- 변수를 nullable로 만들고 싶을 때(= null이 될 수도 있다.) '?' 를 붙인다.

(어떤 변수 혹은 데이터가 null이 될 수도 있다는 것을 명시하는 것이다.)


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

 

Understanding null safety

A deep dive into Dart language and library changes related to null safety.

dart.dev

● Null Safety

- 먼저 Null Safety가 없는 코드를 봐보자

- 아래 코드에는 String을 받아서 true 혹은 false를 return 하는 함수가 있다.

// without null Safety
bool isEmpty(String string) => string.length == 0;

void main() {
  isEmpty(null);
}

- 만약 Null Safety가 없는 버전의 Dart에서 해당 코드를 실행하면 런타임 에러가 발생할 것이다.

- 정확히 말하면 NoSuchMethodError가 발생한다

- length는 String의 속성 중 하나인데 null은 length 이라는 속성이 없기에 NoSuchMethodError가 발생)

- 에러가 발생하는 이유는 간단하다. String을 보내야하는데 null을 보냈기 때문이다.

cf) Null Safety는 Dart가 업데이트 되면서 추가된 기능이다.(Dart 시작부터 있던 기능이 아니다.)

 

출처 : https://dart.dev/null-safety/understanding-null-safety

 

- 이런 오류가 발생하지 않으려면 null 값에 대한 보호가 있어야하며 따라서 Dart는 Null Safety를 만들었다.


- dart에서는 어떤 변수가 null이 될 수 있음을 정확히 표시해야 한다.

- 아래와 같이 type이 명확한 변수에 null을 넣어줄수는 없다.

- name이라는 변수는 오직 string 이여야 하기때문에 아래와 같은 경우에 빨간줄이 뜨는 것이다.

type이 String인 변수에 null을 재할당할 수 없다.

- 하지만 name 이라는 변수에 정확히 어떤 값이 올지 알 수 없는 상황이라면, 즉, string이 올 수도 있지만 반대로 null 이 올수도 있는 상황이라면 아래와 같이 물음표만 추가해주면 된다.

- 바꿔말해 변수가 String도, null도 될 수 있게 하려면 물음표를 붙여주면 된다.

void main() {
  String? name = 'garden';
  name = null;
}

- 위 사진에는 빨간줄이 사라졌다.

- ? 가 붙음으로 인해 Dart가 name 변수는 String이 될 수도 혹은 null이 될 수도 있다는 것을 알기 때문이다.

- 이제 컴파일러 또한 name 변수가 null이 될 수도 있다는 것을 알기 때문에 단순히 아래와 같은 코드를 짜면 오류가 발생


- 그렇기에 ? 이 붙은 변수는 아래와 같이 변수를 사용하기 전에 먼저 null 인지 아닌지를 체크해줘야한다.

bool isEmpty(String string) => string.length == 0;

void main() {
  String? name = 'garden';
  name = null;
  if (name != null) {
    name.length;
    name.isNotEmpty;
    isEmpty(name);
  }
}

- name 변수를 사용하기전에 null 체크를 먼저 해줬기에 빨간줄이 뜨지 않는 것을 확인할 수 있다.

- 컴파일러가 if 문의 true block 에서는 name 변수가 null 이 아니라는 것을 확실히 알기 때문이다.

- 이러한 null safety 기능으로 인해 데이터가 null 일 때는 해당 데이터를 참조하지 않도록 만들 수 있다는 것이다.

- 위의 코드는 너무 길으니 아래와 같이 간단하게 표현할 수도 있다.

bool isEmptys(String string) => string.length == 0;

void main() {
  String? name = 'garden';
  name = null;

  // 값이 존재하는지 확인한 후 이후의 연산을 진행
  // name 변수가 null이 아니라면 isNotEmpty 속성을 사용해라
  name?.isNotEmpty;
}

'흥미 > Dart' 카테고리의 다른 글

#5 Final Variables / final과 const  (0) 2023.01.08
#4 Dynamic Type  (0) 2023.01.05
#3 변수 - The Var Keyword, 명시적 타입  (0) 2022.12.29
#2 Dart 실행 / main method, 세미콜론  (0) 2022.12.28
#1 Dart란?  (0) 2022.12.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함