Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift Documents

[Swift] ๊ณต์‹ ๋ฌธ์„œ ์ •๋ฆฌ (20) - Nested Types (์ค‘์ฒฉ ํƒ€์ž…)

๊ฐ์ž ๐Ÿฅ” 2022. 3. 10. 02:19
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์ž์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ๊ณต์‹๋ฌธ์„œ 20๋ฒˆ์งธ ์ฑ•ํ„ฐ ์ค‘์ฒฉ ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•œ ๊ธ€์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์•ฑ๊ฐœ๋ฐœ์„ ๋ง‰ ํ•ด๋ณธ ๊ฒฝํ—˜์ด ์—†์–ด์„œ ํ•ด๋‹น ์ค‘์ฒฉํƒ€์ž…์— ๋Œ€ํ•ด์„œ๋„ ์•ฝ๊ฐ„ ์• ๋งค๋ชจํ˜ธํ•˜๊ฒŒ ์ดํ•ด๊ฐ€ ๋˜๋Š” ๊ฐ์ด ์—†์ง€ ์•Š์•„ ์žˆ๋„ค์š”.  ์ฐจ์ฐจ ์ž˜ ์•Œ๊ฒŒ ๋˜๊ฒŸ์ฃ ? ใ…Žใ…Ž ์ผ๋‹จ ๊ธฐ์ดˆ ๋นก์„ธ๊ฒŒ ์žก์•„๋ด…์‹œ๋‹ค. 

Swift Document chap.20 Nested Types ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

Nested Types — The Swift Programming Language (Swift 5.6)

Nested Types Enumerations are often created to support a specific class or structure’s functionality. Similarly, it can be convenient to define utility classes and structures purely for use within the context of a more complex type. To accomplish this, S

docs.swift.org


 

Nested Types (์ค‘์ฒฉ ํƒ€์ž…)

์—ด๊ฑฐํ˜•์€ ๊ฐ€๋” ํŠน์ • ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋œ๋‹ค. ์ด์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ณต์žกํ•œ ํƒ€์ž…์˜ ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๊ทธ ์•ˆ์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ํ•ด๋‹น ๋ธ”๋ก ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ์—ด๊ฑฐํ˜•, ํด๋ž˜์Šค, ๊ตฌ์กฐ์ฒด๋ฅผ ์ค‘์ฒฉํ•ด์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค. ๋‹ค๋ฅธ ํƒ€์ž… ๋‚ด์— ํƒ€์ž…์„ ์ค‘์ฒฉํ•˜๋ ค๋ฉด ์ง€์›ํ•˜๋Š” ํƒ€์ž…์˜ ์™ธ๋ถ€ ์ค‘๊ด„ํ˜ธ ์•ˆ์— ์ •์˜๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.


 

Nested Types์˜ ์‚ฌ์šฉ ์˜ˆ์ œ

์•„๋ž˜ ์˜ˆ์ œ๋Š” ๋ธ”๋ž™์žญ ๊ฒŒ์ž„์„ ๊ตฌ์กฐ์ฒด๋กœ ์ •์˜ํ•œ ์ฝ”๋“œ์ด๋‹ค. BlackjackCard ๊ตฌ์กฐ์ฒด๋Š” suit์™€ Rank๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์ค‘์ฒฉ ์—ด๊ฑฐํ˜• ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค.

struct BlackjackCard {

  // ์ค‘์ฒฉ Suit ์—ด๊ฑฐ์ฒด
  enum Suit: Character {
    case spades = "♠", hearts = "โ™ก", diamonds = "โ™ข", clubs = "♣"
  }

  // ์ค‘์ฒฉ Rank ์—ด๊ฑฐ์ฒด
  enum Rank: Int {
    case two = 2, three, four, five, six, seven, eight, nine, ten
    case jack, queen, king, ace

    struct Values {
      let first: Int, second: Int?
    }
    var values: Values {
      switch self {
      case .ace:
        return Values(first: 1, second: 11)
      case .jack, .queen, .king:
        return Values(first: 10, second: nil)
      default:
        return Values(first: self.rawValue, second: nil)
      }
    }
  }

