πŸ“š 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: 쑰건에 따라 λ‹€λ₯Έ μš”μ†Œ μΆ”κ°€

λŒ“κΈ€λ‚¨κΈ°κΈ°