Flutter앱 유지보수 1년 간 해보기 프로젝트 -10(null-safety는 왜 2.0때 추가 되었는가)

박경현·2023년 11월 26일
0

플러터도 원래는 null에 대한 정책이 따로 없었는데 2.0버전으로 업그레이드 될때 추가 되었다고 한다.

그래서 이번에는 어떻게 null-safety를 보장하게 되었는지 적어보려고 한다!

추가로 final과 const의 차이까지! 이건 매번 생각하면서 작성해야함

final vs 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-safety가 뭔지 정확히 알야아한다!

null은 차고로 정말 좋은 데이터다!

아무것도 없음이나 주소 지정이 안되어있다는걸 표현할 수 있기 때문에!

null을 없애는게 아니라 null때문에 의도치 않은 에러가 나는 경우를 막아야한다

런타임때 null 참조 즉 null은 주소가 없는데 그걸 참조하려고 해서 오류가 난다

Dart언어에서는 null-safety로 컴파일러가 해당 버그를 잡아서 대비 할 수 있게 해줍니다

null-safety 적용전 일어나는 문제

book isEmpty(String string) => string.length = 0;
main() {isEmpty();}

이렇게 null을 전달하게 되면 String 클래스와 Null클래스가 가지는 내장 함수가 다르다
그래서 Null클래스에는 length라는 내부 변수가 없기에 런타임때 오류가 뜬다!

웃긴건 컴파일은 된다는 거다 즉 정상 실행은 된다는거...

이전 버전에서는 Null클래스가 맨 하위 클래스로 들어가 있다

현재는 Null클래스를 완전히 뺌!
모든 자료형은 일단 Non-Nullable하고 int?이렇게 작성해야만 Null클래스와 int클래스를 모두 가지는 클래스가 된다

null-safety 적용 이후

String simpleTypePromotion(String? nullableString) {
	if (nullableString == null) {
    	return "this is null";
    }
}
String? notString = null;
print(notString?.length); // null출력

late 연산자

차고로 Dart언어는 초기화에 예민한데 이러한 초기화를 변수 사용전에만 넣으면 오류 없애주는 변수타입이 있다!

class Developer {
	String _techStack; // non_nullable한 변수 생성시 초기화 필수!
    late String _techStack2; // 이러면 변수 사용전까지만 어떻게든 변수 초기화 해주면 된다
}
profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글