본문 바로가기
Dart, Flutter for App

Dart - Null Safety | null 안전성

by Oliver J 2023. 12. 5.
반응형
반응형

Dart 언어의 null 안전성은 코드의 안정성을 높이고 프로그램에서 예상치 않은 예외를 방지하는 데 도움이 됩니다.

 

아래의 코드는 null 안전성을 보여주는 예제입니다.

class Person {
  String? name;
  int age;

  Person({this.name, required this.age});
}

void main() {
  final person = Person(age: 25);

  if (person.name != null) {
    print("안녕하세요, ${person.name}님!");
  } else {
    print("이름이 없어요~");
  }
}

 

위의 코드는 Person객체에서 name 변수를 String? 타입으로 선언하고, 초기값을 null로 설정합니다. 변수 타입선언에 ? 를 사용하면 해당 변수에는 문자열 또는 null 이 모두 할당될 수 있음을 나타냅니다. 그리고 if문을 사용하여 null 안전성을 사용하면 변수에 널 값을 할당하는 실수를 방지할 수 있습니다.

 

if (person.name != null) {
    print("안녕하세요, ${person!.name}님!");
  } else {
    print("이름이 없어요~");
  }

만약 해당 인스턴스나 변수에 대하여 !를 붙이게 될 경우, 해당 인스턴스나 변수가 null이 아니라는 확정을 해 주게 됩니다. 따라서 위와 같이 if 문으로 null 을 확인하지 않을 경우, null 안전성에 대해서 위험한 상황이 올 수 있습니다. 이는 런타임 에러가 발생할 가능성이 생기며, 프로그램이 복잡해질수록 디버깅이 더욱 어려워지는 결과를 초래할 수 있습니다. 아래는 위의 코드 실행 결과로 null 관련 경고를 출력합니다. 

Warning: Operand of null-aware operation '!' has type 'Person' which excludes null.
 - 'Person' is from 'package:nullable_practice.dart' ('lib/nullable_practice.dart').
    print("안녕하세요, ${person!.name}님!");

 

 

혹시 모를 null에 대한 한 가지 대비책으로서 ?? 연산자가 있습니다. 아래의 코드를 해석해 보자면, 만약 person.name의 값이 null 일 경우에는 바로 뒤의 ‘테스터’ 라는 값을 할당하라는 의미입니다.

person.name = person.name ?? '테스터';
print(person.name);

 

또 다른 대비책으로서는 ? 연산자를 사용하는 방법으로서, 아래와 같이 button이 null 이 아닐 경우에 button.text 에 값을 'Confirm'을 할당하도록 하여 null 안전성을 높일 수 있습니다.

var button = querySelector('#confirm');
button?.text = 'Confirm';

 

728x90
반응형