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

[Dart ๋ณ€์ˆ˜์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž…] null safety๋ž€? Dart์˜ null ์•ˆ์ „์„ฑ ์ดํ•ดํ•˜๊ธฐ(๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ์ฒจ๋ถ€ ํŒŒ์ผ ์ œ๊ณต)

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

 

 

null safety๋ž€?

Dart์˜ null ์•ˆ์ „์„ฑ ์ดํ•ดํ•˜๊ธฐ ๐Ÿš€๐Ÿ”

 

Dart๋Š”

null safety (๋„ ์•ˆ์ „์„ฑ) ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ

null๋กœ ์ธํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ 

์ฝ”๋“œ ์•ˆ์ •์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.


Flutter ๊ฐœ๋ฐœ์—์„œ

null safety๋ฅผ ์ดํ•ดํ•˜๊ณ 

์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ™œ์šฉํ•˜๋ฉด,

์•ฑ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ 

์œ ์ง€๋ณด์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š”

Dart์˜ null safety ๊ฐœ๋…๊ณผ ํ™œ์šฉ๋ฒ•์„

์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

 


๋จผ์ €

 

๋” ๋งŽ์€ ์ •๋ณด, ํ˜น์€


์ˆœ์„œ๋Œ€๋กœ ํฌ์ŠคํŒ…์„ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด


์•„๋ž˜ ๋…ธ์…˜์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”. 

 



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 safety๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ  ๐Ÿค”

 

null ๊ฐ’์ด๋ž€? null์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”๊ฐ€?

 

 

null(๋„)์€

 '์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ƒํƒœ'๋ฅผ 

์˜๋ฏธํ•˜๋Š” ํŠน๋ณ„ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.


Dart์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 

๋ชจ๋“  ๋ณ€์ˆ˜๊ฐ€ null ๊ฐ’์„

 ๊ฐ€์งˆ ์ˆ˜ ์—†๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์ง€๋งŒ,


๋ช…์‹œ์ ์œผ๋กœ

nullable ๋ณ€์ˆ˜(? ์‚ฌ์šฉ)๋ฅผ ์„ ์–ธํ•˜๋ฉด

null์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก null ๊ฐ’์€ ์–ธ์ œ ๋ฐœ์ƒํ• ๊นŒ?

โœ… ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
โœ… ๋„คํŠธ์›Œํฌ ์š”์ฒญ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ
โœ… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ

โžก null ๊ฐ’์ด ๋ฐœ์ƒํ•˜๋ฉด, ํ”„๋กœ๊ทธ๋žจ์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋  ์œ„ํ—˜์ด ์žˆ์Œ! ๐Ÿšจ

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ์ฝ”๋“œ์—์„œ name ๋ณ€์ˆ˜๋Š”

์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ null ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

void main() {
  String? name;
  print(name); // ์ถœ๋ ฅ: null
}

โžก ์ฆ‰, null ๊ฐ’์€ ๋ณ€์ˆ˜๊ฐ€ '์•„์ง ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š์€ ์ƒํƒœ'๋ฅผ ๋‚˜ํƒ€๋ƒ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

โš  null์„ ์กฐ์‹ฌํ•ด์•ผ ํ•˜๋Š” ์ด์œ ?

  • null ๊ฐ’์„ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์•ฑ์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Œ
  • null์„ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•˜๊ณ  ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • Flutter UI์—์„œ null ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๋˜๋ฉด ๋นˆ ํ™”๋ฉด ๋˜๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

 

๐Ÿ’ก Dart์—์„œ๋Š”

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด

null safety ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ,


null ๊ฐ’์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„

๋ฏธ๋ฆฌ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ๐Ÿš€

 

โžก ์ด์ œ null safety ๊ฐœ๋…์„ ์‚ดํŽด๋ณด๋ฉด์„œ, ์–ด๋–ป๊ฒŒ null์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ๐ŸŽฏ


null๋กœ ์ธํ•œ ์˜ค๋ฅ˜ ๋ฐฉ์ง€์˜ ํ•„์š”์„ฑ

 

