티스토리 뷰

목차



    반응형

    v

    플러터

    Null Safety 에 대한 이해

    변수에서 null이라 아무런 값이 없음을 나타 냅니다.

    이러한 변수의 null 값은 개발자로 하여금 개발중 예기치 않은 오류를 자주 발생시킵니다.

    이러한 예기치 않은 오류를 방지하기 위해 플러터에서는 플러터 2.0 부터 Null Safety 를 도입 했습니다.

    null safety는 말 그대로 Null로 부터 안전한 코드 작성 하게 하겠다는 뜻 입니다.

    Null safety 는 null이 발생할 만한 코드에 미리 에러를 표시해 줌으로써 Null이 발생하지 않도록 예외처리를 강제하고 있습니다.

     

    플러터가 도입한 Null safety의 주요 컨센은 nullable 과 non-nullable로 정의 할수 있습니다.

     

    nullable ( ? , ?? )

    nullable은 글과 같이 null이 될수 있다는 뜻으로 어떠한 변수든 코드 작성자의 의도대로 null을 할당 할수 있습니다.하지만 이렇게 null이 할당 하기 위해서는 변수 타입 선언시 '?' (물음표)를 붙여 줍니다.

    String? name;
    int?      age;

     

    위와같이 작성시 변수는 초기값을 할당 하지 않더라도 에러가 발생되지 않습니다.

     

    타입 뒤에 ?(물음표) 하나를 추가 하면 null 값을 저장 할수 있으며, null을 가질수 있는 변수에 새로운 값을 할당할 때 ??(물음표 두개)를 사용하면 사용하려는 변수가 null인 경우에만 값을 할당할수 있게끔 할수 있습니다.

    void main () {
      int ? age; 
      
      age ??= 10;  // ?? 표기법을 사용하면 age 변수가 null일 경우에만 10이 적용됨
      print(age);    // 10 출력

      age ??= 20;  // age 변수는 윗줄에서 값이 할당 되었기 때문에 해당 명령은 적용되지 않음
      print(age);    // 10 출력
    }
      

     

     

    non-nullable

    non-nullable 변수는 null 값이 들어갈 수 없는 변수 입니다.

    변수를 처음 생성할때 부터 초기값을 할당해야합니다.

    String name = "홍길동";
    int age = 999;

     

    Null Safety 도입으로 인한 생성자 변화

    class Human {
      
        String name;
        int      age;
        String? color;
        
        Human({ required this.name , required this.age, this.color });

    Null Safety 도입으로 인해 클래스의 생성자에서 non-nullable 변수에  값을 꼭 받아야하기때문에 required 라는 키워드를 붙여 주어야 합니다.

     

    ?를 사용한 nullable 변수는 해당 변수를 사용할때마다 null check를 항상 해주어야 합니다.(항상 null 이 아님을 증명해야하기 때문에 불편 할수 있음)

     

    코드로 항상 null  check가 불편할수 있어 이를 대체할 !(느낌표) 표기 법이 있습니다.

    ! 표기법은 해당 변수가 null 이 아니라면 주어진 연산을 수행하겠다는 조건문의 역할을 수행합니다.

    void main() {
      String? name;
       name = name! + "님";

        print(name);   //  name 은 null 값 상태로 Script 에러 발생함
    }

     

     

    late

    non-nullable 변수를 원하는 시점에 늦게 값을 할당 하기위한 late 키워드

    late 키워드는 변수 타입 앞에 붙여주며, 변수의 값 할당을 늦게 해줄수 있습니다.

    class Family extends State<Counter> {
      late int count;

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

     

    위코드를 보면 non-nullable 변수 앞에 late 키워드를 붙임으로써 해당 변수에 값을 바로 할당 하지 않았습니다.

    대신 초기화를 담당하는 initState() 함수에서 값을 할당 할수 있었습니다.

    이렇게 non-nullable  변수를 선언할때  변수에 값을 바로 할당 하지 않고, 개발자가 원하는 초기화 타이밍에 변수를 초기화 할수 있는 방법이 있는것을 확인할수 있습니다.

    반응형