IMCAT.DEV
로그인 가입
Dart 입문 문법

Dart null 안전성

Dart null 안전성 — 초급

null 안전성

1. 도입 (왜 배워야 하는가)

Dart 언어는 Null Safety라는 기능을 제공하여, 프로그래머가 의도치 않게 발생할 수 있는 null 참조 오류를 예방할 수 있도록 돕습니다. null 참조 오류는 프로그램 실행 중 가장 흔하게 발생하는 오류 중 하나로, 이로 인해 애플리케이션이 갑자기 종료되거나 예기치 않은 동작을 할 수 있습니다.

예를 들어, 온라인 쇼핑몰에서 사용자가 장바구니에 상품을 추가할 때, 상품 정보가 null일 경우 이를 처리하지 않으면 결제 과정에서 오류가 발생할 수 있습니다. 이러한 문제를 예방하기 위해 null 안전성을 이해하고 활용하는 것이 중요합니다.

2. 핵심 개념 설명

null 안전성은 변수가 null 값을 가질 수 있는지 여부를 명확히 구분하는 기능입니다. Dart에서는 기본적으로 변수는 null을 허용하지 않으며, 이를 위해 다음과 같은 두 가지 개념이 있습니다.

용어설명
nullable typenull 값을 가질 수 있는 타입 (예: int?)
non-nullable typenull 값을 가질 수 없는 타입 (예: int)

비유

nullable type과 non-nullable type을 비유하자면, 집 열쇠의 유무와 같습니다. non-nullable type은 항상 열쇠가 있는 집에 사는 것과 같고, nullable type은 열쇠가 없을 수도 있는 집에 사는 것과 같습니다.

3. 기본 코드 예제

아래는 null 안전성을 사용하는 간단한 코드 예제입니다.

void main() {
  int? nullableNumber; // nullable type
  int nonNullableNumber = 10; // non-nullable type

  // nullableNumber에 null을 대입
  nullableNumber = null;

  // nonNullableNumber = null; // 이 코드는 오류 발생

  print(nullableNumber); // 출력: null
  print(nonNullableNumber); // 출력: 10
}

실행 결과:

null
10

동작 설명:

  1. int? nullableNumber;는 null 값을 가질 수 있는 변수입니다.
  2. int nonNullableNumber = 10;는 null 값을 가질 수 없는 변수입니다.
  3. nullableNumber에 null을 대입하였습니다.
  4. nonNullableNumber에 null을 대입하려고 하면 오류가 발생합니다.
  5. print(nullableNumber);는 null을 출력합니다.
  6. print(nonNullableNumber);는 10을 출력합니다.
  7. 4. 실전 활용 예제

    예제 1: 사용자 입력 처리

    쇼핑몰에서 사용자가 상품을 검색할 때, 입력값이 null인지 확인하고 처리하는 경우입니다.

    void searchProduct(String? productName) {
      if (productName == null || productName.isEmpty) {
        print("상품 이름을 입력하세요.");
        return;
      }
      print("$productName에 대한 검색 결과입니다.");
    }
    
    void main() {
      searchProduct(null); // 출력: 상품 이름을 입력하세요.
      searchProduct("사과"); // 출력: 사과에 대한 검색 결과입니다.
    }

    예제 2: 사용자 프로필

    사용자 프로필에서 이메일 주소가 null인지 확인하는 경우입니다.

    class User {
      String? email;
    
      User(this.email);
    }
    
    void main() {
      User user = User(null);
    
      if (user.email == null) {
        print("이메일이 등록되어 있지 않습니다.");
      } else {
        print("이메일: ${user.email}");
      }
    }

    5. 흔한 실수와 주의사항

    실수 1: null 체크를 소홀히 하기

    void printLength(String? text) {
      // null 체크 없이 length를 호출하면 오류 발생
      print(text.length); // 오류
    }

    올바른 코드:

    void printLength(String? text) {
      if (text != null) {
        print(text.length);
      } else {
        print("text가 null입니다.");
      }
    }

    실수 2: 타입 선언 실수

    String name; // non-nullable type, 초기화가 필요

    올바른 코드:

    String? name; // nullable type, null 허용

    6. 정리

    • null 안전성은 프로그래머가 null 참조 오류를 방지할 수 있도록 돕는 기능입니다.
    • nullable type과 non-nullable type의 개념을 이해하는 것이 중요합니다.
    • 실무에서는 사용자 입력 처리, 데이터베이스 쿼리 등에서 null 안전성이 필수적입니다.
    • 다음에 학습하면 좋은 주제는 Dart의 비동기 프로그래밍(Async/Await)입니다.