โœ… null ๊ฐ’์ด ํฌํ•จ๋œ ๋ณ€์ˆ˜๋ฅผ ์ž˜๋ชป ์ฐธ์กฐํ•˜๋ฉด NullPointerException ๋ฐœ์ƒ
โœ… Dart์˜ null safety๋Š” ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ์›์ฒœ์ ์œผ๋กœ ๋ฐฉ์ง€
โœ… Flutter ์•ฑ์—์„œ ์•ˆ์ •์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ

โžก ์ด์ œ Dart์˜ null safety ๊ฐœ๋…์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ๐ŸŽฏ


โ…ก. ๋ณธ๋ก : Dart์˜ null safety ๊ฐœ๋…๊ณผ ํ™œ์šฉ๋ฒ• ๐Ÿ—๏ธ

 

Step 1: null safety๋ž€? (๊ธฐ๋ณธ ๊ฐœ๋… ์ดํ•ด)

 

 

null safety๋ž€ 

Dart์—์„œ null ๊ฐ’์„

 ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก 

์„ค๊ณ„๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.


๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” 

null ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉฐ, 

null์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด

 ?๋ฅผ ์‚ฌ์šฉํ•ด

 nullable ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.



null safety๊ฐ€ ์—†๋˜ ์‹œ์ ˆ์—๋Š”, 

๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋‚˜์„œ 

๊ฐ’์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜,


๋„คํŠธ์›Œํฌ ์š”์ฒญ์—์„œ

 ์˜ˆ์ƒ์น˜ ๋ชปํ•œ null ๊ฐ’์ด ๋ฐ˜ํ™˜๋  ๊ฒฝ์šฐ

 ํ”„๋กœ๊ทธ๋žจ์ด ๋น„์ •์ƒ์ ์œผ๋กœ 

์ข…๋ฃŒ๋  ์œ„ํ—˜์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


Dart๋Š” 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด

 null safety๋ฅผ ๋„์ž…ํ•˜์—ฌ

๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ

null์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

โœ… Dart๋Š” null safety๋ฅผ ํ†ตํ•ด null ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•จ
โœ… ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ (non-nullable by default)

void main() {
  String text = null;  // โŒ ์˜ค๋ฅ˜ ๋ฐœ์ƒ (null ํ• ๋‹น ๋ถˆ๊ฐ€)
}

โžก ๊ธฐ๋ณธ์ ์œผ๋กœ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, null์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ?๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•จ! ๐ŸŽฏ

 

   ๋ช…์‹œ๋ฅผ ์•ˆํ•  ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

 

 

๐Ÿ’ก ์™œ null safety๊ฐ€ ์ค‘์š”ํ•œ๊ฐ€?

  • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ null ๊ฐ’์ด ๋ฐœ์ƒํ•˜๋ฉด ์•ฑ์ด ์ถฉ๋Œํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ
  • null ์•ˆ์ „์„ฑ์„ ํ†ตํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ๊ฐ์ง€ํ•˜์—ฌ ์•ฑ์„ ๋” ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
  • Flutter UI์—์„œ null safety๋ฅผ ํ™œ์šฉํ•˜๋ฉด, NullPointerException์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง

 

โžก Dart์—์„œ null์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค๋ฃจ๋ ค๋ฉด ?, !, ??, late ๋“ฑ์˜ ํ‚ค์›Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿš€


Step 2: nullable(?) vs non-nullable ๋ณ€์ˆ˜

 

 

๊ธฐ๋ณธ์ ์œผ๋กœ Dart์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š”

non-nullable(๋„์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ)์ž…๋‹ˆ๋‹ค.


์ฆ‰, null ๊ฐ’์„ ๊ฐ€์ง€๋ ค๋ฉด

?๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

โœ… nullable ๋ณ€์ˆ˜ (? ์‚ฌ์šฉ)

void main() {
  String? message = null; // โœ… null ํ• ๋‹น ๊ฐ€๋Šฅ
  print(message); // ์ถœ๋ ฅ: null
}

  • nullable ๋ณ€์ˆ˜๋Š” null์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ null ์ฒดํฌ ํ•„์š”

 

โœ… non-nullable ๋ณ€์ˆ˜ (null ํ—ˆ์šฉ X)

