๐Ÿ“š Today I Learned 14ํšŒ์ฐจ - Dart ์ปฌ๋ ‰์…˜ ์ œ์–ด ํ๋ฆ„ ๐Ÿ”„

2 ๋ถ„ ์†Œ์š”

๐Ÿ“– Dart ์ปฌ๋ ‰์…˜ ์ œ์–ด ํ๋ฆ„

๐Ÿค” ์งˆ๋ฌธ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ์—์„œ children ๋ฐฐ์—ด์— if ๋ฌธ์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ Container๊ฐ€ ํฌํ•จ๋˜๋Š” ํ˜•ํƒœ๋ฅผ ๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

children: [
  VideoPlayer(videoPlayerController!),
  if (showControls) Container(color: Colors.black.withOpacity(0.5)),
]

์ด ํ˜•ํƒœ๋Š” ์ฒ˜์Œ ๋ณด๋Š” ํ˜•ํƒœ์ธ๋ฐ, ์–ด๋–ป๊ฒŒ ๋ฌธ๋ฒ•์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฑธ๊นŒ์š”? if ๋ฌธ์„ {} ์•ˆ์— ๋‘์—ˆ์„ ๋•Œ๋Š” ์•ˆ๋๋Š”๋ฐ ๋ง์ด์ฃ .

๐Ÿ’ก ๋‹ต๋ณ€

๋„ค, ์ฒ˜์Œ ๋ณด์‹œ๋ฉด ๊ต‰์žฅํžˆ ์‹ ๊ธฐํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ ์ฝ”๋“œ๊ฐ€ ๋ฌธ๋ฒ•์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” Dart ์–ธ์–ด์—์„œ 2.3 ๋ฒ„์ „๋ถ€ํ„ฐ ๋„์ž…๋œ ์ปฌ๋ ‰์…˜ ์ œ์–ด ํ๋ฆ„(Collection Control Flow) ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ collection if ๋•๋ถ„์ž…๋‹ˆ๋‹ค.

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋ง์”€๋“œ๋ฆฌ๋ฉด, if๋ฌธ์ด {}(์ค‘๊ด„ํ˜ธ) ์—†์ด ์‚ฌ์šฉ๋  ๋•Œ ๋ฌธ(Statement)์ด ์•„๋‹Œ ํ‘œํ˜„์‹(Expression)์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๐Ÿ“š ์ฃผ์š” ๋‚ด์šฉ

1๏ธโƒฃ ๋ฌธ(Statement) vs ํ‘œํ˜„์‹(Expression)

์ด ๋ฌธ๋ฒ•์„ ์ดํ•ดํ•˜๋ ค๋ฉด ๋จผ์ € ๋‘ ๊ฐ€์ง€์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฌธ(Statement): ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค. ๊ทธ ์ž์ฒด๊ฐ€ ๊ฐ’์œผ๋กœ ํ‰๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•„๋Š” if (...) { ... }, for (...) { ... } ๋“ฑ์ด ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ํ‘œํ˜„์‹(Expression): ํ‰๊ฐ€๋˜์—ˆ์„ ๋•Œ ํ•˜๋‚˜์˜ ๊ฐ’(value)์„ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค. 1 + 2, isLoggedIn, Container() ๋“ฑ์ด ๋ชจ๋‘ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ if (...) { ... }๋Š” ๋ฌธ(Statement)์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ’์„ ๋„ฃ์–ด์•ผ ํ•˜๋Š” children ๋ฐฐ์—ด(List) ์•ˆ์— ์ง์ ‘ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ’๋“ค์˜ ๋ชจ์Œ์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

// โŒ ์ด๊ฑด ๋ฌธ๋ฒ•์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
// ๋ฆฌ์ŠคํŠธ ์•ˆ์—๋Š” '๊ฐ’'์ด ์™€์•ผ ํ•˜๋Š”๋ฐ, if "๋ฌธ"์ด ์™”๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
children: [
  VideoPlayer(videoPlayerController!),
  if (showControls) { // ์ค‘๊ด„ํ˜ธ๊ฐ€ ์žˆ๋Š” if "๋ฌธ"
    Container(color: Colors.black.withOpacity(0.5));
  }
]

2๏ธโƒฃ collection if์˜ ๋“ฑ์žฅ โœจ

Dart๋Š” ์ด๋Ÿฐ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ณ  ๋” ์„ ์–ธ์ ์ธ UI ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก collection if๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” if๋ฅผ ํ‘œํ˜„์‹์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ปฌ๋ ‰์…˜(List, Map, Set)์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŠน๋ณ„ํ•œ ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