  // BlackjackCard ์˜ ์†์„ฑ ๋ฐ ๋ฉ”์†Œ๋“œ
  let rank: Rank, suit: Suit
  var description: String {
    var output = "suit is \\(suit.rawValue),"
    output += " value is \\(rank.values.first)"
    if let second = rank.values.second {
      output += " or \\(second)"
    }
    return output
  }
}
  • Suit ์—ด๊ฑฐํ˜• = ์ž์‹ ์˜ ๊ธฐํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Character ์›์‹œ๊ฐ’๊ณผ ์ผ๋ฐ˜ ๊ฒŒ์ž„์šฉ ์นด๋“œ์˜ ๋„ค ๊ฐ€์ง€ ํŒจ๋ฅผ ํ•จ๊ป˜ ์„ค๋ช…ํ•œ๋‹ค.
  • Rank ์—ด๊ฑฐํ˜•
    • ์นด๋“œ์˜ ์ˆซ์ž๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ด๋‹ค.
    • Rank ์—ด๊ฑฐํ˜• ์•ˆ์—๋Š” Values ๊ตฌ์กฐ์ฒด๊ฐ€ ๋˜ ๋‹ค๋ฅธ ์ค‘์ฒฉ ํƒ€์ž…์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด ace ์นด๋“œ๋Š” 1,11 ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ํ‘œํ˜„ํ•œ ๊ตฌ์กฐ์ฒด์ด๋‹ค.
      • ์ฆ‰, ๋Œ€๋ถ€๋ถ„์˜ ์นด๋“œ ๊ฐ’์€ ํ•˜๋‚˜์ด์ง€๋งŒ, ace ์นด๋“œ์˜ ๊ฐ’์—๋Š” ๋‘ ๊ฐœ์˜ ๊ฐ’์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์€๋‹‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
      • Values ๊ตฌ์กฐ์ฒด๋Š” ๋‘ ๊ฐœ์˜ ์†์„ฑ์„ ์ •์˜ํ•˜์—ฌ ์ด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. (first ํƒ€์ž…์€ Int, second ํƒ€์ž…์€ Int?)
    • Values ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” values ๋ผ๋Š” ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ๋„ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.
      • ์นด๋“œ ๊ฐ’์„ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์ƒˆ๋กœ์šด Values ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. (jack, queen, ace, king ์ด๋ฉด ํŠน์ˆ˜ํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ , ์ˆซ์ž์นด๋“œ๋ฉด Int ์›์‹œ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

BlackjackCard ๊ตฌ์กฐ์ฒด ๊ทธ ์ž์ฒด๋Š” rank ์™€ suit ๋‘ ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค. description ์ด๋ผ๋Š” ์†์„ฑ๋„ ์ •์˜ํ•˜๋Š”๋ฐ, ์ด๋Š” rank ์™€ suit์— ์ €์žฅํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์นด๋“œ์˜ ์ด๋ฆ„๊ณผ ๊ฐ’์˜ ์„ค๋ช…์„ ์ถœ๋ ฅํ•œ๋‹ค. description์˜ ์†์„ฑ์€ ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์—ฌ์ค„ second ๊ฐ’์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ , ๊ทธ๋Ÿด ๊ฒฝ์šฐ second ๊ฐ’์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์„ค๋ช…๋„ ์ถœ๋ ฅํ•œ๋‹ค. (ace๊ฐ€ second ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.)

  • ace ์นด๋“œ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž. BlackjackCard์˜ ํ”„๋กœํผํ‹ฐ์ธ description์—์„œ ๋งŒ์•ฝ Rank ๊ฐ€ ace๋ผ๋ฉด Rank์˜ Values ๊ตฌ์กฐ์ฒด์— first, second ๊ฐ’์— 1, 11์ด ํ• ๋‹น๋œ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ descriptionํ”„๋กœํผํ‹ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ second ๊ฐ’์€ ์˜ต์…”๋„ ํƒ€์ž…์ด๋ฏ€๋กœ ์—†์œผ๋ฉด ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ace๋Š” ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜๋ฆฌ๋˜์–ด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.
let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
print("theAceOfSpades: \\(theAceOfSpades.description)")
// "theAceOfSpades: suit is ♠, value is 1 or 11" ๋ฅผ ์ธ์‡„ํ•จ

BlackjackCard๋Š” ์ž์‹ ๋งŒ์˜ ์ƒ์„œ์ž๊ฐ€ ์—†๋Š” ๊ตฌ์กฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์—, ์•”์‹œ์ ์ธ memberwise ์ƒ์„ฑ์ž๋ฅผ ๊ฐ–๋Š”๋‹ค. (chap.14 initialization ์ฐธ๊ณ ) ์ด ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ theAceOfSpades ๋ผ๋Š” ์ƒˆ๋กœ์šด ์ƒ์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

Rank์™€ Suit๊ฐ€ BlackjackCard์•ˆ์— ์ค‘์ฒฉ๋˜์–ด ์žˆ์„ ์ง€๋ผ๋„, ์ด ํƒ€์ž…๋“ค์€ ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•ด์„œ .ace, .spades ๋ผ๋Š” ์ž์‹ ์˜ case ์ด๋ฆ„ ๋งŒ์œผ๋กœ๋„ ์ด ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ์—ด๊ฑฐํ˜• case๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„ ์˜ˆ์ œ์—์„œ๋Š” ์ŠคํŽ˜์ด๋“œ ์—์ด์Šค์—” 1 Or 11 ์˜ ๊ฐ’์ด ์žˆ์Œ์„ description์†์„ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณด๊ณ ํ•œ๋‹ค.

 


 

์ค‘์ฒฉ ํƒ€์ž… ์ฐธ์กฐํ•˜๊ธฐ

์ž์‹ ์„ ์ •์˜ํ•œ ๊ณณ ๋ฐ–์—์„œ ์ค‘์ฒฉํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ๊ทธ ์ด๋ฆ„์— ์ž์‹ ์„ ์ค‘์ฒฉํ•œ ํƒ€์ž…์˜ ์ด๋ฆ„์„ ์ ‘๋‘์‚ฌ๋กœ ๋ถ™์ธ๋‹ค.

let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
// heartsSymbol ์€ "โ™ก" ์ž„

์œ„ ์˜ˆ์ œ์—์„œ, ์ด๋Š” Suit, Rank, ๋ฐ Values ์˜ ์ด๋ฆ„์„ ์˜๋„์ ์œผ๋กœ ์งง๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š”๋ฐ, ์ž์‹ ์„ ์ •์˜ํ•œ ๊ณณ์ด ์ž์‹ ์˜ ์ด๋ฆ„์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ทœ๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ˜์‘ํ˜•