์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค. ์ค๋์ ๊ณต์๋ฌธ์ 20๋ฒ์งธ ์ฑํฐ ์ค์ฒฉ ํ์ ์ ๋ํด์ ๊ณต๋ถํ ๊ธ์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค. ์์ง ์ฑ๊ฐ๋ฐ์ ๋ง ํด๋ณธ ๊ฒฝํ์ด ์์ด์ ํด๋น ์ค์ฒฉํ์ ์ ๋ํด์๋ ์ฝ๊ฐ ์ ๋งค๋ชจํธํ๊ฒ ์ดํด๊ฐ ๋๋ ๊ฐ์ด ์์ง ์์ ์๋ค์. ์ฐจ์ฐจ ์ ์๊ฒ ๋๊ฒ์ฃ ? ใ ใ ์ผ๋จ ๊ธฐ์ด ๋นก์ธ๊ฒ ์ก์๋ด ์๋ค.
Swift Document chap.20 Nested Types ๋ฐ๋ก๊ฐ๊ธฐ
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 ์ ์ด๋ฆ์ ์๋์ ์ผ๋ก ์งง๊ฒ ์ ์งํ ์ ์๊ฒ ํ๋๋ฐ, ์์ ์ ์ ์ํ ๊ณณ์ด ์์ ์ ์ด๋ฆ์ ์์ฐ์ค๋ฝ๊ฒ ๊ท๋ช ํ๊ธฐ ๋๋ฌธ์ด๋ค.