Flutter (์•ฑ ๊ฐœ๋ฐœ)/Dart ์ฝ”๋“œ ์ฒจ๋ถ€ ํŒŒ์ผ

[Dart ์—ฐ์‚ฐ์ž ์ดํ•ด] Dart์˜ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ๋ฐ Null-aware ์—ฐ์‚ฐ์ž (??, ?. ๋“ฑ)(๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ์ฒจ๋ถ€ ํŒŒ์ผ ์ œ๊ณต)

๋ชฝ๋ฌผ๊ณ ๊ธฐ๐“†œ 2025. 2. 24. 20:35
728x90
728x90

 

 
๋ชฉ์ฐจ

โ… . ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ๋ฐ 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); // ์„ฑ์ธ
}

์‚ผํ•ญ์—ฐ์‚ฐ์ž.txt
0.00MB

๐Ÿš€ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•œ ์กฐ๊ฑด๋ฌธ์„ ๋”์šฑ ์งง๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ! ๐ŸŽฏ

 

 

โœ… 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์ด ์•„๋‹˜์„ ๊ฐ•์ œ ๋ณด์žฅ (์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉ)

728x90
728x90