본문 바로가기
Flutter

[Flutter 12] Dart Null Safety

by JINJINC 2025. 1. 6.
728x90
반응형

널 세이프티(Null Safety)는 개발자가 널 에러를 피할 수 있도록 도와주는 다트 프로그래밍 언어의 기능입니다.

이 기능은 사운드 널 세이프티 인 다트(Sound Null Safety in dart)라고 불리며, 이를 통해 개발자는 코드 작성 시점에 널 에러를 잡을 수 있습니다.

1. Null Safety란?

  • Null Safety는 Dart 언어의 기능으로, null로 인해 발생할 수 있는 오류를 방지합니다.
  • Sound Null Safety:
    • Dart 컴파일러가 코드 분석 시, null이 될 수 있는 타입과 null이 될 수 없는 타입을 엄격하게 구분합니다.
    • 컴파일 단계에서 null 관련 에러를 확인하므로 런타임 중 발생할 수 있는 Null Pointer Exception을 예방합니다.

Sound Null Safety in dart 이란 (Sound Type System)

런타임 중에 null 포인터 예외를 방지하기 위해 Dart 컴파일러가 코드를 분석하고 컴파일할 때 타입 시스템에서 엄격한 규칙을 적용하는 것을 의미합니다.

정리하면, Dart 컴파일러가 코드를 분석하고, null이 될 수 있는 타입과 null이 될 수 없는 타입을 분명히 구분해 주기 때문에, 우리가 실수로 null을 넣거나 반환하게 되면 빌드(컴파일) 시점에 오류를 발견할 수 있습니다.

이를 사운드 널 세이프티(Sound

런타임 중에 null 포인터 예외를 방지하기 위해 Dart 컴파일러가 코드를 분석하고 컴파일할 때 타입 시스템에서 엄격한 규칙을 적용하는 것을 의미합니다.

정리하면, Dart 컴파일러가 코드를 분석하고, null이 될 수 있는 타입과 null이 될 수 없는 타입을 분명히 구분해 주기 때문에, 우리가 실수로 null을 넣거나 반환하게 되면 빌드(컴파일) 시점에 오류를 발견할 수 있습니다.

이를 사운드 널 세이프티(Sound Null Safety)라고 하며, 런타임에서의 null 참조 에러 를 효과적으로 예방해줍니다.

 

2. 옵셔널 타입(Optional Type)

Dart에서는 null을 허용하는 타입과 허용하지 않는 타입을 명확히 구분합니다.

  • Null 허용 타입: String?, int?, 등.
    • ?를 붙여 해당 변수에 null을 할당할 수 있도록 표시합니다.
  • Null 비허용 타입: String, int, 등.
    • null 할당 불가.
?  옵셔널 타입 
String?  =>  String 옵셔널 타입은  String과 다름 null 허용됨
int, 등등 다른 데이터타입들또한 옵셔널 타입으로 사용할 수 있다. 

 

void main() {
  String name = '길동'; // null 불가
  int age = 30; // null 불가
  
  String? nullableName; // null 허용
  int? nullableAge; // null 허용

  print('name: ${name}');
  print('age: ${age}');
  print('nullableAge: ${nullableAge}'); // null 출력
}
//Null Safety 란?
// 개발자가 널 에러를 피할 수 있도록 도와주는 다트 언어에 기능이다.

//코드의 시작점
void main() {
  String name = '길동';
  int age = 30;

  //String? 스트링 옵셔널 타입이다. => 스트링 타입이랑 다음
  //옵셔널 타입은 null값 허용가능
  String? nullableName;
  int? nullableAge;

  print('name : ${name}');
  print('age : ${age}');
  //print('nullableName : ${nullableName.length}'); 컴파일 시점에 오류를 미리 확인할 수 있다.
  print('nullableAge : ${nullableAge}');

  //방어적 코드
  if (nullableName != null) {
    print(nullableName.length);
  }
} //end of main

 

자바와 다르게. 컴파일 시점에 오류가 먼저 확인되어지고, 자바에서 tryCatch나 방어적 코드 사용할 필요없이 ? 의 옵셔널을 사용하여 널을 안전하게 관리할 수 있음

 

4. Null 관련 주요 연산자

Dart에서는 null을 안전하게 다루기 위해 다음과 같은 연산자를 제공합니다.

4.1. 널 체크 연산자 (?.)

  • 용도: 객체가 null인지 확인하고, null이 아닐 경우에만 프로퍼티나 메서드에 접근
  • 예시
String? userName = null;
int? userNameLength = userName?.length; // null 체크 후 접근
print('사용자 이름 길이: ${userNameLength}'); // 출력: null

 

4.2. 널 병합 연산자 (??)

  • 용도: 값이 null일 경우, 기본 값을 제공.
  • 예시:
String? userName = null;
String finalUserName = userName ?? '홍길동'; // 기본값 '홍길동'
print('사용자 이름: ${finalUserName}'); // 출력: 홍길동

 

4.3. 널 체크와 병합 연산자 함께 사용

  • 용도: null 여부 확인 후, 기본 값을 설정.
  • 예시:
String? userName = null;
String upperOrNoName = userName?.toUpperCase() ?? 'No Name';
print('결과: ${upperOrNoName}'); // 출력: No Name

 

optional을 값을 가진 값의 ?. 로 객체에 접근할 경우, null 값이여도 문제없이 컴파일 에러에서 벗어날 수 벗어날 수 있음

?? 으로 해당 값이 null인 경우, default value값을 지정해서 넣을 수 있다. 

//널 체크 연산자 (?.) 와 널병합연산자(??) 에 대해서 알아보자

//코드의 시작점
void main() {
  //1. 널 체크 연산자
  String? userName = getNullableUserName();
  int? userNameLength = userName?.length; // null체크 연산자

  print('사용자 이름의 길이 : ${userNameLength}');
  print('0---------------------');

  //2. 널 병합 연산자
  String finalUserName = userName ?? '홍길동';
  // userName의 값이  null인 경우, ?? 이후의 값을 default로 초기화됨
  print('사용자 finalUserName : ${finalUserName}');
  print('----------------------');

  //3. ?. 와 ??를 함께 사용하는 예시
  String upperOrNoName = userName?.toUpperCase() ?? 'upper';
  print('?. 와 ?? 를 함께 사용  : ${upperOrNoName}');
} //end of main

//함수를 만들기
//선택적 명명 매개변수
String? getNullableUserName({String? name}) {
  return name;
}

 

6. Java와의 차이점

  • Java에서는 null 에러를 방지하기 위해 try-catch 또는 방어적 코드를 작성해야 하지만, Dart에서는 Null Safety를 통해 이러한 작업을 간소화할 수 있습니다.
  • 옵셔널 타입(?)과 null 관련 연산자를 사용해 null 문제를 컴파일 단계에서 해결 가능합니다.

정리

  • Null Safety는 Dart의 강력한 기능으로, 컴파일 단계에서 null 에러를 사전에 방지합니다.
  • 옵셔널 타입(?), 널 체크 연산자(?.), 널 병합 연산자(??) 등을 사용하면, null 처리를 간결하고 안전하게 구현할 수 있습니다.
  • Null Safety를 통해 런타임 에러를 줄이고 안정적인 애플리케이션을 개발할 수 있습니다.

이 글이 여러분의 Dart 개발에 도움이 되길 바랍니다! 😊

 
 
728x90
반응형

댓글