사운드 널 세이프티

사운드 널 세이프티

다트에서 널 세이프티(null safety)에 대한 입문서예요.

출처: Sound null safety

본문

다트 언어는 사운드 널 세이프티(sound null safety) 를 강제해서, 실수로 널(null) 값의 멤버에 접근하는 일이 불가능해요.

다트에서 타입은 기본적으로 널이 될 수 없어요(non-nullable). 널이 될 수 없는 타입의 변수는 반드시 초기화되어야 하고, 널이 아닌 값만 할당할 수 있어요.

다트 분석기(analyzer)와 컴파일러는 널이 될 수 있는 값의 안전하지 않은 사용을 편집 시점에 잡아내요. 그래서 다른 언어에서는 런타임 에러가 될 상황을, 배포 전에 고칠 수 있는 분석 에러로 바꿔 주는 거예요.

예시

다음 코드의 어떤 변수도 널이 될 수 없어요.

// None of these can ever be null.
var i = 42; // Inferred to be an int.
String name = getFileName();
final b = Foo();

변수가 널 값을 가질 수 있음을 나타내려면, 타입 선언에 ?를 붙여요.

int? aNullableInt = null;

널 세이프티 원칙

다트의 널 세이프티는 두 가지 핵심 설계 원칙 위에 세워져 있어요.

기본값으로 널이 될 수 없음(Non-nullable by default) — 다트에게 변수가 널이 될 수 있다고 명시적으로 알려 주지 않는 한, 그 변수는 널이 될 수 없는 것으로 간주돼요. 연구 결과 API에서 널이 아닌 값이 압도적으로 가장 흔한 선택이었기에, 이런 기본값을 채택했어요.

완전한 사운드(fully sound) — 타입 시스템이 어떤 변수나 표현식이 널이 될 수 없는 타입을 가진다고 판단하면, 그 값이 런타임에 절대 null로 평가될 수 없음을 보장해요.

이 두 원칙이 함께 작용하면 버그가 줄고, 바이너리가 작아지고, 실행이 빨라져요.

과거 마이그레이션 자료

다트는 2023년 5월에 출시된 다트 3부터 사운드 널 세이프티를 강제해 왔어요. 앱이나 패키지를 아직 널 세이프티로 마이그레이션해야 한다면, dart-community/migrate-to-null-safety 저장소에 보관된 문서를 확인해 보세요.

더 알아보기