void main() {
  String message = 'Hello'; // โœ… null์ด ์•„๋‹Œ ๊ฐ’๋งŒ ํ• ๋‹น ๊ฐ€๋Šฅ
  print(message);
}

 

  • non-nullable ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”๋˜์–ด์•ผ ํ•˜๋ฉฐ, null์„ ์ €์žฅํ•  ์ˆ˜ ์—†์Œ
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ null ํ• ๋‹น์„ ๋ง‰์•„์ฃผ๋ฏ€๋กœ ์•ˆ์ „ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ

๐Ÿš€ nullable ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด null ๊ฐ’ ์ฒ˜๋ฆฌ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ! ๐ŸŽฏ

 

๐Ÿ’ก ์–ธ์ œ nullable ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

  • ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ (์„œ๋ฒ„ ์‘๋‹ต์ด ์—†์„ ๊ฒฝ์šฐ null์ด ๋  ์ˆ˜ ์žˆ์Œ)
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜์ง€ ์•Š์€ ๊ฐ’์„ ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด์•ผ ํ•  ๋•Œ
  • ์ดˆ๊ธฐ๊ฐ’ ์—†์ด ์„ ์–ธํ•˜์ง€๋งŒ, ๋‚˜์ค‘์— ๊ฐ’์ด ์„ค์ •๋  ๊ฒฝ์šฐ

โžก nullable ๋ณ€์ˆ˜๋Š” null ์ฒดํฌ๊ฐ€ ํ•„์ˆ˜์ ์ด๋ฉฐ, ์•ˆ์ „ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์œ„ํ•ด ??, ??= ๋“ฑ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽฏ

 

 


null ๊ฐ’ ๋‹ค๋ฃจ๊ธฐ (!, ??, ??= ์—ฐ์‚ฐ์ž ํ™œ์šฉ) ๋ณด์™„ ์„ค๋ช…

 

 

Dart์—์„œ๋Š” null ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ, 

๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


null safety๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด

 !, ??, ??= ์—ฐ์‚ฐ์ž์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

โœ” ! ์—ฐ์‚ฐ์ž (null์ด ์•„๋‹˜์„ ๋ณด์žฅํ•  ๋•Œ ์‚ฌ์šฉ)

void main() {
  String? name;
  print(name!.length); // โŒ ์˜ค๋ฅ˜ ๋ฐœ์ƒ (name์ด null์ผ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ)
}

 

  • ?? ์—ฐ์‚ฐ์ž๋Š” ๋ณ€์ˆ˜๊ฐ€ null์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • UI์—์„œ null ๊ฐ’์„ ํ‘œ์‹œํ•  ๋•Œ ๊ธฐ๋ณธ ํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์šฉ๋„๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

โœ” ?? ์—ฐ์‚ฐ์ž (null์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ)

void main() {
  String? name;
  print(name ?? '๊ธฐ๋ณธ ์ด๋ฆ„'); // ์ถœ๋ ฅ: ๊ธฐ๋ณธ ์ด๋ฆ„
}

 

 

  • ?? ์—ฐ์‚ฐ์ž๋Š” ๋ณ€์ˆ˜๊ฐ€ null์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • UI์—์„œ null ๊ฐ’์„ ํ‘œ์‹œํ•  ๋•Œ ๊ธฐ๋ณธ ํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์šฉ๋„๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

โœ” ??= ์—ฐ์‚ฐ์ž (null์ผ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๊ฐ’ ํ• ๋‹น)

void main() {
  String? message;
  message ??= '์ƒˆ๋กœ์šด ๊ฐ’'; // message๊ฐ€ null์ด๋ฉด '์ƒˆ๋กœ์šด ๊ฐ’' ํ• ๋‹น
  print(message); // ์ถœ๋ ฅ: ์ƒˆ๋กœ์šด ๊ฐ’
}

 

  • ??= ์—ฐ์‚ฐ์ž๋Š” null์ผ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š”๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก null safety ์—ฐ์‚ฐ์ž๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ

  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด null์ผ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณต (??)
  • ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ • (??=)
  • ๊ฐ’์ด null์ด ์•„๋‹ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ (!) - ๋‹จ, ์‚ฌ์šฉ ์‹œ ์ฃผ์˜!

