Dart 언어에서의 null safety 개념

개발을 접해보지 못한 저로서는 이 개념이 가장 헷갈립니다. 두고두고 공부를 해야하는 부분이네요.
Dart는 Null Safety를 지원하여 **Null Pointer Exception(NPE)**을 방지하고 코드의 안정성을 높여줍니다. Null Safety는 변수가 null 값을 가질 수 있는지 여부를 컴파일 타임에 결정하여 개발자가 보다 안전한 코드를 작성할 수 있도록 돕습니다.
쉽게 보면 Null 이란 빈 곳을 의미합니다. dart 변수에 빈 값을 할당할 수 없는데 ?를 붙이면 가능하다는 얘기입니다.

Null Safety의 주요 개념

1. Nullable과 Non-nullable 타입

Dart에서는 기본적으로 모든 변수는 Non-nullable입니다. 즉, null 값을 할당할 수 없습니다.

String name = "Dart";
// name = null; // 오류 발생: Non-nullable 변수에 null을 할당할 수 없음

Nullable 타입을 사용하려면 변수 타입에 ?를 붙이면 됩니다.

String? nullableName;
nullableName = null; // 정상 동작

2. Null-aware 연산자

Dart에서는 null 값을 다룰 때 사용할 수 있는 다양한 Null-aware 연산자를 제공합니다.

(1) Null 체크 연산자 ! (Non-null Assertion)

! 연산자를 사용하면 변수가 반드시 null이 아님을 보장할 수 있습니다.

String? nullableText;
print(nullableText!.length); // 만약 null이면 런타임 오류 발생

⚠️ 주의: ! 연산자를 사용할 때, 해당 변수가 null이 아닐 것이라고 확신할 수 있어야 합니다.

(2) Null 병합 연산자 ??

변수가 null이면 기본값을 제공할 수 있습니다. name이 null 이지만 ?? 이용해서 다시 정의합니다.

String? name;
String displayName = name ?? "Guest";
print(displayName); // Guest

(3) Null-aware 호출 ?.

변수가 null이 아닐 때만 속성이나 메서드를 호출합니다.

String? text;
print(text?.length); // null (오류 발생 X)

3. Late 키워드

late 키워드는 변수를 나중에 초기화할 것을 선언하는데 사용됩니다.

late String description;
description = "Dart Null Safety";
print(description); // Dart Null Safety

late를 사용하면 초기화 전에 접근하면 오류 발생

4. Required 키워드

Dart에서는 생성자에서 필수적인 값이 필요한 경우 required 키워드를 사용하여 null을 방지할 수 있습니다.

class User {
  final String name;
  User({required this.name});
}

void main() {
  User user = User(name: "Alice"); // 정상 동작
  // User user = User(); // 오류 발생: name이 필수 파라미터
}

Null Safety의 장점

✅ 컴파일 타임에서 null 가능성을 체크하여 오류를 사전에 방지

✅ 불필요한 null 체크를 줄여 코드의 가독성을 향상

✅ 안전한 타입 시스템을 통해 앱의 안정성 증가

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다