반응형

Flutter2부터 도입된 NullSafety에 대해 알아보겠습니다.


Null 사용의 문제점

아무것도 없는 상태를 나타내는 null, 때로는 편하다고 말하는 사람이 있기도 합니다. 하지만 한번 사용하기 시작하면 여러 코드에서 null의 체크가 필요해지고 null로 인해 버그가 생기기 마련입니다.

보통 NullPointerException을 안 본 개발자는 없으리라 생각됩니다.

 

Null-aware 연산자

플러터(Dart) 에는 Null 처리를 고려할 수 있는 연산자가 준비되어 있습니다.

?. 연산자

객체의 null을 체크한 후 접근합니다.

var a = nullableObject?.MethodA();

// 위와 같은 처리
if(nullableObject != null) {
  a = nullableObject.MethodA();
}

 

?? 연산자

대입되는 변수가 null이 아닌 경우는 그 값을, null이면 우변의 값을 사용합니다.

a = nullableValue ?? '';

// 위와 같은처리
if(nullableValue != null ) {
  a = nullableValue
} else {
  a= '';
}

 

??= 연산자

변수가 null이 아닌 경우는 값을 할당하지 않고, null 인경우는 우변 값을 할당한다.

var a ??= 0;

// 위와 같은처리
a = a ?? 0;

NullSafety의 좋은 점

  1. 개발자에게 Null을 고려하지 않아도 되는 환경을 제공해 줍니다. Null은 일반적으로 예외적으로 발생합니다. 이 예외처리를 핸들링하는 것은 개발자에게 큰 부담이 됩니다.
  2. 컴파일러가 최적화할 수 있기 때문에 성능이 향상됩니다. Null의 가능성이 있다는 것은 Null이 왔을 때 프로그램은 대처할 준비가 되어있어야 합니다. 하지만 null이 절대 오지 않는다고 전제하면 처리를 최적화할 수 있게 됩니다.

 

NullSafety 샘플 코드를 살펴보겠습니다.

class NullSafetyClass {
  void testNull() {
    int nonNullableNumber = 10; // null 가능성 없음
    int? nullableNumber = getNumberOrNull(); // null 가능성이 존재
   
    //nonNullableNumber = nullableNumber; // 컴파일에러
    nullableNumber = nonNullableNumber; // 컴파일 가능
    if (y != null) {
      nonNullableNumber = nonNullableNumber; //널 체크를 했을시에는 컴파일 가능
    }
  }
  //랜덤으로 널 혹은 넘버를 리턴해주는 메소드
   getNumberOrNull() {
    var randomNumber = new math.Random();
    if (randomNumber.nextInt(2) == 0) {
      return null;
    }
    return randomNumber;
  }
}

nonNullableNumber는 int, nullableNumber는 int 혹은 null이 가능하기 때문에, nullableNumber = nonNullableNumber는 컴파일이 가능하지만 그 반대는 불가능합니다. 하지만 null 체크를 하고 나면 null 이 될 가능성이 사라짐으로  nonNullableNumber = nullableNumber 가 가능해집니다.

 


여기까지 읽어주셔서 감사합니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기