
โ . ์ผํญ ์ฐ์ฐ์ ๋ฐ Null-aware ์ฐ์ฐ์๊ฐ ์ค์ํ ์ด์
๐ ์ผํญ ์ฐ์ฐ์์ Null-aware ์ฐ์ฐ์๊ฐ ์ ํ์ํ๊ฐ?
๐ Null ์์ ์ฑ(Null Safety)์ ๊ฐํํ๋ ์ฐ์ฐ์๋ค
โ ก. ๋ณธ๋ก : ์ผํญ ์ฐ์ฐ์ ๋ฐ Null-aware ์ฐ์ฐ์ ํ์ฉ๋ฒ
๐ Step 1: ์ผํญ ์ฐ์ฐ์ (condition ? expr1 : expr2) ํ์ฉํ๊ธฐ
๐ Step 2: Null-aware ์ฐ์ฐ์ (??) ํ์ฉํ๊ธฐ
๐ Step 3: Null-aware ์ฐ์ฐ์ (?.) ํ์ฉํ๊ธฐ
๐ Step 4: Null-aware ์ฐ์ฐ์ (??=) ํ์ฉํ๊ธฐ
๐ Step 5: Null-aware ์ฐ์ฐ์ (!... null assertion operator) ํ์ฉํ๊ธฐ
โ ข. ์ผํญ ์ฐ์ฐ์ ๋ฐ Null-aware ์ฐ์ฐ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ
๐ ์ผํญ ์ฐ์ฐ์์ Null-aware ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋์ ์ฃผ์์
๐ ์ฝ๋ ์ต์ ํ๋ฅผ ์ํ ํ
Dart์ ์ผํญ ์ฐ์ฐ์ ๋ฐ
Null-aware ์ฐ์ฐ์ (??, ?. ๋ฑ)
์ดํดํ๊ธฐ ๐
Dart์์๋ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ณ
๊ฐ๋ ์ฑ ์๊ฒ ์์ฑํ ์ ์๋๋ก
์ผํญ ์ฐ์ฐ์(ternary operator)์
Null-aware ์ฐ์ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด ์ฐ์ฐ์๋ค์ ํนํ
์กฐ๊ฑด๋ฌธ์ ๊ฐ๋จํ๊ฒ ํํํ๊ฑฐ๋,
Null ๊ฐ์ผ๋ก ์ธํด ๋ฐ์ํ๋
์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋
์ผํญ ์ฐ์ฐ์์
Null-aware ์ฐ์ฐ์์ ๊ฐ๋ ๊ณผ ํ์ฉ๋ฒ์
์์ ์ ํจ๊ป ์ ๋ฆฌํ๊ฒ ์ต๋๋ค. ๐ฏ
๋จผ์
๋ ๋ง์ ์ ๋ณด, ํน์
์์๋๋ก ํฌ์คํ
์ ๋ณด๊ณ ์ถ๋ค๋ฉด
์๋ ๋
ธ์
์ ํ์ธํด์ฃผ์ธ์.

