코드가 수천 수만줄이라고 가정했을 때 null값을 허용하지 않는 수많은 변수들 중에 어떤 변수에 실수로 값이 할당되지 않아 앱이 터져버린건지 찾아내기란 만만치 않다. 다트가 컴파일 시에 이 부분을 지적해주면 효율적이라는 논리 하에 개념을 추가하게 됐다.
Null safety 기능 하에서도 Null 값이 들어오도록 허용해줘야 하는 경우가 있다.
이 경우에 대한 사용법을 알아보자.
class Person{
String? name;
String nameChange(String name){
this.name = name;
return name.toUpperCase();
}
}
하지만 이 경우에도 null이 될 수 있기 때문에 null check 등의 조치를 취하라고 에러 메시지가 뜬다.
class Person{
String? name;
String nameChange(String name){
this.name = name;
if(name == null){
return 'need a name';
}else{
return name.toUpperCase();
}
}
}
class Person{
int age;
int sum(int age, int num){
this.age = age;
int total = age + num;
return total + age;
}
}
void main(){
Person p = Person();
print(p.sum(100, 50));
}
선언과 동시에 변수값이 할당되는 것이 아니라 나중에 할당되는 경우이다.
이럴 때 변수 앞에 late이라는 키워드를 붙여준다.
class Person{
late int age;
int sum(int age, int num){
this.age = age;
int total = age + num;
return total + age;
}
}
void main(){
Person p = Person();
print(p.sum(100, 50));
}
void main(){
int x = 50;
int? y;
if(x > 0){
y = x;
}
int value = y;
print(value);
}
nullable value값은 non-nullable value값에 할당될 수 없을 때 나오는 에러메시지가 뜬다. 이런 경우 nullable 변수 y는 항상 non-nullable value값을 가질 거라고 알려줘야 한다. (! Exclamation or Bang)
void main(){
print(add());
}
int add({int a, int b}){
int sum = a + b;
return sum;
}
add 메서드의 인자값은 int형으로 null 변수를 가질 수 없는 타입이기 때문에 컴파일 에러가 발생한다. 이 경우에는 type 앞에 required라는 키워드를 추가해준다.
그러면 반드시 add 메서드에 인자값을 전달해줘야하기 때문에 추가해달라는 컴파일 에러가 또 뜬다.
이 경우에도 하나만 값이 전달된다거나, null값으로 값을 전달하게 되면 역시 컴파일 에러가 발생한다. null 체크를 해주면 해결된다.
void main(){
print(add(a: null, b: 5));
}
int add({required int a, required int b}){
if( a == null){
return b;
}
int sum = a + b;
return sum;
}
복습과 심화학습을 할 수 있는 문제들이 있다.