Menu
Coddy logo textTech

널 인식 연산자

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

?.! 외에도, Dart는 null 허용 값을 더 간결하게 다룰 수 있도록 하는 추가 연산자들을 제공합니다. 이러한 null 인식 연산자는 잠재적인 null 값을 처리할 때 더 깔끔한 코드를 작성하는 데 도움이 됩니다.

널 병합 연산자 ??는 왼쪽 값이 null이 아니면 왼쪽 값을 반환하고, 그렇지 않으면 오른쪽 값을 반환합니다:

String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName);  // Guest

nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName);  // Alex

null 인식 할당 연산자 ??=는 변수가 현재 null인 경우에만 값을 할당합니다:

String? username;
username ??= 'Anonymous';
print(username);  // Anonymous

username ??= 'NewName';
print(username);  // 여전히 Anonymous (null이 아니었음)

중첩된 속성에 대해 null-aware access 연산자 ?.를 연쇄적으로 사용할 수 있습니다:

String? city = user?.address?.city;  // user나 address가 null인 경우에도 안전합니다

이 연산자들은 서로 잘 조합됩니다. 예를 들어, null 허용 속성에 접근하면서 기본값을 제공할 수 있습니다:

String greeting = user?.name ?? 'Stranger';
// user가 null이거나 user.name이 null인 경우, 'Stranger'를 사용합니다

이러한 연산자를 사용하면 프로그램 전반에 걸쳐 null 안전성을 유지하면서 코드의 가독성을 유지할 수 있습니다.

challenge icon

챌린지

쉬움

선택적 정보를 처리할 때 null-aware 연산자가 코드를 얼마나 깔끔하게 만들어 주는지 보여주는 게스트 등록 시스템을 만들어 보겠습니다.

코드는 두 개의 파일로 구성됩니다:

  • guest.dart: 이벤트에 참석하는 사람을 나타내는 Guest 클래스를 정의합니다. 어떤 게스트는 상세 정보를 제공하지만, 어떤 게스트는 기본 정보만 제공합니다. 클래스에는 다음이 포함되어야 합니다:
    • null을 허용하지 않는 String name - 모든 게스트는 반드시 이름을 가져야 합니다.
    • null을 허용하는 String? email - 모든 사람이 이메일을 제공하는 것은 아닙니다.
    • null을 허용하는 String? dietaryPreference - 일부 게스트는 식단 요구 사항을 지정하지 않습니다.
    • name을 필수 매개변수로 받는 생성자
    • ?? 연산자를 사용하여 이메일이 있으면 이메일을 반환하고, 없으면 'No email provided'를 반환하는 getDisplayEmail() 메서드
    • ??= 연산자를 사용하여 dietaryPreference가 현재 null인 경우에만 'Standard'로 설정하는 assignDefaultDiet() 메서드
    • ?.를 사용하여 이메일의 길이를 반환하거나, 이메일이 없으면 null을 반환하는 getEmailDomain() 메서드
    • 게스트의 배지 정보를 출력하는 printBadge() 메서드
  • main.dart: 게스트 클래스를 가져와서 서로 다른 수준의 정보를 가진 세 명의 게스트를 등록합니다:
    • 이름이 'Alice'인 게스트를 생성하고, 이메일을 'alice@company.com'으로, 식단 선호도를 'Vegetarian'으로 설정합니다.
    • 이름이 'Bob'인 게스트를 생성하고, 이메일만 'bob@email.org'로 설정합니다 (식단 선호도는 null로 둡니다).
    • 이름이 'Charlie'인 게스트를 생성합니다 (이메일과 식단 선호도 모두 null로 둡니다).
    • 세 명의 게스트 모두에게 assignDefaultDiet()를 호출합니다.
    • 각 게스트에 대해 순서대로 printBadge()를 호출한 다음, getEmailDomain()을 사용하여 Email length: [result]를 출력합니다.

printBadge() 메서드는 다음 형식으로 출력해야 합니다:

=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]

??=는 값이 null일 때만 할당하기 때문에 Alice의 식단 선호도는 'Vegetarian'으로 유지되는 반면, Bob과 Charlie는 기본값인 'Standard' 식단이 할당되는 것을 확인해 보세요.

예상 출력 결과:

=== Guest Badge ===
Name: Alice
Email: alice@company.com
Diet: Vegetarian
Email length: 17
=== Guest Badge ===
Name: Bob
Email: bob@email.org
Diet: Standard
Email length: 13
=== Guest Badge ===
Name: Charlie
Email: No email provided
Diet: Standard
Email length: null

치트 시트

Dart는 nullable 값을 더 간결하게 처리할 수 있도록 null 인식 연산자(null-aware operators)를 제공합니다.

null 병합 연산자(null-coalescing operator) ??는 왼쪽 값이 null이 아니면 왼쪽 값을 반환하고, 그렇지 않으면 오른쪽 값을 반환합니다:

String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName);  // Guest

nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName);  // Alex

null 인식 할당 연산자(null-aware assignment operator) ??=는 변수가 현재 null인 경우에만 값을 할당합니다:

String? username;
username ??= 'Anonymous';
print(username);  // Anonymous

username ??= 'NewName';
print(username);  // Still Anonymous (wasn't null)

중첩된 속성에 대해 null 인식 액세스 연산자 ?.를 체이닝할 수 있습니다:

String? city = user?.address?.city;  // user나 address가 null이어도 안전함

이 연산자들은 함께 조합하여 사용할 수 있습니다:

String greeting = user?.name ?? 'Stranger';
// user가 null이거나 user.name이 null이면 'Stranger'를 사용함

직접 해보기

import 'guest.dart';

void main() {
  // TODO: 'Alice'라는 이름의 게스트를 생성하세요
  // 이메일을 'alice@company.com'으로 설정하세요
  // 식단 선호도를 'Vegetarian'으로 설정하세요

  // TODO: 'Bob'이라는 이름의 게스트를 생성하세요
  // 이메일만 'bob@email.org'로 설정하세요
  // 식단 선호도는 null로 남겨두세요

  // TODO: 'Charlie'라는 이름의 게스트를 생성하세요
  // 이메일과 식단 선호도 모두 null로 남겨두세요

  // TODO: 세 명의 게스트 모두에게 assignDefaultDiet()를 호출하세요

  // TODO: 각 게스트에 대해 순서대로 ('Alice', 'Bob', 'Charlie'):
  // - printBadge()를 호출하세요
  // - getEmailDomain()을 사용하여 'Email length: [result]'를 출력하세요
}
quiz icon실력 점검

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

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