๐ช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