โžก ์ด ์—ฐ์‚ฐ์ž๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋ฉด null๋กœ ์ธํ•œ ์˜ค๋ฅ˜๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์Œ! ๐Ÿš€

 


Step 4: late ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ๋ฒ• (๋ณ€์ˆ˜๋ฅผ ๋‚˜์ค‘์— ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ) ๋ณด์™„ ์„ค๋ช…

 

late ํ‚ค์›Œ๋“œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ

 ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ , 

๋‚˜์ค‘์— ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก 

๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.


๊ธฐ๋ณธ์ ์œผ๋กœ non-nullable ๋ณ€์ˆ˜๋Š”

 ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜์ง€๋งŒ, 

Flutter UI์—์„œ๋Š”

 ๊ฐ’์ด ๋‚˜์ค‘์— ์„ค์ •๋˜๋Š” 

๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—

 late๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

โœ” late ๋ณ€์ˆ˜ ์„ ์–ธ ํ›„ ๋‚˜์ค‘์— ๊ฐ’ ํ• ๋‹น

void main() {
  late String name;
  name = 'Flutter';
  print(name); // Flutter
}

 

  • late ํ‚ค์›Œ๋“œ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‚˜์ค‘์— ์ดˆ๊ธฐํ™”ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ, late ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

โœ” ํด๋ž˜์Šค์—์„œ late ์‚ฌ์šฉ ์˜ˆ์ œ

 

class User {
  late String name;

  void setName() {
    name = 'Alice';
  }

  void printName() {
    print(name);
  }
}

void main() {
  User user = User();
  user.setName();
  user.printName(); // Alice
}

late ์„ ์–ธ ์˜ˆ์ œ.txt
0.00MB

 

  • ํด๋ž˜์Šค ๋‚ด์—์„œ ๋ณ€์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธํ•˜์ง€๋งŒ, ์‹ค์ œ ๊ฐ’์€ ํŠน์ • ํ•จ์ˆ˜์—์„œ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’ก late ํ‚ค์›Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  • Flutter์—์„œ UI ์š”์†Œ๊ฐ€ ๋นŒ๋“œ๋œ ํ›„ ๊ฐ’์ด ํ• ๋‹น๋  ๊ฒฝ์šฐ
  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ ํ›„ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•  ๊ฒฝ์šฐ
  • ์ดˆ๊ธฐํ™” ์‹œ์ ์ด ์ค‘์š”ํ•  ๋•Œ (์˜ˆ: ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ ํ›„ ๊ฐ’์ด ์„ค์ •๋จ)

 

โžก late๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด null safety๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋ณ€์ˆ˜๋ฅผ ์œ ๋™์ ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Œ! ๐Ÿš€


Step 5: null safety๋ฅผ ํ™œ์šฉํ•œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๋ณด์™„ ์„ค๋ช…

 

Dart์˜ 

null safety ๊ธฐ๋Šฅ์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด 

Flutter UI์—์„œ๋„ 

์•ˆ์ •์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ” ํ•จ์ˆ˜์—์„œ nullable ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ

String? getUserName() {
  return null;
}

void main() {
  String userName = getUserName() ?? 'Guest';
  print(userName); // Guest
}

  • ?? ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ null์ด ๋ฐ˜ํ™˜๋˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ” Flutter UI์—์„œ null safety ํ™œ์šฉ ์˜ˆ์ œ

Widget build(BuildContext context) {
  String? title;
  return Text(title ?? '๊ธฐ๋ณธ ์ œ๋ชฉ'); // title์ด null์ด๋ฉด ๊ธฐ๋ณธ ์ œ๋ชฉ ์ถœ๋ ฅ
}
  • Flutter UI์—์„œ๋Š” nullable ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ํ•ญ์ƒ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ์ฝ”๋“œ๋Š” Futter ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค Flutter ๊ด€๋ จ ํŒจํ‚ค์ง€๋ฅผ  importํ•˜์ง€ ์•Š์œผ๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 
  • dart pad์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 
  • null safety๊ฐ€ ์ด๋Ÿฐ ํ˜•ํƒœ๋ผ๋Š” ๊ฒƒ๋งŒ ์•„์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š”. 

 

 

