๊ด€๋ฆฌ ๋ฉ”๋‰ด

ruriruriya

[Dart] Null Safety์˜ ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  late ํ‚ค์›Œ๋“œ ๋ณธ๋ฌธ

๐Ÿ“ฑFlutter/Dart

[Dart] Null Safety์˜ ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  late ํ‚ค์›Œ๋“œ

๋ฃจ๋ฆฌ์•ผใ…‘ 2024. 12. 18. 13:36
๋ฐ˜์‘ํ˜•

Dart ์–ธ์–ด์—์„œ๋Š” Null Safe๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ๋Š”๋ฐ
์ด๋Š” ๋ณ€์ˆ˜์— null ๊ฐ’์„ ํ—ˆ์šฉํ• ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๊ธฐ๋Šฅ์€ NullPointerExcaption ๋“ฑ๊ณผ ๊ฐ™์€ null๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

1. Dart ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ null์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.

์ฆ‰, null์„ ํ—ˆ์šฉํ•˜๋Š” ํ‘œ์‹œ๊ฐ€ ์—†๋‹ค๋ฉด ์ ˆ๋Œ€. null์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.

null์„ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐํƒ€์ž… ๋’ค์— '?' ๋ฌผ์Œํ‘œ๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค.
(์ฝ”ํ‹€๋ฆฐ๋„ ๋น„์Šทํ•œ ๊ฐœ๋…์ด์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๋“ฏ ํ•˜๋‹ค.)

Null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜ ์˜ˆ์‹œ

void main() {
  int number = 10; // null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜
  print(number);

  // number = null; // ์˜ค๋ฅ˜! null ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์—†์Œ.
}

 

Null์„ ํ—ˆ์šฉํ•˜๋Š” ๋ณ€์ˆ˜ ์˜ˆ์‹œ

void main() {
  int? number = null; // null์„ ํ—ˆ์šฉํ•˜๋Š” ๋ณ€์ˆ˜
  print(number); // ์ถœ๋ ฅ: null

  number = 20; // ๋‚˜์ค‘์— ๊ฐ’์„ ํ• ๋‹น
  print(number); // ์ถœ๋ ฅ: 20
}

 

2. Null ๊ธฐ๋ณธ๊ฐ’ ์ฒ˜๋ฆฌ(default value)

๋งŒ์•ฝ null์ด๋ผ๋ฉด null๋กœ ๋‚˜์˜ค์ง€ ์•Š๊ฒŒ ์ด ๊ฐ’์œผ๋กœ ๋Œ€์‹  ์“ฐ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋Š” null์ด๋ผ๋ฉด 10์„ ๋Œ€์‹  ์ถœ๋ ฅํ•˜๋ผ๋Š” ์ฝ”๋“œ์ด๋‹ค.

void main() {
  int? number = null;

  // number๊ฐ€ null์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’ 10์„ ์‚ฌ์šฉ
  print(number ?? 10); // ์ถœ๋ ฅ: 10
}

๋งˆ์ง€๋ง‰ number์˜ ๊ฐ’์€ 10์ด๊ธฐ ๋•Œ๋ฌธ์—
๋‹ค์‹œ ??= ์œผ๋กœ ๋‹ค๋ฅธ ๊ฐ’, ์˜ˆ๋ฅผ ๋“ค๋ฉด 20์„ ์„ค์ •ํ•œ๋‹ค๋ฉด 10์ด ๋‚˜์˜จ๋‹ค.
์™œ๋ƒํ•˜๋ฉด null์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ๊ฐ’์ด ์œ ์ง€๋œ๋‹ค.

 

3. Null Safety ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ๋ฒ•

null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ

String name์€ null์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— null ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.

void greet(String name) {
  print("์•ˆ๋…•ํ•˜์„ธ์š”, $name๋‹˜!");
}

void main() {
  greet("ํ™๊ธธ๋™"); // ์ •์ƒ ์ถœ๋ ฅ
  // greet(null); // ์˜ค๋ฅ˜ ๋ฐœ์ƒ: name์— null์„ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Œ.
}

 

null์„ ํ—ˆ์šฉํ•˜๋Š” ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ

String?๋กœ ์„ ์–ธํ•˜๋ฉด null ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , null์ผ ๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ง€ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.(if ๋ฌธ)

void greet(String? name) {
  if (name != null) { //name์˜ ๊ฐ’์ด null์ด ์•„๋‹ˆ๋ฉด
    print("์•ˆ๋…•ํ•˜์„ธ์š”, $name๋‹˜!");
  } else { // name์˜ ๊ฐ’์ด null์ด๋ผ๋ฉด
    print("์•ˆ๋…•ํ•˜์„ธ์š”, ์†๋‹˜!");
  }
}

void main() {
  greet(null); // ์ถœ๋ ฅ: ์•ˆ๋…•ํ•˜์„ธ์š”, ์†๋‹˜!
  greet("ํ™๊ธธ๋™"); // ์ถœ๋ ฅ: ์•ˆ๋…•ํ•˜์„ธ์š”, ํ™๊ธธ๋™๋‹˜!
}

 

4. late ํ‚ค์›Œ๋“œ

late ํ‚ค์›Œ๋“œ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‚˜์ค‘์— ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
ํ•˜์ง€๋งŒ null์ด ์•„๋‹˜์„ ๋ณด์žฅํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ
late๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์ดˆ๊ธฐ๊ฐ’์„ ์ฃผ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ, ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๊ฐ’์„ ์„ค์ •(์ดˆ๊ธฐํ™”)ํ•ด์•ผ ํ•œ๋‹ค.

void main() {
  late String name; // ๋‚˜์ค‘์— ์ดˆ๊ธฐํ™”๋  ๋ณ€์ˆ˜
  name = "ํ™๊ธธ๋™"; // ์ดˆ๊ธฐํ™”
  print(name); // ์ถœ๋ ฅ: ํ™๊ธธ๋™
}

 

๋ฐ˜์‘ํ˜•