널 안정성 소개
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가 제공하는 연산자들에 대해 배우게 됩니다.
챌린지
쉬움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()를 호출하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.