[Flutter] 플러터 2.0 null-safety 이해하기

2021. 5. 1. 15:37·Flutter/Flutter Issue

플러터 2.0

지난 3월 플러터가 2.0으로 stable 업그레이드 되었습니다.

이전에도 beta, master 채널에서 2.0을 사용해볼 수 있었지만 stable 출시로 안정화가 된 버전을 사용할 수 있게 되었습니다.

 

가장 큰 변화는 플러터 웹의 정식 지원, window, mac, linux 응용 프로그램의 지원, null safety의 적용입니다.

플러터 웹과 응용 프로그램들이 정식으로 지원되지만 사실 실제 서비스를 할 수 있는 수준은 아닙니다.

단지 구글이 플러터를 웹을 당장에 포기하지 않겠다는 의지정도로만 생각하면 좋을 것 같습니다.

 

제가 근무하는 스타트업 Linogry에서 플러터 2.0 웹으로 사내 컨텐츠 툴을 개발해 활용하고 있습니다.

확실히 개발속도가 빠르고 플러터 앱에서 사용되던 모듈 코드를 그대로 가져다 쓸 수있어

다른 앱, 웹 동시 프로젝트를 할 때에도 플러터를 활용하게 될 것 같습니다.

또, Linogry 웹 버전도 출시 예정에 있는데, 아마도 플러터 웹으로 시도해볼 것 같습니다.

 

플러터 2.0에서 중요한 부분은 웹보다는 기존 프로젝트들과 큰 연관이 있는 null safety이므로,

플러터 웹에 관련된 내용은 다른 포스팅에서 다루겠습니다.

 

Null safety

null safety를 간단히 설명하면,

기존의 변수가 null 값 혹은 고유한 타입 값을 가질 수 있었다면

null safety에서는 nullable이라는 변수 타입이 추가되었고 기존의 변수 타입은 null 값을 가질 수 없도록 변경되었습니다.

 

사실 코딩을 할 때에는 조금 더 귀찮을 수 있지만 개발자의 실수를 크게 줄여줍니다.

기존 타입은 값이 비어있을 수 없으므로 값이 반드시 있어야하는 변수가 비어있는 경우를 방지해주고,

null이 정의될 경우 예외를 발생시켜 문제의 부분을 수정하기 쉽습니다.

 

또, 플러터 내부적으로 모든 타입의 변수의 값이 null인지를 검사하던 부분이

nullable 변수만 검사하게 변경되어 연산의 과정이 감소했고 결과적으로 플러터의 처리 속도가 많이 상승되었습니다.

(사실 일개 개발자는 못느낍니다...)

 

null을 가질 수 있는 변수와 값이 항상 있어야하는 변수를 잘 구분하는 것이 null safety에서의 코딩입니다.

 

Nullable

String 변수 타입을 예시로 들어보겠습니다.

 

null safety 이전
String _value;
print(_value);

String _value2 = 'flutter';
print(_value2);

//출력값
null
flutter

 

null safety
String _value; //null값을 가질 수 없다며 컴파일 불가능
print(_value);

기존의 변수 타입을 사용하면 null이 될 수 없으므로 컴파일이 진행되지 않습니다.

반드시 기존 변수 타입은 초기화 되어야 사용할 수 있습니다.

 

//초기화가 되지 않아 null을 가지고 있으므로 ? 를 붙인다.
String? _value;
print(_value);

String? _value2 = 'flutter';
print(_value2);

//출력값
null
flutter

초기화가 되지 않은 변수는 기본으로 null을 가지게 됩니다.

따라서, 초기화를 하지 않은 경우라면 nullable 타입으로 선언해야합니다.

혹은 아래에서 설명할 Late를 선언하면 됩니다.

 

? 를 붙여 nullable 변수 타입을 사용할 수 있습니다.

 

 

Nullable 변수 값의 전달 (Null check)

앞서 설명한 것처럼 null 값을 가져야하는 경우, 초기화가 되지 않은 경우라면 변수 타입명 뒤에 ? 를 붙여

nullable 변수 타입을 사용할 수 있습니다.

기존 변수 타입은 null을 가지지 못하기때문에 nullable과 일반적인 방법으로는 값의 교환이 불가능합니다.

 

nullable 변수 타입과 기존 변수 타입의 값의 전달은 아래와 같이 해야합니다.

String? nullable;
String normal = 'flutter';

//nullable 변수 뒤에 ! 를 붙여야한다.
normal = nullable!;

 

이렇게 하면 변수를 전달해줄때 null인지 여부를 검사합니다.

만약 !가 붙은 변수의 값이 null이라면 프로그램의 실행 도중 예외를 발생시키게 됩니다.

즉 nullable 변수 뒤에 !를 붙이면 해당 값이 null인지를 검사하고 null이 아니라면 그대로 진행을,

null이라면 예외를 발생시키는 것입니다.

 

!를 붙이는 것은 코드를 작성할 때 컴파일러가 주의하라며 알려주기때문에 변수 타입이 dynamic 같이 모호하지 않다면

코드 작성시에 특별히 신경쓰지 않아도 됩니다.

 

 

Late 선언

초기화가 되지 않은 변수는 null 값을 갖습니다.

경우에 따라 최초 선언시에는 null을 갖지만 한번 정의된 이후에는 null을 가지지 않아도 되는 경우가 있습니다.

보통 이러한 경우는 참조되기 전 다른 변수 값에 연관되어 생성자에서 값이 정의되곤 합니다.

이 때, 굳이 nullable을 사용하지 않고 Late 선언을 사용하면 조금 더 효율적입니다.

class nullSafety{
nullSafety(String property){
	_value = property;
}

Late String _value;
}

만약 정의되지 않고 변수가 사용된다거나, 정의를 하지 않는다면 컴파일러가 에러를 발생시키고 컴파일이 되지 않습니다.

저작자표시 비영리 변경금지

'Flutter > Flutter Issue' 카테고리의 다른 글

[플러터 이슈해결] The --org command line argument must be specified to recreate project.  (0) 2021.05.03
[플러터] curl: (3) URL using bad/illegal format or missing URL  (0) 2021.04.13
[플러터 이슈해결] upgrade시 흔히 발생하는 오류  (0) 2021.01.05
[플러터] initState, dispose를 불러오지 않는 경우  (0) 2020.12.24
[Flutter 이슈해결] FirebaseException([core/no-app]  (0) 2020.10.15
'Flutter/Flutter Issue' 카테고리의 다른 글
  • [플러터 이슈해결] The --org command line argument must be specified to recreate project.
  • [플러터] curl: (3) URL using bad/illegal format or missing URL
  • [플러터 이슈해결] upgrade시 흔히 발생하는 오류
  • [플러터] initState, dispose를 불러오지 않는 경우
코딩으로세계정복
코딩으로세계정복
Connecting the dots
  • 코딩으로세계정복
    코딩으로 세계정복
    코딩으로세계정복
  • 전체
    오늘
    어제
    • 전체 (134)
      • Who am I (10)
        • Portfolio (4)
        • Reminiscence (5)
        • Oversea (1)
        • SiliconValley (0)
      • React (36)
        • React Basic (15)
        • React Tech (5)
        • JavaScript (7)
        • TypeScript (3)
        • CSS&HTML (3)
        • Firebase (3)
      • NodeJS (1)
        • NodeJS Basic (1)
      • Flutter (55)
        • Flutter Widget Design (5)
        • Flutter Widget Basic (8)
        • Flutter Tech (18)
        • Flutter Issue (7)
        • Flutter Web (6)
        • About Flutter (2)
        • Firebase (1)
        • Dev Env (1)
        • Dart (7)
      • Programming (31)
        • Web (1)
        • General (0)
        • Algorithm (25)
        • Python (1)
        • VS Code (2)
      • Django (0)
  • 블로그 메뉴

    • Who I AM
    • React
    • NodeJS
    • Flutter
    • Programming
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    링고리
    useState
    react
    JSON
    알고리즘
    Firebase
    리액트
    Flutter
    CSS
    DP
    프로그래머스
    플러터 웹
    탐욕법
    JavaScript
    DART
    TypeScript
    HTML
    github
    Python
    자바스크립트
    useTranslation
    map
    웹
    useRef
    Redux
    플러터
    포트폴리오
    Lingory
    flutter web
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩으로세계정복
[Flutter] 플러터 2.0 null-safety 이해하기
상단으로

티스토리툴바