일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 다트 책
- 프로그래머스
- 플러터 책
- dfs
- 포?코DX
- 플러터
- flutter
- 크레인 인형뽑기
- 코딩 잘하고 싶어!!
- 댓글이 하나도 없오...ㅠㅠ
- network
- 주니어개발자
- flutter secure storage
- 편하다요
- bloc
- hero animation
- Null Safety
- Flutter2.8
- TODO
- flutter-layout
- flutter_local_notification
- 다트&플러터
- open weather api
- 주변에는 능력자 뿐이야!!
- 이직
- 누가 보기는 하는걸까...ㅠㅠ
- FutureBuilder
- flutter_secure_storage
- 쒸익!!!!!!!!!
- 나도 코딩 잘할래!!!!!!!!!!!
- Today
- Total
오늘하루도 우힣ㅎ
Flutter) Null Safety 본문
Flutter가 버전 2.0이 발표 된이후 가장 큰 변경점중 하나가 Null safety라고 생각합니다.. Swift에서 옵셔널의 기능과 비슷하다고 생각하면 될거 같습니다. 처음에 해당 기능을 사용 할때는 헷갈리기도 했고, 초기에 항상 값을 하나 정해주면 굳이 필요할 기능일까 라는 생각도 했지만 사용에 익숙해지고 나서는 없어서는 안될 기능이 된거 같습니다.
Null Safety
잘못 보면 Null을 아예 없애는 코딩을 해야 한다라고 보일수도 있습니다. 그런 의미는 아니고 개발중 런타임에 null을 참조 했다는 에러를 한번쯤은 봤을 거라고 생각합니다. 이때문에 개발에 대한 속도가 늦춰지는 경우고 있습니다. 이와 같은 상황을 피해가기 위해서 Null Safety가 도입이 됐습니다. Null Safety는 컴파일러가 미리 Null 관련 문제를 체크하고 개발자들이 인지 하도록 해주어 코드 작성 과정에서 해당 문제를 해결하도록 해주는 것입니다. 다시 말해 런타임 과정에서 Null pointer exception이 발생 했을때 해당 코드로 돌아가 어떤 부분이 잘못 됐는지 찾아 수정하는 대신 코드 작성 과정에서 미리 알려주어 런타임에서 Null pointer exception이 발생하지 않도록 하는 것입니다.
위의 사진 처럼 null safety가 적용된 버전의 경우 Non-nullable 인스턴스의 경우 반드시 초기화 되어서 사용 되어져야 함을 알려주게 됩니다.
Nullable 과 Non-nullable
nullable 타입은 자료형 다음에?를 붙인 형태로 말 그대로 null 값을 가질수 있는 자료형을 의미하게 됩니다. 이는 변수 선언시 반드시 초기화를 해주지 않아도 되게 됩니다.
반면에 Non-nullable의 경우 일반적으로 변수를 선언 하던 형태와 동일하게 사용을 하게 되는데 이때는 선언과 동시에 반드시 초기화를 해주어야 합니다. 만약 해주지 않을 경우 아래의 사진과 같이 컴파일러가 Non-nullable 인스턴스의 경우 반드시 초기화 되어서 사용 되어져야 함을 알려주게 됩니다. 즉 이 둘을 통해서 null 값을 해당 변수에 넣어 사용을 할수 있게 만드느냐 없느냐를 판단해주는 기준이 되게 됩니다.
예시1)
int nonNullable; //컴파일러에서 초기화가 되야 한다고 알려줌.
int? nullalbe;
print(nonNullable);
print(nullalbe);
만약 위와 같이 코드를 작성하고 실행을 하게 되면 nonNullable 밸류를 사용하기 전에 반드시 등록이 먼저 되어야 한다고 에러를 뱉어내게 됩니다.
예시2)
int nonNullable=10;
int? nullalbe=10;
print(nonNullable);
print(nullalbe);
해당 코드의 경우 전혀 문제가 없는 코드이며 콘솔창에도 두번의 10이 아무 문제 없이 찍히게 됩니다.
예시3)
int nonNullable=10;
int? nullalbe=10;
nonNullable=null;//null 타입이 int타입에 등록이 될 수 없다 알려줌.
nullable=null;
print(nonNullable);
print(nullalbe);
해당 코드의 경우 nonNullable값에 null 값을 넣으려 했을때를 보여줍니다. 컴파일러는 단호하게 Non-nullable 타입에는 null을 넣을수 없다고 에러를 뱉어내게 됩니다. 이때 flutter 버전이 1.x.x 였을때는 분며 null 값을 넣어 주더라도 아무 문제가 없었는데 어떤 변화로 null을 아예 넣지조차 못하게 하는지 궁금하실수도 있습니다.
이는 Null-safety 적용 이전의 경우 모든 자료형은 null의 부모 클래스 였습니다. 그렇기 때문에 null은 어떤 데이터 타입에도 속할수가 있었습니다. 하지만 적용 이후 null은 완전히 자료형으로 부터 독립이 되게 됩니다. 대신에 Non-nullalble, nullable 이 두개의 새로운 타입이 새로 생기면서 null을 가질수 있는 자료형과 가질수 없는 자료형이 구분이 되게 된것입니다. 이와 관련된 자세한 설명은 아래의 링크에 남겨 두겠습니다.
예시4)
int nonNullable=10;
int? nullalbe=10;
nonNullable = nullable;//int? 타입은 int타입에 등록이 될수 없다고 알려줌.
nullable = nonNullable;
print(nonNullable);
print(nullalbe);
해당 예시를 통하여 nullable과 Non-nullable은 완전히 다른 타입임을 확인 할수 있다. 하지만 신기하게도 nullable에는 nonNullable값을 넣을수가 있다. 이는 nullable의 경우 Non-nullable과 null의 상위 클래스 처럼 사용이 되고 있음을 알수 있게 해줍니다.
Null Safety Operator
! : null check operator
이것은 해당 값이 null값인지 아닌지를 판단하게 해줍니다. 이는 해당 값을 null이 아님을 보장 해주는 수단으로 사용하여 nullable 값을 Non-nullable값에 집어 넣을수도 있습니다.
int? nullalbe=10;
print(nullable); //10
print(nullable!); //10
nullable=null;
print(nullable); //null
print(nullable!); //run time error
위의 예제 처럼 null 값에 !사용하게 되면 에러를 출력하게 됩니다. 특이한점은 !오퍼레이터는 컴파일러가 에러를 잡아내지 못하고 런타임시에 에러가 발생시키는 것입니다.
int nonNullable=10;
int? nullable=2;
print(nonNullable);//10
print(nullable);//2
nonNullable = nullable!;
print(nonNullable);//2
nonNullable = nullable;//int?는 int에 등록 될수 없을을 알려준다.
위의 예제는 Non-nullable의 변수에 nullable 값을 대입 하는 방법을 보여주고 있습니다. !를 통하여 null이 아님을 보장하여 주기때문에 대입이 가능하게 되는 것입니다. 하지만 null에 !을 사요하였다면 위와 같이 run time에서 error가 뜨게 됩니다.
? : null aware operator
해당 오퍼랜드가 null 값이 아니게 되면 해당 오퍼랜드의 값을 사용하고 그것이 아니라면 null을 반환 하게 되는 연산자입니다.
late 키워드
late 키워드의 경우 Non-nullable의 값을 선언과 동시에 초기화 하고 싶지 않을때 사용하게 됩니다.
int nonNullable; //초기화가 이루어 져야한다것을 컴파일러가 보여줌
late int nonNullableWithLate;//어떠한 에러 없이 넘어가게 됩니다.
print(nonNullableWithLate);//런타임 에러
nonNullableWithLate = 100;
print(nonNullableWithLate);//100
여전히 변수가 초기화 되기전 해당 변수를 사용하게 되면 런타임 에러를 출력하게 되지만, 추후에 Non-nullable 타입 변수에 값을 부여한 후 접근이 가능함을 볼수 있습니다.
이로써 Null-safety에 대한 포스팅을 마치겠습니다. 많이 부족한 글이지만 읽어 주신분들 모두 감사합니다.
*코드 연습(DartPad)
https://dartpad.cn/?null_safety=true
*참고 블로그
'flutter > Etc' 카테고리의 다른 글
[Flutter] Flutter 2.8 릴리즈 노트 (0) | 2021.12.18 |
---|---|
flutter의 기본 레이아웃(Column, Row) (0) | 2021.04.01 |
책 후기) 모바일 앱 개발을 위한 다트&플러터 (0) | 2020.11.22 |
Flutter) FlutterSecureStorage를 이용한 자동 로그인 구현 (3) | 2020.10.19 |
Flutter) Hero Animation이용하여 앱을 풍부하게 하기 (0) | 2020.09.09 |