https://mongmung-i.notion.site/Flutter-1a39b1e2cdaa80319a0fc2a89281dc71?pvs=4
Flutter ์ดํ ๊ฐ๋ฐ ์ผ์ง | Notion
Made with Notion, the all-in-one connected workspace with publishing capabilities.
mongmung-i.notion.site
https://mongmung-i.notion.site/19f9b1e2cdaa80a984ade6141a87fd29?pvs=4
์ฐฝ์ ํธ๋ ์ฌ์ ์บ ํ ๐ฒ | Notion
์ด ๊ณณ์ ์ฐฝ์ ํธ๋ ์ฌ์ ์บ ํ ์งํ ์ฌํญ์ ์ ๋ฆฌํ๋ ๊ณณ์ ๋๋ค.
mongmung-i.notion.site
โ . ์ผํญ ์ฐ์ฐ์ ๋ฐ Null-aware ์ฐ์ฐ์๊ฐ ์ค์ํ ์ด์ ๐ค
์ผํญ ์ฐ์ฐ์์ Null-aware ์ฐ์ฐ์๊ฐ ์ ํ์ํ๊ฐ?
โ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค์ด ๊ฐ๋ ์ฑ์ ๋์
Dart์์
if-else ๋ฌธ์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ๋ฉด
์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
์ผํญ ์ฐ์ฐ์
(condition ? expr1 : expr2)๋ฅผ ์ฌ์ฉํ๋ฉด
ํ ์ค๋ก ์กฐ๊ฑด์ ํํํ ์ ์์ด
๊ฐ๋ ์ฑ์ด ํฅ์๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด,
๋ก๊ทธ์ธ ์ํ์ ๋ฐ๋ผ
๋ค๋ฅธ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ ๊ฒฝ์ฐ,
String message = isLoggedIn ? 'ํ์ํฉ๋๋ค!' : '๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.';
์ด๋ ๊ฒ ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์์ผ๋ฉฐ, UI์์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ๊ตฌํํ ๋๋ ํ์ฉ๋ฉ๋๋ค.
โ Null ๊ฐ์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ์ฌ NullPointerException ๋ฐฉ์ง
Null-aware ์ฐ์ฐ์๋
๋ณ์์ null์ด ํ ๋น๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ,
์ด๋ฅผ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, API ์๋ต์์
๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋์์ ๋
์ด๋ฅผ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ค๋ฉด
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
String? name;
String displayName = name ?? '์ด๋ฆ ์์';
print(displayName); // ์ถ๋ ฅ: ์ด๋ฆ ์์
์ด๋ ๊ฒ ํ๋ฉด ์์ธ ์์ด
null ๋์ ๊ธฐ๋ณธ๊ฐ์ด ์ค์ ๋ฉ๋๋ค.
โ Flutter UI ๊ฐ๋ฐ์์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง ๋ฐ ๋ฐ์ดํฐ ๊ฒ์ฆ์ ํ์ฉ
Flutter์์๋
์์ ฏ์ ๋์ ์ผ๋ก ๋ ๋๋งํ ๋
์ผํญ ์ฐ์ฐ์์ Null-aware
์ฐ์ฐ์๊ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด,
๋ก๊ทธ์ธ ์ํ์ ๋ฐ๋ผ
๋ค๋ฅธ UI๋ฅผ ๋ณด์ฌ์ค ๋
๋ค์๊ณผ ๊ฐ์ด ํ์ฉํ ์ ์์ต๋๋ค.
Widget build(BuildContext context) {
return Text(isLoggedIn ? 'ํ์ํฉ๋๋ค!' : '๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.');
}
๋ํ, ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๊ฐ
null์ผ ๊ฒฝ์ฐ
๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ ๋๋ ํ์ฉ๋ฉ๋๋ค.
- if-else ๊ตฌ๋ฌธ์ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์์
- Null ๊ฐ์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ์ฌ NullPointerException ๋ฐฉ์ง
- Flutter UI ๊ฐ๋ฐ์์ ์กฐ๊ฑด๋ถ ์์ ฏ ํ์ ๋ฑ์ ํ์ฉ ๊ฐ๋ฅ
โก ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ , ์์ธ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ค์ด๋ ๋ฐ ํ์์ ์ธ ์ฐ์ฐ์๋ค! ๐
Null ์์ ์ฑ(Null Safety)์ ๊ฐํํ๋ ์ฐ์ฐ์๋ค
Dart๋
null ์์ ์ฑ(Null Safety)์
๋ณด์ฅํ๋ ์ธ์ด์ ๋๋ค.
์ฆ, ๋ณ์๊ฐ
null์ธ์ง ์๋์ง๋ฅผ
๋ช ํํ๊ฒ ๊ตฌ๋ถํด์ผ ํ๋ฉฐ,
์ด๋ฅผ ์ํด
๋ค์ํ Null-aware ์ฐ์ฐ์๊ฐ ์ ๊ณต๋ฉ๋๋ค.
๐ก Null Safety๋ฅผ ๊ฐํํ๋ ์ฃผ์ ์ฐ์ฐ์๋ค
์ฐ์ฐ์ | ์ค๋ช | ์ฌ์ฉ ์์ |
?? (Null-aware operator) | ์ผ์ชฝ ๊ฐ์ด null์ด๋ฉด ์ค๋ฅธ์ชฝ ๊ฐ์ ๋ฐํ | String name = userName ?? 'Guest'; |
?. (Null-aware access operator) | null์ด๋ฉด ์์ฑ ์ ๊ทผ์ ์ค๋จํ๊ณ null ๋ฐํ | print(user?.name); |
??= (Null-aware assignment operator) | ๋ณ์๊ฐ null์ผ ๋๋ง ๊ฐ์ ํ ๋น | userName ??= 'Guest'; |
! (Null assertion operator) | ๋ณ์๊ฐ null์ด ์๋์ ๋ณด์ฅ (null์ด๋ฉด ์์ธ ๋ฐ์) | print(userName!); |
โ ์ด ์ฐ์ฐ์๋ค์ null๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ์๋ฐฉํ๊ณ , ์์ ์ ์ธ ์ฝ๋ ์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋๋ค.
๐ ์ ๋ฆฌ:
- ์ผํญ ์ฐ์ฐ์๋ if-else๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํํํ๋ ๋ฐ ์ ์ฉ
- Null-aware ์ฐ์ฐ์๋ null์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋์
- Flutter UI ๋ฐ API ์๋ต ๋ฐ์ดํฐ ์ฒ๋ฆฌ์์ ํ์์ ์ผ๋ก ์ฌ์ฉ๋จ
โก ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ผํญ ์ฐ์ฐ์์ Null-aware ์ฐ์ฐ์์ ํ์ฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค! ๐
โ ก. ์ผํญ ์ฐ์ฐ์ ๋ฐ Null-aware ์ฐ์ฐ์ ํ์ฉ๋ฒ ๐๏ธ
Step 1: ์ผํญ ์ฐ์ฐ์ (condition ? expr1 : expr2) ํ์ฉํ๊ธฐ
์ผํญ ์ฐ์ฐ์๋
if-else ๋ฌธ์ ํ ์ค๋ก ํํํ๋
๊ฐ๊ฒฐํ ์ฐ์ฐ์์ ๋๋ค.
์ด ์ฐ์ฐ์๋ ์กฐ๊ฑด์ ๋ฐ๋ผ
๋ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ ์ ํํ ๋ ์ ์ฉํ๋ฉฐ,
ํนํ UI์์
๋์ ์ผ๋ก ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ
๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
โ ์ผํญ ์ฐ์ฐ์๋ if-else ๋ฌธ์ ํ ์ค๋ก ํํํ ์ ์์
void main() {
int age = 20;
String result = (age >= 18) ? '์ฑ์ธ' : '๋ฏธ์ฑ๋
์';
print(result); // ์ฑ์ธ
}
๐ ์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ ์กฐ๊ฑด๋ฌธ์ ๋์ฑ ์งง๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ์์ฑ ๊ฐ๋ฅ! ๐ฏ
โ Flutter UI์์ ์ผํญ ์ฐ์ฐ์ ํ์ฉ ์์
bool isLoggedIn = false;
Text showMessage() {
return Text(isLoggedIn ? 'ํ์ํฉ๋๋ค!' : '๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.');
}
๐ Flutter์์ UI ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ์์ฃผ ํ์ฉ๋จ! ๐ฏ
๐ก ์ธ์ ์ผํญ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?
- ์กฐ๊ฑด์ ๋ฐ๋ผ ๋จ์ํ ๊ฐ์ ๋ฐํํ ๋
- Flutter UI์์ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์์ ฏ์ ๋ค๋ฅด๊ฒ ๋ ๋๋งํ ๋
- ๊ฐ๊ฒฐํ ์ฝ๋ ์์ฑ์ ์ํ ๋ (if-else ๋ธ๋ก์ด ๊ธธ์ด์ง ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ ์ ํ ๊ฐ๋ฅ)
๐ ์ฃผ์ํ ์ :
- ๋ณต์กํ ์กฐ๊ฑด๋ฌธ์๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ (๊ฐ๋ ์ฑ ์ ํ)
- ์ฌ๋ฌ ๊ฐ์ ์ผํญ ์ฐ์ฐ์๋ฅผ ์ค์ฒฉํ๋ ๊ฒ์ ํผํ๋ ๊ฒ์ด ์ข์
โก ์ผํญ ์ฐ์ฐ์๋ if-else ๋ฌธ์ ๊ฐ๊ฒฐํ๊ฒ ๋ณํํ๋ ๋ฐ ์ ์ฉํ์ง๋ง, ๊ฐ๋ ์ฑ์ ์ ์งํด์ผ ํจ! ๐
Step 2: Null-aware ์ฐ์ฐ์ (??) ํ์ฉํ๊ธฐ
?? ์ฐ์ฐ์๋
์ผ์ชฝ ํผ์ฐ์ฐ์๊ฐ null์ด๋ฉด
์ค๋ฅธ์ชฝ ๊ฐ์ ๋ฐํํฉ๋๋ค.
์ฆ, null ๊ฐ์
์์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก
๋์์ฃผ๋ ์ฐ์ฐ์์ ๋๋ค.
โ ?? ์ฐ์ฐ์๋ ์ผ์ชฝ ๊ฐ์ด null์ด๋ฉด ์ค๋ฅธ์ชฝ ๊ฐ์ ๋ฐํ
void main() {
String? name;
String displayName = name ?? '์ด๋ฆ ์์';
print(displayName); // ์ด๋ฆ ์์
}
๐ null ๊ฐ์ ์ฒ๋ฆฌํ ๋ ๋งค์ฐ ์ ์ฉํ ์ฐ์ฐ์! ๐ฏ
๐ก ์ธ์ ?? ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?
- ๋ณ์์ null์ด ํฌํจ๋ ๊ฐ๋ฅ์ฑ์ด ์์ ๋ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๊ณ ์ถ์ ๋
- ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ์ ๋ฐ์ ๋ null ๊ฐ์ด ์ ๋ ฅ๋ ์ ์๋ ๊ฒฝ์ฐ
- API ์๋ต์์ ๊ฐ์ด ์์ ๋ ๊ธฐ๋ณธ๊ฐ์ ์ ์ฉํ๊ณ ์ถ์ ๋
๐ ์ฃผ์ํ ์ :
- ๋ณ์๊ฐ null์ธ์ง ํ์ธํ์ง ์๊ณ !(null assertion ์ฐ์ฐ์)๋ก ์ ๊ทผํ๋ฉด ์์ธ ๋ฐ์ ๊ฐ๋ฅ
- ๋ถํ์ํ๊ฒ ??๋ฅผ ๋จ๋ฐํ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์์
โก ?? ์ฐ์ฐ์๋ ์์ ํ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ! ๐ฏ
Step 3: Null-aware ์ฐ์ฐ์ (?.) ํ์ฉํ๊ธฐ
?. ์ฐ์ฐ์๋ ๊ฐ์ฒด๊ฐ null์ธ์ง ํ์ธํ ํ,
null์ด ์๋๋ฉด ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์คํํฉ๋๋ค.
์ฆ, null ๊ฐ์ด ๋ฐ์ํ์ ๋
ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋์ง ์๋๋ก
๋ฐฉ์งํ๋ ์ญํ ์ ํฉ๋๋ค.
โ ?. ์ฐ์ฐ์๋ ๊ฐ์ฒด๊ฐ null์ด๋ฉด null์ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์คํํจ
class Person {
String? name;
}
void main() {
Person? p;
print(p?.name); // null (์ค๋ฅ ์์ด ์คํ๋จ)
}
๐ ๊ฐ์ฒด๊ฐ null์ผ ๋๋ ์์ ํ๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ์ฌ NullPointerException์ ๋ฐฉ์งํ ์ ์์! ๐ฏ
๐ก ์ธ์ ?. ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?
- ๊ฐ์ฒด๊ฐ null์ผ ๊ฐ๋ฅ์ฑ์ด ์์ ๋ ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์์ ํ๊ฒ ํธ์ถํ๊ณ ์ถ์ ๋
- API ์๋ต์ด null์ผ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ (์: JSON ๋ฐ์ดํฐ์์ ํ๋ ๋๋ฝ ๊ฐ๋ฅ์ฑ)
- ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ์๋ ์ค๋ฅ ์์ด null์ ๋ฐํํ๊ณ ์ถ์ ๋
๐ ์ฃผ์ํ ์ :
- ?. ์ฐ์ฐ์๋ฅผ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์์
- null ๊ฐ์ด ์๋๋ผ ํ์คํ ๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ์๋ !๋ฅผ ์ฌ์ฉํด์ผ ํ ์๋ ์์
โก ๊ฐ์ฒด๊ฐ null์ผ ๊ฐ๋ฅ์ฑ์ด ์์ ๋ ?.์ ์ฌ์ฉํ๋ฉด NullPointerException์ ๋ฐฉ์งํ ์ ์์! ๐
Step 4: Null-aware ์ฐ์ฐ์ (??=) ํ์ฉํ๊ธฐ
??= ์ฐ์ฐ์๋ ๋ณ์๊ฐ
null์ผ ๋๋ง ๊ฐ์ ํ ๋นํฉ๋๋ค.
์ฆ, ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋๋ฐ
๋งค์ฐ ์ ์ฉํ ์ฐ์ฐ์์ ๋๋ค.
โ ??= ์ฐ์ฐ์๋ ๋ณ์๊ฐ null์ผ ๋๋ง ๊ฐ์ ํ ๋นํจ
void main() {
String? username;
username ??= 'Guest';
print(username); // Guest
}
๐ ๊ฐ์ด ์์ ๋ ๊ธฐ๋ณธ๊ฐ์ ํ ๋นํ๋ ๋ฐ ์ ์ฉํจ! ๐ฏ
๐ก ์ธ์ ??= ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?
- ๋ณ์๊ฐ null์ด๋ฉด ํน์ ๊ฐ์ ํ ๋นํ๊ณ ์ถ์ ๋
- ์ค์ ๊ฐ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ ๋ (์: ํ๊ฒฝ ๋ณ์, ์ค์ ๊ฐ ๋ฑ)
- ๋ณ์์ ์ด๊ธฐ๊ฐ์ ํ ๋ฒ๋ง ์ค์ ํ๊ณ ์ดํ ๋ณ๊ฒฝ์ ๋ฐฉ์งํ ๋
๐ ์ฃผ์ํ ์ :
- ์ด๋ฏธ ๊ฐ์ด ์๋ ๋ณ์์๋ ์ํฅ์ ์ฃผ์ง ์์
- ?? ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋์ฑ ์ ์ฉํ ์ ์์
Step 5: Null assertion ์ฐ์ฐ์ (!) ํ์ฉํ๊ธฐ
! ์ฐ์ฐ์๋ ๋ณ์๋ ๊ฐ์ฒด๊ฐ
null์ด ์๋์ ํ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
์ฆ, ๊ฐ๋ฐ์๊ฐ
"์ด ๋ณ์๋ ์ ๋ null์ด ๋ ์ ์๋ค"๊ณ
์ ์ธํ๋ ์ญํ ์ ํฉ๋๋ค.
โ ! ์ฐ์ฐ์๋ null์ด ์๋์ ๋ณด์ฅํ๋ ์ฐ์ฐ์ (๋จ, null์ด๋ฉด ์์ธ ๋ฐ์)
void main() {
String? name = 'Dart';
print(name!); // Dart
}
๐ ํ์คํ๊ฒ null์ด ์๋ ๋๋ง ์ฌ์ฉํด์ผ ํจ! ๐ฏ
โ null์ธ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฐ์ ์์
void main() {
String? name;
print(name!); // โ ๋ฐํ์ ์ค๋ฅ ๋ฐ์!
}
๐ ! ์ฐ์ฐ์๋ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ??๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํจ! ๐ฏ
๐ก ์ธ์ ! ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?
- ๋ณ์๊ฐ null์ด ์๋์ ํ์ ํ ๋
- null safety๋ฅผ ๊ฐ์ ํ๊ณ ์ถ์ ๋ (์: API ์๋ต์์ ๊ฐ์ด ๋ฐ๋์ ์กด์ฌํ๋ ๊ฒฝ์ฐ)
- Dart์ late ํค์๋์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ณ์ ์ด๊ธฐํ๋ฅผ ์ง์ฐํ ๋
โ ์ฃผ์ํ ์ :
- ๋ณ์๊ฐ ์ค์ ๋ก null์ด๋ฉด ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์!
- ๋ถํ์ํ๊ฒ ๋จ๋ฐํ๋ฉด ์ฝ๋๊ฐ ์์ธ ๋ฐ์์ ์ทจ์ฝํด์ง ์ ์์
- ๊ฐ๋ฅํ๋ฉด ?? ๋๋ ?.์ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์
โก ! ์ฐ์ฐ์๋ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ฉฐ, ๊ฐ๋ฅํ ๊ฒฝ์ฐ ??๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํจ! ๐
โ ข. ์ผํญ ์ฐ์ฐ์ ๋ฐ Null-aware ์ฐ์ฐ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ โ
์ผํญ ์ฐ์ฐ์์ Null-aware ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋์ ์ฃผ์์
โ
๊ฐ๋จํ if-else ๋ฌธ์ ์ผํญ ์ฐ์ฐ์๋ก ๋ณํํ๋ฉด ์ฝ๋๊ฐ ๋ ๊ฐ๋
์ฑ ์ข์์ง
โ
๊ฐ์ฒด๊ฐ null์ผ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ ?. ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ NullPointerException ๋ฐฉ์ง
โ
๊ธฐ๋ณธ๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ ?? ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ null์ ๋ฐฉ์ง
โ
๋ณ์์ null์ด ํ ๋น๋์ง ์๋๋ก ??= ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ ์ด๊ธฐํ
โ
! ์ฐ์ฐ์๋ ๋ฐ๋์ null์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ (์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํจ!)
์ฝ๋ ์ต์ ํ๋ฅผ ์ํ ํ
โ
์กฐ๊ฑด๋ฌธ์ด ๊ธธ์ด์ง ๊ฒฝ์ฐ ๊ฐ๋
์ฑ์ ์ํด ์ผํญ ์ฐ์ฐ์ ๋์ if-else ์ฌ์ฉ
โ
null์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ?. ๋๋ ?? ์ฐ์ฐ์๋ฅผ ์ ์ ํ ํ์ฉ
โ
Flutter UI ๊ฐ๋ฐ์์ ์ผํญ ์ฐ์ฐ์๋ก ๊ฐ๊ฒฐํ ์กฐ๊ฑด๋ถ ๋ ๋๋ง ๊ตฌํ
โก Dart์ ์ผํญ ์ฐ์ฐ์์ Null-aware ์ฐ์ฐ์๋ฅผ ํ์ฉํ๋ฉด ๋ ๊น๋ํ๊ณ ์์ ํ ์ฝ๋ ์์ฑ ๊ฐ๋ฅ! ๐
์ฆ ์ฐ์ฐ์๋ฅผ ์์ฝํ๋ฉด
๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โ
์ผํญ ์ฐ์ฐ์ (? :) → ์กฐ๊ฑด๋ฌธ์ ํ ์ค๋ก ํํ
โ
Null-aware ์ฐ์ฐ์ (??) → null์ด๋ฉด ๊ธฐ๋ณธ๊ฐ ๋ฐํ
โ
Null-aware ์ฐ์ฐ์ (?.) → null์ด๋ฉด ์์ฑ ์ ๊ทผ์ ์ค๋จํ๊ณ null ๋ฐํ
โ
Null-aware ์ฐ์ฐ์ (??=) → null์ผ ๋๋ง ๊ฐ ํ ๋น
โ
Null assertion ์ฐ์ฐ์ (!) → null์ด ์๋์ ๊ฐ์ ๋ณด์ฅ (์ฃผ์ํด์ ์ฌ์ฉ)