Never give up

Flutter 2.0 - Null safety에 대한 이해 본문

Flutter

Flutter 2.0 - Null safety에 대한 이해

대기만성 개발자 2021. 3. 6. 00:01
반응형

Null safety는 말 그대로 null값에 대한 안정성을 늘리기 위함입니다

 

유저가 실수로 체크하지 못한곳에서 발생하는 NullPointerException같은 에러를 조기에 방지하고

 

실제로 돌아가는 어셈블리상에서 null체크를 다시 안하기 때문에 성능적 이득도 있습니다

 

간단하게 요약해보자면

 

nullable : null값이 들어가는것을 허용 (ex: int?, String?, bool?)

non-nullable : null값이 들어가는것을 허용하지 않음 (ex: int, String, bool)

 

그럼먼저 간단한 매개변수부터 보겠습니다

class ExampleData{
  String title;
  Widget route;

  ExampleData({this.title, this.route});
}

우리에게 익숙했던 이 코드는 더이상 사용할 수 없습니다

 

대신 required를 사용하거나 null값이 들어갈 수 있다고 표시를 해주거나 default값을 줘야됩니다

//먼저 required를 사용하는 방법으로
class ExampleData{
  String title;
  Widget route;

  ExampleData({required this.title, required this.route});
  //@required가 아닌 required입니다
}

//Null값이 들어갈 수 있을 땐 ?를 붙여줍니다
class ExampleData{
  String? title;
  Widget? route;

  ExampleData({this.title, this.route});
}

//초기값 부여
class ExampleData{
  String title;
  Widget route;

  ExampleData({this.title = '', this.route = const Spacer()});
}

기존에 사용하던 @required는 우리가 import하는 material.dart 혹은 coupertino.dart에 있었던 속성이고

 

앞으로 사용할 required는 언어 수준에서 제공하는 속성입니다

 

개인적으로 조금 불편하게 바뀐거 같습니다

 

기존에 @required가 에러를 표시하지 않은건 문제가 되지만

 

굳이 value를 넣고싶지 않을 때에도 초기값을 정의해줘야되니 말이죠

 

예를들어 index값을 안넘겨도되는곳이 있고 꼭 넘겨야되는곳이 있는데

 

기본값을 줘서 처리를 하거나 null값이 들어갈 수 있다고 해놓으면

 

null체크를 한번 더 해야되니 말이죠

 

 

그 다음으로 확인해볼건 기존에 initState에 초기화 했었던 변수들입니다

class _CounterState extends State<Counter> {
  int counter;

  @override
  void initState() {
    super.initState();
    counter = 0;
  }

기존에는 다음과 같이 사용해도 전혀 문제가 없었습니다

 

하지만 이제부터는 late 속성을 사용하거나 null값이 들어갈 수 있다고 표시해줘야됩니다

//late속성 사용
class _CounterState extends State<Counter> {
  late int counter;

  @override
  void initState() {
    super.initState();
    counter = 0;
  }

//null값 사용
class _CounterState extends State<Counter> {
  int? counter;

  @override
  void initState() {
    super.initState();
    counter = 0;
  }

하지만 ?를 사용하게 되면 --같은 간단한 연산도 null체크를 해줘야됩니다

 

이런식으로요

counter = counter! - 1;

그래서 initState에서 초기화를 할때는 late를 사용해주는게 좋지 않을까 생각해봅니다

 

그리고 init에서 초기화를 해주는데 또 체크를 해준다면 낭비인거 같기도 하고요

 

여기서 !는 if(counter != null)과 동일한거 같은데

if(counter == null){
  return;
}

counter = counter - 1;

/*----------------------*/

if(counter != null){
  counter = counter - 1;
}

막상 이런식으로 써도 둘 다 빨간줄이 그이더군요

 

그래서 굳이 null체크를 한다면 변수 뒤에 !를 붙이는게 좋을거 같습니다

 

이 외에도 다른곳으로 ojbect를 넘길 때 null check를 요구하는 부분이 있는데

 

안드로이드 스튜디오를 사용하신다면 대부분 IDE에서 필요하다고 알려주니

 

보면서 차근차근 migration을 하시면 될거 같습니다

 

 

Ps. 현재 필자는 migration하다가 예제부터 해본다음에 시작해야겠다는 생각이 들었고,

현재 테스트 겸 이해한 부분을 만들어서 실행해보고 포스트 중입니다 화이팅!

< 화이팅! >

반응형
Comments