๐Ÿ’ก null safety๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์žฅ์ 

  • ์•ฑ์ด ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์ข…๋ฃŒ๋˜๋Š” ์ƒํ™ฉ์„ ์˜ˆ๋ฐฉ
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ null ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ๊ฐ์ง€ํ•˜์—ฌ ๋ฒ„๊ทธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
  • Flutter UI์—์„œ ์•ˆ์ •์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

 

โžก null safety๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ ์•ˆ์ •์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋จ! ๐Ÿš€


โ…ข. null safety๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• โœ…

 

null ์•ˆ์ „์„ฑ์„ ๊ณ ๋ คํ•œ ์ฝ”๋“œ ์Šคํƒ€์ผ

 

โœ… ๋ณ€์ˆ˜์— ?๋ฅผ ๋ถ™์ผ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒ๋‹จ
โœ… null ๊ฐ’์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ??, ??=, late๋ฅผ ์ ๊ทน ํ™œ์šฉ
โœ… null safety๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์•ˆ์ •์ ์ธ Flutter UI ๊ตฌํ˜„


null safety๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์žฅ์ 

 

โœ… null ๊ด€๋ จ ์˜ค๋ฅ˜ ๋ฐฉ์ง€ → ์•ฑ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”
โœ… Dart์˜ null safety๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”์—๋„ ๊ธฐ์—ฌ
โœ… Flutter ๊ฐœ๋ฐœ์—์„œ UI ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง

โžก null safety๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ ์•ˆ์ •์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋จ! ๐Ÿš€

 

์ฆ‰, Dart๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ

null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

(non-nullable by default)

nullable ๋ณ€์ˆ˜(?),

null ํ™•์ธ ์—ฐ์‚ฐ์ž(??, ??=),

late ํ‚ค์›Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ

null ์•ˆ์ „์„ฑ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ 

Flutter UI์—์„œ null safety๋ฅผ ํ™œ์šฉํ•˜๋ฉด

์•ฑ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ 

์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

728x90
728x90

'Flutter (์•ฑ ๊ฐœ๋ฐœ) > Dart ์ฝ”๋“œ ์ฒจ๋ถ€ ํŒŒ์ผ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Dart ๋ฐ˜๋ณต๋ฌธ] ๋ฐ˜๋ณต๋ฌธ(while, do-while, for) ํ™œ์šฉ๋ฒ•(๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ์ฒจ๋ถ€ ํŒŒ์ผ ์ œ๊ณต)  (1) 2025.02.24
[Dart ์กฐ๊ฑด๋ฌธ] Dart์—์„œ ์กฐ๊ฑด๋ฌธ(if, else, switch) ํ™œ์šฉํ•˜๊ธฐ(๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ์ฒจ๋ถ€ ํŒŒ์ผ ์ œ๊ณต)  (0) 2025.02.24
[Dart ๋ณ€์ˆ˜์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž…] Dart์˜ ๋ฆฌ์ŠคํŠธ(List)์™€ Set, Map ์ปฌ๋ ‰์…˜ ๊ฐœ๋…(๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ์ฒจ๋ถ€ ํŒŒ์ผ ์ œ๊ณต)  (0) 2025.02.23
[Dart ๋ณ€์ˆ˜์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž…] ์ˆซ์ž(Number) ํƒ€์ž…๊ณผ ์—ฐ์‚ฐ์ž ํ™œ์šฉ๋ฒ•(๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ์ฒจ๋ถ€ ํŒŒ์ผ ์ œ๊ณต)  (1) 2025.02.23
[Dart ๋ณ€์ˆ˜์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž…] Dart์—์„œ ๋ฌธ์ž์—ด(String) ๋‹ค๋ฃจ๊ธฐ ๋ฐ ์ฃผ์š” ๋ฉ”์„œ๋“œ(๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ์ฒจ๋ถ€ ํŒŒ์ผ ์ œ๊ณต)  (1) 2025.02.23