[flutter]Null-Safety

Hdev·2023년 6월 25일
0

flutter

목록 보기
1/2

🥚 null Safety란?

객체가 Null인 상태에서 발생할 수 있는 에러를 runtime이 아닌 edit-time에 발생시키겠다는 의미로, 컴파일러가 NPE(Null Pointer Execption)이 발생할 수 있는 가능성을 미리 체크해 NPE가 발생할 수 없는 코드를 작성하도록 한다.

🥚 Nullable / Non-Nullable

Null Safety의 기본은 Nullable과 Non-Nullable의 구분!

  • Null Safety는 기본적으로 변수 선언시 Nullable 과 Non-Nullable 로 구분되어 선언한다.
  • 컴파일러에게 이 변수에 null 이 대입이 될수 있는지 될수 없는지를 명확하게 알려 주어야 한다.
  • 컴파일러가 알아서 Non-Nullable 변수에 null 이 대입되는 상황의 에러를 발생시켜 주거나, Nullable 변수를 NPE 를 고려하지 않고 작성하는 상황에 에러를 발생시킨다.
  • Dart 언어의 변수는 기본이 Non-Nullable 로 선언되는 것이며 만악 Nullable 로 선언하고자 한다면 타입명 뒤에 ? 를 추가한다.

🥚 ?

  • Nullable 선언은 타입명 뒤에 ?를 추가하여 작성한다.
  • Null을 사용해도 된다는 의미이다.
int a1=10; //Non-Nullable
int? a2=10; //Nullable

testFun() {

  a1=null;//error

  a2=null;

}
  • Non-Nullable은 선언과 동시에 초기값 주어야한다.
int a1;//error

int? a2;

🥚 var과 dynamic

var
Dart에서 var은 타입유추이므로 대입되는 값에 의해 타입이 결정된다. Nullable과 Non-Nullable도 자동 유추가 가능함 즉 var 타입에는 ?추가가 불가능하다.

dynamic
dynamic 타입은 모든 타입의 데이터가 대입될 수 있다는 의미로 Nullable도 마찬가지이다. dynamic타입에서 ?가 추가되는 것은 의미가 없다.

🥚 casting Test

Nullable이 Non-Nullable로 선언된 변수에 대입이 가능한지 그 반대는 가능한지에 대한 문제는 타입적으로 Nullable 변수는 Non-Nullable 변수의 상위 타입이다. 즉 int? 타입이 int 타입의 상위 타입이 되므로 명시적 캐스팅을 해줘야 한다.
Dart 에서 명시적 캐스팅 연산자는 as 이다

int a1=10;
int? a2=10;

main() {
  a1=a2;//error
  a2=a1;//ok
}
int a1=10;
int? a2=20;

main() {
  a1=a2 as int;//ok
  print("a1: $a1, a2: $a2");//a1: 20, a2: 20

}

🥚 !

  • ?는 null을 사용해도 된다는 의미라면, !는 이것이 절대 null이 아니라고 전달하는 명령이다.
  • 널이 허용되는 변수에 대해 개발자가 "이 부분에서는 널이 아니니까 걱정하지마~!" 라고 하는 이야기와 같다.

태마 선언과 사용

theme: ThemeData(
        textTheme: const TextTheme(
          displayLarge: TextStyle(
            color: Color(0xFF232B55),
          ),
        ),
      ),
heme.of(context).textTheme.displayLarge.color, //error
heme.of(context).textTheme.displayLarge!.color, 

displayLarge는 nullable이고 null인경우 Color를 사용할 수 없다는 오류가 나온다 >
사용시 displayLarge는 null값이면 안되므로 dart에게 null값이 아닌 것을 전달해야 오류가 발생하지 않는다.

profile
It'll be better then yesterday

0개의 댓글