Menu
Coddy logo textTech

널 안정성 소개

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 23번째.

프로그래밍에서 가장 흔한 버그 발생 원인 중 하나는 존재하지 않는 값을 사용하려고 시도하는 것입니다. Dart에서, 이 특별한 "값의 부재"는 null로 표현됩니다. Dart의 null safety 기능은 코드가 실행되기도 전에 이러한 오류를 잡을 수 있도록 도와줍니다.

널 안정성(null safety)이 없으면, 모든 변수는 잠재적으로 null이 될 수 있으며, 이를 사용하려고 할 때 런타임 충돌이 발생할 수 있습니다:

// 이전 버전의 Dart (널 안정성 없음)
String name;  // null일 수 있음!
print(name.length);  // name이 null인 경우 충돌 발생

널 안정성(null safety)이 활성화되면 (Dart 2.12+), 컴파일러는 null을 가질 수 있는 변수와 그렇지 않은 변수를 구분합니다. 기본적으로 변수는 null을 허용하지 않으며(non-nullable) - 항상 유효한 값을 포함해야 합니다:

String name = 'Alice';  // 반드시 값이 있어야 함
print(name.length);     // 안전함 - name은 절대 null이 아님

컴파일러는 null을 허용하지 않는(non-nullable) 변수가 null일 가능성이 있는 코드의 컴파일을 거부합니다. 이는 오류 감지 시점을 런타임에서 컴파일 타임으로 옮겨주어, 프로그램을 더 신뢰할 수 있게 만듭니다. 이어지는 레슨에서는 실제로 null이 필요한 경우 nullable 타입을 선언하는 방법과, 잠재적인 null 값을 안전하게 처리하기 위해 Dart가 제공하는 연산자들에 대해 배우게 됩니다.

challenge icon

챌린지

쉬움

null이 불가능한(non-nullable) 변수의 중요성을 보여주는 간단한 연락처 카드 시스템을 만들어 보겠습니다. 모든 연락처가 유효하고 보장된 정보를 가져야 하는 시스템을 만들게 됩니다.

코드를 두 개의 파일로 구성합니다:

  • contact.dart: 사람의 연락처 정보를 나타내는 Contact 클래스를 정의합니다. null 안정성(null safety)을 사용하고 있으므로, 모든 필드는 유효한 값을 가져야 하며 누락된 데이터는 허용되지 않습니다! 클래스에는 다음이 포함되어야 합니다:
    • 연락처의 성을 위한 String firstName
    • 연락처의 이름을 위한 String lastName
    • 연락처의 이메일 주소를 위한 String email
    • 전화번호의 자릿수를 위한 int phoneDigits
    • 네 가지 값을 모두 받는 생성자
    • 성과 이름 사이에 공백을 넣어 결합하여 반환하는 게터(getter) fullName
    • 연락처 정보를 출력하는 displayCard() 메서드
  • main.dart: 연락처 클래스를 가져와서 모든 필드에 값이 보장됨을 보여주는 두 개의 연락처를 생성합니다:
    • 이름 'Emma', 성 'Wilson', 이메일 'emma@mail.com', 전화번호 자릿수 10인 연락처를 생성합니다.
    • 이름 'James', 성 'Brown', 이메일 'james@work.com', 전화번호 자릿수 11인 연락처를 생성합니다.
    • 위에 나열된 순서대로 각 연락처에 대해 displayCard()를 호출합니다.

displayCard() 메서드는 다음 형식으로 정확하게 출력해야 합니다:

--- Contact Card ---
Name: [fullName]
Email: [email]
Phone digits: [phoneDigits]

모든 변수가 실제 값으로 초기화되어야 하는 방식에 주목하세요. 이것이 바로 null 안정성이 작동하는 모습입니다! 컴파일러는 fullName, email 또는 다른 필드에 액세스할 때 항상 유효한 데이터가 포함되어 있음을 보장합니다.

예상 출력:

--- Contact Card ---
Name: Emma Wilson
Email: emma@mail.com
Phone digits: 10
--- Contact Card ---
Name: James Brown
Email: james@work.com
Phone digits: 11

치트 시트

Dart는 존재하지 않는 값을 사용하여 발생하는 버그를 방지하기 위해 널 안정성(null safety)을 사용합니다. 특별한 값인 null은 값이 없음을 나타냅니다.

널 안정성이 활성화된 경우(Dart 2.12+), 변수는 기본적으로 null을 허용하지 않으며(non-nullable), 항상 유효한 값을 포함해야 합니다:

String name = 'Alice';  // 반드시 값을 가져야 함
print(name.length);     // 안전함 - name은 절대 null이 아님

컴파일러는 null을 허용하지 않는 변수가 null일 가능성이 있는 경우 코드 컴파일을 방지하여, 오류 탐지 시점을 런타임에서 컴파일 타임으로 옮깁니다.

직접 해보기

import 'contact.dart';

void main() {
  // TODO: 다음 정보를 사용하여 첫 번째 연락처를 생성하세요:
  // - 이름(first name): 'Emma'
  // - 성(last name): 'Wilson'
  // - 이메일: 'emma@mail.com'
  // - 전화번호 자릿수: 10

  // TODO: 다음 정보를 사용하여 두 번째 연락처를 생성하세요:
  // - 이름(first name): 'James'
  // - 성(last name): 'Brown'
  // - 이메일: 'james@work.com'
  // - 전화번호 자릿수: 11

  // TODO: 각 연락처에 대해 순서대로 displayCard()를 호출하세요
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