플러터도 원래는 null에 대한 정책이 따로 없었는데 2.0버전으로 업그레이드 될때 추가 되었다고 한다.
그래서 이번에는 어떻게 null-safety를 보장하게 되었는지 적어보려고 한다!
추가로 final과 const의 차이까지! 이건 매번 생각하면서 작성해야함
class Person {
final int age;
String name;
Person(this.age, this.name);
}
void main() {
int age;
age = 20; // 즉 age가 가리키는 주소가 달라져도 됨 mutable한 속성임!
final int mFinal = 30; // 둘다 이렇게 적기는 가능함
const int myConst = 70;
Person p1 = new Person(21, 'E');
// 객체는 이렇게 생성자를 부를때 데이터를 넣을 수도 있다
// 이걸 런타임때 데이터를 넣는다고 표현! -> final이 바로 runtime때 초기화된다
// const변수는 컴파일 시 상수가 됨 -> 즉 앱 실행전 기계어로 변활할 때!
// const time = DateTime.now(); 이건 오류다 -> Date는 시간을 앱 실행때마다 전해주는데 앱이 실행전에 초기화 되어야한다
final time2 = DateTime.now();
}
일단 null-safety가 뭔지 정확히 알야아한다!
null은 차고로 정말 좋은 데이터다!
아무것도 없음이나 주소 지정이 안되어있다는걸 표현할 수 있기 때문에!
null을 없애는게 아니라 null때문에 의도치 않은 에러가 나는 경우를 막아야한다
런타임때 null 참조 즉 null은 주소가 없는데 그걸 참조하려고 해서 오류가 난다
Dart언어에서는 null-safety로 컴파일러가 해당 버그를 잡아서 대비 할 수 있게 해줍니다
book isEmpty(String string) => string.length = 0;
main() {isEmpty();}
이렇게 null을 전달하게 되면 String 클래스와 Null클래스가 가지는 내장 함수가 다르다
그래서 Null클래스에는 length라는 내부 변수가 없기에 런타임때 오류가 뜬다!
웃긴건 컴파일은 된다는 거다 즉 정상 실행은 된다는거...
이전 버전에서는 Null클래스가 맨 하위 클래스로 들어가 있다
현재는 Null클래스를 완전히 뺌!
모든 자료형은 일단 Non-Nullable하고 int?이렇게 작성해야만 Null클래스와 int클래스를 모두 가지는 클래스가 된다
String simpleTypePromotion(String? nullableString) {
if (nullableString == null) {
return "this is null";
}
}
String? notString = null;
print(notString?.length); // null출력
차고로 Dart언어는 초기화에 예민한데 이러한 초기화를 변수 사용전에만 넣으면 오류 없애주는 변수타입이 있다!
class Developer {
String _techStack; // non_nullable한 변수 생성시 초기화 필수!
late String _techStack2; // 이러면 변수 사용전까지만 어떻게든 변수 초기화 해주면 된다
}