// โœ… ์ด๋ ‡๊ฒŒ ์ค‘๊ด„ํ˜ธ ์—†์ด ์‚ฌ์šฉํ•˜๋ฉด 'collection if' ๋ฌธ๋ฒ•์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
children: [
  VideoPlayer(videoPlayerController!),

  // 'showControls'๊ฐ€ true์ด๋ฉด, ์ด ์ž๋ฆฌ์— Container()๋ผ๋Š” '๊ฐ’'์ด ํฌํ•จ๋œ๋‹ค.
  // false์ด๋ฉด, ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋œ๋‹ค.
  if (showControls) Container(color: Colors.black.withOpacity(0.5)),
]

์ด ์ฝ”๋“œ๋Š” โ€œ๋งŒ์•ฝ showControls๊ฐ€ true๋ผ๋ฉด ์ด ๋ฆฌ์ŠคํŠธ์— Container ์œ„์ ฏ์„ ํฌํ•จ์‹œ์ผœ์ค˜โ€ ๋ผ๋Š” ์˜๋ฏธ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ๊ณผ๊ฑฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ์„๊นŒ? ๐Ÿ•ฐ๏ธ

์ด ๋ฌธ๋ฒ•์ด ์—†๋˜ ์‹œ์ ˆ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋ฒˆ๊ฑฐ๋กญ์ฃ .

๋ฐฉ๋ฒ• 1: ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

๐Ÿ’ก ์กฐ๊ฑด์ด ๊ฐ„๋‹จํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

null์„ ๋„ฃ์œผ๋ฉด Flutter๊ฐ€ ๋นˆ ๊ณต๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ด์šฉํ•˜์ง€๋งŒ, ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋ฆฌ์ŠคํŠธ์— null์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

children: [
  VideoPlayer(videoPlayerController!),
  showControls ? Container(color: Colors.black.withOpacity(0.5)) : SizedBox.shrink(), // false์ผ ๋•Œ ๋นˆ ์œ„์ ฏ์„ ๋„ฃ์–ด์•ผ ํ•จ
]

๋ฐฉ๋ฒ• 2: ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค๊ณ  add ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด์—ˆ์ง€๋งŒ, ์œ„์ ฏ ํŠธ๋ฆฌ ์•ˆ์—์„œ ๋กœ์ง์ด ๋ถ„๋ฆฌ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ์žฅํ™ฉํ•ด์ง‘๋‹ˆ๋‹ค.

List<Widget> _buildChildren() {
  final children = <Widget>[
    VideoPlayer(videoPlayerController!),
  ];

  if (showControls) {
    children.add(Container(color: Colors.black.withOpacity(0.5)));
  }

  return children;
}

// ... build ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ ...
Column(
  children: _buildChildren(),
)

๐Ÿ’ก ๊ฒฐ๋ก : collection if๋Š” ์ด ๋ชจ๋“  ๋ฒˆ๊ฑฐ๋กœ์›€์„ ํ•œ ์ค„๋กœ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๋งค์šฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. collection for๋‚˜ spread(...) ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ณ  ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ

โœ… ์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ

  • ์ปฌ๋ ‰์…˜ ์ œ์–ด ํ๋ฆ„: Dart 2.3๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ฐ•๋ ฅํ•œ ๋ฌธ๋ฒ•
  • collection if: ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ปฌ๋ ‰์…˜์— ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€
  • ๋ฌธ vs ํ‘œํ˜„์‹: Statement์™€ Expression์˜ ์ฐจ์ด์ 
  • ์ฝ”๋“œ ๊ฐ„๊ฒฐ์„ฑ: ๊ณผ๊ฑฐ ๋ฐฉ๋ฒ• ๋Œ€๋น„ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ

๐Ÿš€ ์ถ”๊ฐ€ ํ•™์Šต ์ฃผ์ œ

  • collection for: ๋ฐ˜๋ณต๋ฌธ์„ ์ปฌ๋ ‰์…˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ
  • spread operator(...): ์ปฌ๋ ‰์…˜์„ ํŽผ์ณ์„œ ์š”์†Œ ์ถ”๊ฐ€
  • collection if-else: ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์š”์†Œ ์ถ”๊ฐ€

ํƒœ๊ทธ: , ,

์นดํ…Œ๊ณ ๋ฆฌ: ,

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