티스토리 뷰
● 도입
- Dart의 Null Safety에 대해 알아보자
- Null Safety는 간단히 말해 null 값을 참조할 수 없도록 하는 것이다.(데이터가 null 일 때는 참조하지 않도록 만든다.)
- 보통 null 값을 참조하면 Runtime Error이 발생하는데 이를 방지하고자 하는 것이다.
- 전제 : Dart의 변수는 기본적으로 nullable이 아니다.(= null이 될 수 없다.)
- 변수를 nullable로 만들고 싶을 때(= null이 될 수도 있다.) '?' 를 붙인다.
(어떤 변수 혹은 데이터가 null이 될 수도 있다는 것을 명시하는 것이다.)
https://dart.dev/null-safety/understanding-null-safety
● 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 시작부터 있던 기능이 아니다.)
- 이런 오류가 발생하지 않으려면 null 값에 대한 보호가 있어야하며 따라서 Dart는 Null Safety를 만들었다.
- dart에서는 어떤 변수가 null이 될 수 있음을 정확히 표시해야 한다.
- 아래와 같이 type이 명확한 변수에 null을 넣어줄수는 없다.
- name이라는 변수는 오직 string 이여야 하기때문에 아래와 같은 경우에 빨간줄이 뜨는 것이다.
- 하지만 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
- 알고리즘
- 프로그래머스
- DART
- Java8
- node.js
- 프로세스
- jpa
- 빅데이터 분석기사
- API
- db
- SpringBoot
- 코딩테스트
- spring
- 자료구조
- Phaser
- MongoDB
- 운영체제
- Phaser3
- java
- Stream
- OS
- git
- 빅데이터
- MySQL
- Advanced Stream
- 코테
- Spring Boot
- 메모리
- nosql
- SQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |