๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Flutter

[Flutter] Null Safety

๐Ÿ’ชBuilding with sound null safety๐Ÿ’ช

Run์„ ํ•˜๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ ์ž์ฃผ ๋ณด๊ฒŒ ๋˜๋Š” ๋ฌธ๊ตฌ์ธ๋ฐ, ์ด๋ฒˆ์— ์˜ค๋””์˜ค ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉด์„œ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ฌธ๋ฒ•์ด ์žˆ์–ด ์ฐพ์•„๋ณด๋‹ค๊ฐ€ null safety์— ๋Œ€ํ•ด ๋ธ”๋กœ๊ทธ๋„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ณต๋ถ€ํ•˜๊ณ  ๋ณด๋ฉด ์‰ฌ์šด ๊ฐœ๋…์ธ ๋“ฏ.

 

Null Safety๋ž€?

Null Safety = prevents errors that result from unintentional access of variables set to null

Dart 2.0๋ถ€ํ„ฐ ์ ์šฉ๋œ ๊ฐœ๋…์œผ๋กœ ๋ณ€์ˆ˜์— null๊ฐ’์ด ์˜ค์ง€ ๋ชปํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ๋ณ€์ˆ˜์— null์ด ํ• ๋‹น๋˜๋ฉด์„œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์—๋Ÿฌ๋‚˜ ์˜๋„ํ•˜์ง€ ์•Š์€ ๋™์ž‘์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค. ๋งŒ์•ฝ ๋ณ€์ˆ˜์— null ๊ฐ’์ด ์˜ค๊ฒŒ ๋œ๋‹ค๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.

ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ”Œ๋Ÿฌํ„ฐ๋Š” dart 2.0 ์ด์ƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ null safety๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.

(์ž๋ฐ”์—์„œ๋Š” initialization์„ ํ•  ๋•Œ String์˜ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ null๋กœ ์„ค์ •ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— Dart๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ณ„์† null์„ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ late๋‚˜ ?, !์˜ ์šฉ๋„๋ฅผ ์ž˜ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒผ์—ˆ๋‹ค.)

 

Dart๋Š” Type Safe Language๋กœ์จ ์˜ˆ์ธกํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ œํ•œ๋‹ค. ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” null๊ฐ’์ด ๋  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค. (= Dart์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” non-nullable์ด๋‹ค.) ๋”ฐ๋ผ์„œ, ์ž๋ฐ”์—์„œ์ฒ˜๋Ÿผ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ธฐ๋งŒ ํ•˜๊ณ  ๋‚˜์ค‘์— ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋‹ค. ํ•ญ์ƒ ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ด๋ฃจ์–ด ์ ธ์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (๋’ค์—์„œ ๋‚˜์˜ค๊ฒ ์ง€๋งŒ, ์„ ์–ธ๋งŒ ํ•œ ํ›„ ๋‚˜์ค‘์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ ค๋ฉด late๋ฅผ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•œ๋‹ค.)

 

์ด๋Ÿฌํ•œ ํŠน์„ฑ์—์„œ ์˜ค๋Š” ์žฅ์ ์€, null-pointer-exception ๋•Œ๋ฌธ์— ํ•ญ์ƒ null ์ฒดํฌ๋ฅผ if๋ฌธ ๋“ฑ์œผ๋กœ ํ•ด์ฃผ์–ด์•ผํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๊ณผ ๋‹ค๋ฅด๊ฒŒ Dart๋Š” ๋ณ€์ˆ˜๊ฐ€ null์ธ์ง€๋ฅผ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค. 

 

์—ฌ๊ธฐ์„œ ๋”ฐ๋ผ์˜ค๋Š” ํŠน์ง•์ด๋ผ๋ฉด ํŠน์ง•์ธ๋ฐ ๋งŒ์•ฝ ํ”Œ๋Ÿฌํ„ฐ ์ฝ”๋“œ์— Cat.age!.month์™€ ๊ฐ™์ด !๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” age๋ผ๋Š” ๊ฐ’์ด 100ํผ์„ผํŠธ null์ด ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, null๊ฐ’ ๋ณด์ฆ ์—ฐ์‚ฐ์ž๋ผ๊ณ  ํ•œ๋‹ค. ํ˜น์‹œ๋ผ๋„ age์— null์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋œจ๋ฏ€๋กœ null๊ฐ’์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.


ํ•˜์ง€๋งŒ, null ๊ฐ’์„ ๊ผญ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด?

How to make nullable type

1) null ์กฐ๊ฑด ์—ฐ์‚ฐ์ž = ๋ณ€์ˆ˜ ์„ ์–ธํ•  ๋•Œ type ๋’ค์— ? ๋ถ™์—ฌ์ฃผ๊ธฐ

String? name;

๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  name์„ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด name์—๋Š” null ๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์—์„œ ๋งํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์„ ์–ธ์—์„œ๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค. ๋ฌผ๋ก  ์ด ๋ณ€์ˆ˜๋ฅผ ๋‚˜์ค‘์— ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ•จ์ˆ˜ parameter์—์„œ๋„ ?๋ฅผ ๋ถ™์—ฌ์ฃผ๊ณ  parameter๊ฐ€ null์ธ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ๋”ฐ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

2) ๋ณ€์ˆ˜ ์„ ์–ธํ•  ๋•Œ type ์•ž์— late ๋ถ™์—ฌ์ฃผ๊ธฐ

late int age;

1๋ฒˆ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ณ€์ˆ˜๊ฐ€ null์ด ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ์„ค์ •์„ ํ•ด์ค€ ๊ฒƒ์ด๋ผ๋ฉด, 2๋ฒˆ์˜ late์˜ ๊ฒฝ์šฐ์—๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ์ดํ›„์— ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋Š” ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ ์ „์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋‹ˆ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. late๋ฅผ ์„ ์–ธํ•œ ๊ฒฝ์šฐ์—๋Š” ์ฒ˜์Œ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”์— ๋”ฐ๋ผ ์ฒœ์ฒœํžˆ ๋œ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ ธ lazy initialization์ด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

3) required

void main() {
    print(add());
}

int add(int a, int b) {
    int sum = a+b;
    return sum;
}

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ a์™€ b์—๋Š” int๊ฐ€ ํ• ๋‹น ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ add์•ˆ์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์•„์„œ a์™€ b์— null ๊ฐ’์ด ํ• ๋‹น๋˜๋ฉด์„œ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.

int add(required int? a, required int b) {
    if (a == null) {

        return b;
    }
    int sum = a+b;
    return sum;
}

๋”ฐ๋ผ์„œ required๋ฅผ ์‚ฌ์šฉํ•ด ์ค€ ๋‹ค์Œ์— ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์„ ์–ธํ•œ ๋’ค์— ?๋ฅผ ๋ถ™์—ฌ์ฃผ๊ณ  null ๊ฐ’์ด ์™”์„ ๋•Œ๋ฅผ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์ฐธ๊ณ ์ž๋ฃŒ

- https://www.youtube.com/watch?v=QP0THWoDeag&t=616s 

- https://dart.dev/null-safety

 

Sound null safety

Information about Dart's null safety feature

dart.dev