1. ์—ด๊ฑฐํ˜• ๋ฌธ๋ฒ•
2. switch๋ฌธ๊ณผ ์‚ฌ์šฉํ•˜๊ธฐ
3. ์—ด๊ฑฐํ˜•์˜ ์ผ€์ด์Šค๋“ค์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์‹ถ์„ ๋•Œ(CaseIterable ํ”„๋กœํ† ์ฝœ)
4. ์—ฐ๊ด€๊ฐ’(Associated Values)
4-1. if, switch, guard, for, while๋ฌธ๊ณผ ์—ฐ๊ด€๊ฐ’ ๋งค์นญ to be continued,,
5. ์›์‹œ๊ฐ’(Raw Values)
5-1. ์•”์‹œ์ ์œผ๋กœ ํ• ๋‹น๋œ ์›์‹œ๊ฐ’(Implicitly Assigned Raw Values)
5-2. ์›์‹œ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”(Initializing from a Raw Value)
6. ์žฌ๊ท€ ์—ด๊ฑฐํ˜•(Recursive Enumerations)
7. ์—ด๊ฑฐํ˜•์˜ ์ผ€์ด์Šค๋“ค์„ ๋น„๊ตํ•˜๊ณ  ์‹ถ์„ ๋•Œ(Comparable ํ”„๋กœํ† ์ฝœ)
8. ๋ฉ”์†Œ๋“œ

 


 

์—ด๊ฑฐํ˜•(enumeration)์€ ๊ด€๋ จ๋œ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ทธ๋ฃน์„ ํ•˜๋‚˜์˜ ์ผ๋ฐ˜์ ์ธ ํƒ€์ž…์œผ๋กœ ์ •์˜ํ•ด์„œ ์ฝ”๋“œ์— ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

swift์˜ ์—ด๊ฑฐํ˜•์€ ํด๋กœ์ €์ฒ˜๋Ÿผ 1๊ธ‰ ๊ฐ์ฒด์ด๋‹ค.
1. ๊ณ„์‚ฐ ํ”„๋กœํผํ‹ฐ(computed property)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์—ด๊ฑฐํ˜•์˜ ํ˜„์žฌ ๊ฐ’์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
2. ์ธ์Šคํ„ด์Šค ๋ฉ”์†Œ๋“œ(instance method)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์—ด๊ฑฐํ˜•์ด ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์— ๊ด€๋ จ๋œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
3. ์ƒ์„ฑ์ž(initializer)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜• ์ผ€์ด์Šค์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
4. ๊ธฐ์กด ๊ตฌํ˜„์—์„œ ํ™•์žฅ(extension)์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
5. ํ”„๋กœํ† ์ฝœ(protocol)์„ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.
6. ์ €์žฅ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ์—ด๊ฑฐํ˜•์€ ๊ฐ’ ํƒ€์ž…์ด๋ผ๋Š” ์ ์—์„œ ์ฐธ์กฐ ํƒ€์ž…์ธ ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๋‹ค.

 

1. ์—ด๊ฑฐํ˜• ๋ฌธ๋ฒ•

์—ด๊ฑฐํ˜•์€ ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์ฒ˜๋Ÿผ enum ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์„ ์–ธํ•˜๊ณ , ํ•„์š”ํ•œ ๋งŒํผ ์ผ€์ด์Šค๋“ค์„ ๋‚˜์—ดํ•˜๋ฉด ๋œ๋‹ค. ๊ฐ ์ผ€์ด์Šค๋Š” ๊ทธ ์ž์ฒด๊ฐ€ ๊ณ ์œ ํ•œ ๊ฐ’์ด ๋œ๋‹ค.

 

enum SomeEnumeration {
    case CaseName1 
    case CaseName2
}

enum CompassPoint {
    case north
    case south
    case east
    case west
}
  • north, south, east, west๋“ค์€ ์—ด๊ฑฐํ˜•์˜ ์ผ€์ด์Šค(cases)๋“ค๋กœ, case ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ •์˜๋˜์—ˆ๋‹ค.

 

enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ผ€์ด์Šค๋“ค์€ ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•œ ์ค„๋กœ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

var directionToHead = CompassPoint.west
directionToHead = .east // ํƒ€์ž… ์ƒ๋žต
  • ์—ด๊ฑฐํ˜•๋„ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํƒ€์ž…์ฒ˜๋Ÿผ UpperCamelCase๋กœ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์ˆ˜ํ˜• ์ด๋ฆ„์œผ๋กœ ๋„ค์ด๋ฐํ•œ๋‹ค. ๊ฐ ์ผ€์ด์Šค๋“ค์€ lowerCamelCase๋ฅผ ๋”ฐ๋ฅด๊ธฐ์— ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๋˜ํ•œ ์—ด๊ฑฐํ˜•์„ ํ˜ธ์ถœํ•œ ์ดํ›„์™€ ๊ฐ™์ด ํƒ€์ž… ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” ํƒ€์ž…๋ช…์„ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

2. switch๋ฌธ๊ณผ ์‚ฌ์šฉํ•˜๊ธฐ

enum์€ switch๋ฌธ๊ณผ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์—ด๊ฑฐํ˜•์€ ํ•œ์ •๋œ ์ผ€์ด์Šค๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•˜๊ธฐ์—, switch๋ฌธ์˜ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ ์ตœ์ ์˜ ์กฐํ•ฉ์ด๋‹ค.

 

directionToHead = .south

switch directionToHead {
case .north:
    print("Lots of planets have a north")
case .south:
    print("Watch out for penguins")
case .east:
    print("Where the sun rises")
case .west:
    print("Where the skies are blue")
}

 

let somePlanet = Planet.earth
switch somePlanet {
case .earth:
    print("Mostly harmless")
default:
    print("Not a safe place for humans")
}
  • switch๋ฌธ์€ ๋ฐ˜๋“œ์‹œ ์—ด๊ฑฐํ˜•์˜ ๋ชจ๋“  case๋“ค์„ ์™„์ „ํžˆ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์—ด๊ฑฐํ˜•์˜ ์ผ€์ด์Šค๋“ค์ด ํ•œ์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ์ธ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  case๋“ค์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด default๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ๋งŒ์•ฝ case ํ•˜๋‚˜๋ผ๋„ ์ƒ๋žตํ•˜๋ฉด default๋ฅผ ๊ผฌ์˜ฅ ์จ์•ผ ํ•œ๋‹ค.

 

3. ์—ด๊ฑฐํ˜•์˜ ์ผ€์ด์Šค๋“ค์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์‹ถ์„ ๋•Œ

์—ด๊ฑฐํ˜•์˜ ๋ชจ๋“  ์ผ€์ด์Šค๋“ค์„ ์ˆœํšŒํ•˜๊ณ  ์‹ถ์„ ๋•Œ, CaseIterable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋ฉด allCases๋ผ๋Š” ํƒ€์ž… ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํ”„๋กœํผํ‹ฐ๋Š” ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ์ฝœ๋ ‰์…˜์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋˜๋ฉฐ, ์ผ€์ด์Šค๋“ค์˜ ๊ฐœ์ˆ˜(.count), for๋ฌธ์„ ํ†ตํ•œ ์ˆœํšŒ ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

enum Beverage: CaseIterable {
    case coffee, tea, juice
}

let numberOfChoices = Beverage.allCases.count // 3

for beverage in Beverage.allCases {
    print(beverage)
}
// coffee
// tea
// juice

 

But,, CaseIterable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ๋‹ค๊ณ  ๋‹ค allCases ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์˜ ์ผ€์ด์Šค๊ฐ€ ์—ฐ๊ด€๊ฐ’์„ ๊ฐ€์ง€๊ฑฐ๋‚˜, ํŠน์ • ์ผ€์ด์Šค๊ฐ€ @available ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ํŠน์ • ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ง์ ‘ allCases ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

4. ์—ฐ๊ด€๊ฐ’(Associated Values)

ํŠน์ • ์ผ€์ด์Šค์— ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•จ. ์—ฐ๊ด€๊ฐ’์€ ์–ด๋–ค ์ž๋ฃŒํ˜•์ด๋“  ๊ฐ€๋Šฅํ•˜๊ณ , ๊ฐœ์ˆ˜์˜ ์ œํ•œ๋„ ์—†๊ณ , ์ผ€์ด์Šค ๋ณ„๋กœ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์˜ ์—ฐ๊ด€๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ, ํ›„์ˆ ํ•  ์›์‹œ๊ฐ’๊ณผ ์—ฐ๊ด€๊ฐ’์€ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋„ํ•˜๋‹ค!

 

// 1๏ธโƒฃ
enum Code {
    case barCode(Int, Int, Int, Int)
    case qrCode(name: String)
        case codeBlue
}

// 2๏ธโƒฃ
var productBarcode = Code.barCode(8, 85909, 51226, 3)
productBarcode = .qrCode(name: "ABCDEFG")

// 3๏ธโƒฃ
switch productBarcode {
case .barCode(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(var productCode):
    print("QR code: \(productCode).")
case .codeBlue:
    print("์ฝ”๋“œ ๋ธ”๋ฃจ")
}

// 4๏ธโƒฃ
switch productBarcode {
case let .barCode(numberSystem, manufacturer, product, check):
    print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case var .qrCode(productCode):
    print("QR code: \(productCode).")
case .codeBlue:
    print("์ฝ”๋“œ ๋ธ”๋ฃจ")
}
  • 1๏ธโƒฃ
    • ์ผ€์ด์Šค ์ด๋ฆ„ ์˜†์— ํŠœํ”Œ ํ˜•ํƒœ๋กœ ์ผ€์ด์Šค์˜ ์—ฐ๊ด€๊ฐ’์œผ๋กœ ์›ํ•˜๋Š” ์ž๋ฃŒํ˜•์„ ํŠœํ”Œ ํ˜•ํƒœ๋กœ ๋ช…์‹œํ•˜๋ฉด ๋œ๋‹ค.
      • ์•ž์— ๋ ˆ์ด๋ธ”์„ ๋ถ™์ด๋Š” ๋„ค์ž„๋“œ ํŠœํ”Œ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค!
    • ๋‹ค๋ฅธ ์ผ€์ด์Šค๋“ค์ด ์—ฐ๊ด€๊ฐ’์„ ๊ฐ–๋Š”๋‹ค๊ณ  ๋ชจ๋“  ์ผ€์ด์Šค๋“ค์ด ์—ฐ๊ด€๊ฐ’์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†๋‹ค.
  • 2๏ธโƒฃ
    • ์—ด๊ฑฐํ˜•์„ ์ƒ์„ฑ/์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์—ฐ๊ด€๊ฐ’์˜ ๊ฐ’์„ ํ•จ๊ป˜ ์ „๋‹ฌํ•ด์ค€๋‹ค.
  • 3๏ธโƒฃ, 4๏ธโƒฃ
    • ์—ด๊ฑฐํ˜•์˜ ์—ฐ๊ด€๊ฐ’๊ณผ switch๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
    • case .์—ฐ๊ด€๊ฐ’(var/let ๋ณ€์ˆ˜๋ช…) ํ˜น์€ case var/let .์—ฐ๊ด€๊ฐ’(๋ณ€์ˆ˜๋ช…)์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ๋งค์นญ๋˜๋Š” ์—ฐ๊ด€๊ฐ’์„ ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋ชจ๋“  ์—ฐ๊ด€๊ฐ’์ด ๋™์ผํ•˜๊ฒŒ ๋ณ€์ˆ˜/์ƒ์ˆ˜๋กœ ์ถ”์ถœ๋œ๋‹ค๋ฉด, ์ผ€์ด์Šค ์•ž์— ํ•œ ๋ฒˆ๋งŒ ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค.

 

5. ์›์‹œ๊ฐ’(Raw Values)

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

 

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}
  • ์ผ€์ด์Šค ๋ณ„๋กœ Character ํƒ€์ž… ์•„์Šคํ‚ค ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

 

5-1. ์•”์‹œ์ ์œผ๋กœ ํ• ๋‹น๋œ ์›์‹œ๊ฐ’(Implicitly Assigned Raw Values)

์›์‹œ๊ฐ’์˜ ์ž๋ฃŒํ˜•์œผ๋กœ ์ •์ˆ˜๋‚˜ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฐ ์ผ€์ด์Šค ๋ณ„๋กœ ๊ผญ ๋ช…์‹œ์ ์œผ๋กœ ์›์‹œ๊ฐ’์„ ํ• ๋‹นํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋งŒ์•ฝ ์›์‹œ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด swift์—์„œ ์ž๋™์œผ๋กœ ๊ฐ’์„ ํ• ๋‹นํ•ด์ค€๋‹ค. ์›์‹œ๊ฐ’์˜ ์ž๋ฃŒํ˜•์ด Intํ˜•์ด๋ผ๋ฉด ์ฒซ ์ผ€์ด์Šค๋Š” 0์œผ๋กœ ์ •์˜๋˜๊ณ , ์ฐจ๋ก€๋Œ€๋กœ +1์”ฉ๋œ ๊ฐ’์œผ๋กœ ์ž๋™ ์ง€์ •๋œ๋‹ค. Stringํ˜•์ด๋ผ๋ฉด ์ผ€์ด์Šค์˜ ์ด๋ฆ„์„ ์›์‹œ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

But,, Characterํ˜•์€ ์•Œ์ž˜๋”ฑ๊น”์„ผ์ด ๋ถˆ๊ฐ€๋„ํ•˜๊ณ  ์ง์ ‘ ํ• ๋‹นํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ง์ ‘ ํ• ๋‹นํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ!

 

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

enum CompassPoint: String {
    case north, south, east, west
}

let earthsOrder = Planet.earth.rawValue // 3

let sunsetDirection = CompassPoint.west.rawValue // "west"
  • mercury์— 1์„ ์ง€์ •ํ•˜๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” mercury ๋‹ค์Œ ์ผ€์ด์Šค๋“ค์˜ ์›์‹œ๊ฐ’์œผ๋กœ +1์”ฉ๋œ ๊ฐ’์œผ๋กœ ์ž๋™ ํ• ๋‹นํ•ด์ค€๋‹ค. ๊ทธ๋ž˜์„œ earthsOrder์˜ ์›์‹œ๊ฐ’์ด 3์ด ๋œ๋‹ค.
  • String ํƒ€์ž…์„ ์›์‹œ๊ฐ’์˜ ์ž๋ฃŒํ˜•์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๊ณ  ์ดˆ๊ธฐํ™”์‹œํ‚ค์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ผ€์ด์Šค์˜ ์ด๋ฆ„์„ ์›์‹œ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. ๋”ฐ๋ผ์„œ west ์ผ€์ด์Šค๋Š” “west”๋ฅผ ์›์‹œ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

 

[์‹คํ—˜ 1] Q. ๋งŒ์•ฝ์— ์ผ€์ด์Šค ๊ฐ„์˜ ๊ณต์ฐจ๊ฐ€ 1์ด ์•„๋‹Œ 3์œผ๋กœ ๊ณต์ฐจ์ˆ˜์—ด์ฒ˜๋Ÿผ ๋งŒ๋“ค ์ˆ˜ ์—†์„๊นŒ?

A. ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค! ์›์‹œ๊ฐ’์„ ํ• ๋‹นํ•œ ์ผ€์ด์Šค์— ๋‹ฟ๊ธฐ ์ด์ „๊นŒ์ง€ ์ฒซ ์ผ€์ด์Šค 0๋ถ€ํ„ฐ 1์”ฉ ์ฆ๊ฐ€ํ•˜๊ณ , ์ผ€์ด์Šค ์ดํ›„๋กœ๋„ 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค,,

 

enum DataStructure: Int, CaseIterable {
    case array
    case linkedList
    case stack = 9
    case queue = 12
    case heap
    case tree
    case hashTable
    case graph
}

for item in DataStructure.allCases {
    print(item.rawValue)
}

 

0
1
9
12
13
14
15
16

 

[์‹คํ—˜ 2] Q. ์ผ€์ด์Šค์˜ ์›์‹œ๊ฐ’์ด 0์ผ ์ˆ˜ ์žˆ์„๊นŒ?

A. ๊ฐ€์žฅ ์ฒ˜์Œ ์ผ€์ด์Šค๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ๋ชจ๋“  ์ผ€์ด์Šค๋“ค์— ์›์‹œ๊ฐ’์„ ํ• ๋‹นํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค!
๋‹ค๋งŒ, ์ค‘๊ฐ„ ์ผ€์ด์Šค๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด Raw value for enum case is not unique๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.

 

enum DataStructure: Int, CaseIterable {
    case array = 0
    case linkedList
    case stack
    case queue
    case heap
    case tree
    case hashTable
    case graph
}

 

enum DataStructure: Int, CaseIterable {
    case array
    case linkedList
    case stack
    case queue
    case heap
    case tree
    case hashTable
    case graph
}

 

0
1
2
3
4
5
6
7

 

enum DataStructure: Int, CaseIterable {
    case array
    case linkedList
    case stack
    case queue
    case heap = 0
    case tree
    case hashTable
    case graph
}

 

[์‹คํ—˜ 3] Q. ์ผ€์ด์Šค์˜ ์›์‹œ๊ฐ’์ด ์Œ์ˆ˜์ผ ์ˆ˜ ์žˆ์„๊นŒ?

A. ๊ฐ€์žฅ ์ฒ˜์Œ ์ผ€์ด์Šค๋‚˜ ์ค‘๊ฐ„ ์ผ€์ด์Šค๋ฅผ ์Œ์ˆ˜๋กœ ์„ค์ •ํ•ด๋ดค๋”๋‹ˆ ๊ฐ€๋Šฅํ•˜๋‹ค! ๋ฌผ๋ก  ์›์‹œ๊ฐ’์„ ๋„ฃ์–ด์ค€ ์ผ€์ด์Šค์— ์˜ค๊ธฐ ์ „๊นŒ์ง€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ํ˜•ํƒœ์˜€๋‹ค.

 

enum DataStructure: Int, CaseIterable {
    case array = -100
    case linkedList
    case stack
    case queue
    case heap = -10
    case tree
    case hashTable
    case graph
}

 

-100 // array
-99
-98
-97
-10 // heap
-9
-8
-7

 

5-2. ์›์‹œ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”(Initializing from a Raw Value)

์›์‹œ๊ฐ’์„ ํ†ตํ•ด ์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜/์ƒ์ˆ˜๋ฅผ ์ƒ์„ฑ/์ดˆ๊ธฐํ™”ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์›์‹œ๊ฐ’๊ณผ ๋งค์นญ๋˜๋Š” ์ผ€์ด์Šค๊ฐ€ ์—†๋‹ค๋ฉด, ์›์‹œ๊ฐ’์„ ํ†ตํ•ด ์ดˆ๊ธฐํ™”ํ•œ ์ธ์Šคํ„ด์Šค๋Š” ์˜ต์…”๋„ ํƒ€์ž…์ด๋‹ค. ์ฆ‰, ๋งŒ์•ฝ ์—†๋Š” ์›์‹œ๊ฐ’์„ ํ†ตํ•ด ์—ด๊ฑฐํ˜•์„ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด nil์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

enum Planet: Int {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

let possiblePlanet = Planet(rawValue: 2)

let positionToFind = 2
if let somePlanet = Planet(rawValue: positionToFind) {
    switch somePlanet {
    case .earth:
        print("๐Ÿ’š")
    default:
        print("๐Ÿ’™")
    }
} else {
    print("๐Ÿ’œ")
}
  • ์›์‹œ๊ฐ’์„ ์ง์ ‘ ํ• ๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ€์žฅ ์ฒซ ์ผ€์ด์Šค๋ถ€ํ„ฐ 0์œผ๋กœ ์ž๋™ ๋ฐฐ์ •ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— possiblePlanet๋Š” Planet.earth๊ฐ€ ๋˜์ง€๋งŒ, ์˜ต์…”๋„ Planet ํƒ€์ž…์ด๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์ด ํ•„์š”ํ•˜๋‹ค.
  • positionToFind๊ฐ€ 2๋ผ๋ฉด ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ๋œ somePlanet์ด Planet.earth๋กœ ์ดˆ๋ก์ƒ‰ ํ•˜ํŠธ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
    • 3์ด๋ผ๋ฉด ํŒŒ๋ž€์ƒ‰ ํ•˜ํŠธ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ์กด์žฌํ•˜๋Š” ์›์‹œ๊ฐ’์œผ๋กœ ์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ํ†ต๊ณผํ•˜์ง€๋งŒ Planet.earth๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— default๋ฌธ์— ๊ฑธ๋ฆฐ๋‹ค.
    • -1์ด๋ผ๋ฉด ๋ณด๋ผ์ƒ‰ ํ•˜ํŠธ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. Planet์— ์—†๋Š” ์›์‹œ๊ฐ’์œผ๋กœ ์˜ต์…”๋„์ด๊ธฐ์—.

 

[์‹คํ—˜ 4] Q. ๋งŒ์•ฝ์— ์—†๋Š” ์›์‹œ๊ฐ’์œผ๋กœ ์—ด๊ฑฐํ˜•์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค๋ฉด?

A. ์˜ต์…”๋„ Planet ํƒ€์ž…์ด์ง€๋งŒ, ์—ด๊ฑฐํ˜•์— ์—†๋Š” ์›์‹œ๊ฐ’์ด๋ฏ€๋กœ ๊ฐ’์€ nil์ด ๋œ๋‹ค. ๋˜ํ•œ ์›์‹œ๊ฐ’๋„ nil์ด ๋œ๋‹ค.

 

let samplePlanet = Planet(rawValue: -1)

print(samplePlanet) // nil
print(samplePlanet?.rawValue) // nil
print(samplePlanet is Planet) // false
print(samplePlanet is Planet?) // true

 

6. ์žฌ๊ท€ ์—ด๊ฑฐํ˜•(Recursive Enumerations)

๋‹ค๋ฅธ ํ˜น์€ ๊ฐ™์€ ์—ด๊ฑฐํ˜•์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฐ๊ด€๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” ์—ด๊ฑฐํ˜•์ด๋‹ค. ์—ด๊ฑฐํ˜•์˜ ์ผ€์ด์Šค๊ฐ€ ์žฌ๊ท€์ ์ž„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด indirect ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋Š”๋ฐ, ์žฌ๊ท€ํ•˜๋Š” ์ผ€์ด์Šค ์•ž์— ๋ถ™์ด๊ฑฐ๋‚˜(1๏ธโƒฃ) ํ˜น์€ ๋ชจ๋“  ์ผ€์ด์Šค๋“ค์— ๋Œ€ํ•ด ์ ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ์—๋Š” ์—ด๊ฑฐํ˜• ์„ ์–ธ ์ „์— ๋ถ™์ธ๋‹ค(2๏ธโƒฃ).

 

// 1๏ธโƒฃ
enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

// 2๏ธโƒฃ
indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

 

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}

print(evaluate(product)) // 18

 

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ๋“ฑ ์ˆœํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ๋•Œ์—๋„ indirect ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฑฐ์Šจ to be continued,,

 

7. ๋น„๊ต ๊ฐ€๋Šฅํ•œ ์—ด๊ฑฐํ˜•

์—ด๊ฑฐํ˜•์€ Comparable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋ฉด ๊ฐ ์ผ€์ด์Šค๋“ค์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ€์ด์Šค๋Š” ์•ž์— ์œ„์น˜ํ• ์ˆ˜๋ก ํฌ๊ธฐ๊ฐ€ ์ž‘๋‹ค.

 

8. ๋ฉ”์†Œ๋“œ

์—ด๊ฑฐํ˜•์—๋„ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

enum DataStructure: String, CaseIterable {
    case array = "๋ฐฐ์—ด(Array)"
    case linkedList = "์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)"
    case stack = "์Šคํƒ(Stask)"
    case queue = "ํ(Queue)"
    case heap = "ํž™(Heap)"
    case tree = "ํŠธ๋ฆฌ(Tree)"
    case hashTable = "ํ•ด์‹œ ํ…Œ์ด๋ธ”(Hash Table)"
    case graph = "๊ทธ๋ž˜ํ”„(Graph)"
    
    func description() -> String {
        let feature: String
        
        switch self {
        case .array: feature = "๋ฐ์ดํ„ฐ ์š”์†Œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ"
        case .linkedList: feature = "๋ฐ์ดํ„ฐ ์š”์†Œ์˜ ๋…ธ๋“œ๊ฐ€ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋กœ ๊ตฌ์ •๋œ ์ž๋ฃŒ๊ตฌ์กฐ"
        case .stack: feature = "LIFO(Last In First Out). ํ›„์ž…์„ ์ถœ๋กœ ๋™์ž‘ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ"
        case .queue: feature = "FIFO(First In First Out). ์„ ์ž…์„ ์ถœ๋กœ ๋™์ž‘ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ"
        case .heap: feature = "์ตœ๋Œ€๊ฐ’/์ตœ์†Œ๊ฐ’์„ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์™„์ „์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ"
        case .tree: feature = "๊ณ„์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ"
        case .hashTable: feature = "ํ‚ค(key)-๊ฐ’(value) ์Œ์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ"
        case .graph: feature = "๋…ธ๋“œ(์ •์ )์™€ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„ (์—ฃ์ง€)์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ž๋ฃŒ๊ตฌ์กฐ"
        }
        
        return "\(self.rawValue): \(feature)"
    }
}

print(DataStructure.hashTable.description()) // ํ•ด์‹œ ํ…Œ์ด๋ธ”(Hash Table): ํ‚ค(key)-๊ฐ’(value) ์Œ์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ

 

 


 

์ฐธ๊ณ  ์ž๋ฃŒ

 

Swift) ์—ด๊ฑฐํ˜•(Enumeration) ์‹ฌํ™”ํŽธ

์•ˆ๋…•ํ•˜์„ธ์š”, ์†Œ๋“ค์ž…๋‹ˆ๋‹ค :) ์š”์ฆ˜ ํฌ์ŠคํŒ…์„ ์ž˜ ์•ˆํ•˜๊ฒŒ ๋˜๋Š” ๊ฑฐ ๊ฐ™์•„์š” ์ธ์ƒ ์š”์ฆ˜ ์ œ ๋ชจํ† ๋Š” ์ •๋ง ํ•˜๊ธฐ ์‹ซ์€ ์ผ์ด ์žˆ์„ ๋•Œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ทธ ์ผ์„ ๋นจ๋ฆฌ ํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ ์–ด.. ์ €๋„

babbab2.tistory.com

 

[Swift] ์—ฐ๊ด€๊ฐ’ (Associated Values)

์—ฐ๊ด€๊ฐ’?

sweetfood-dev.github.io

 

[Swift Language Guide] Enumerations(์—ด๊ฑฐํ˜•)

์•ˆ๋…•ํ•˜์„ธ์š”! ๋ฆด๋ฆฌ์ž…๋‹ˆ๋‹ค๐Ÿ™‹๐Ÿป‍โ™€๏ธ ์˜ค๋Š˜์€ Swift Language Guide์˜ Enumerations ํŒŒํŠธ๋ฅผ ์ฝ์–ด๋ณด๊ณ  ๊ณต๋ถ€ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ‘

velog.io

 

enum ์‚ดํŽด๋ณด๊ธฐ - ์‚ฌ์šฉ๋ฒ•

enumeration, ์ค„์—ฌ์„œ enum์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ(์—ด๊ฑฐํ˜•์ด๋ผ๊ณ  ๋ฒˆ์—ญ๋ฉ๋‹ˆ๋‹ค.)์€ ์˜๋ฏธ์ƒ์œผ๋กœ ๊ด€๋ จ๋œ ๊ฐ’๋“ค์— ํŠน๋ณ„ํ•œ ์ด๋ฆ„์„ ๋ถ™์—ฌ ๋ชจ์•„๋†“์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Swift์—์„œ์˜ enum์€ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋ณด๋‹ค ํ›จ์”ฌ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„

jcsoohwancho.github.io

 

[Swift ๊ณต์‹๋ฌธ์„œ ์ฝ๊ธฐ]Enumerations

์•ˆ๋…•ํ•˜์„ธ์š”. ์—˜๋ฆผ์ž…๋‹ˆ๋‹ค๐Ÿ™‡๐Ÿป‍โ™€๏ธ Swift ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ •๋…ํ•˜๊ธฐ 8ํŽธ์ž…๋‹ˆ๋‹ค! ์ œ ์Šคํƒ€์ผ๋Œ€๋กœ ์ •๋ฆฌํ–ˆ์œผ๋‹ˆ ์ถ”๊ฐ€์ ์œผ๋กœ ๋” ํ•„์š”ํ•œ ์ •๋ณด๋Š”๊ณต์‹๋ฌธ์„œ ๋งํฌ๋ฅผ ๋ˆŒ๋Ÿฌ ํ™•์ธํ•ด์ฃผ์„ธ์šฉ! ์ข€ ๋” ํŽธํ•˜๊ฒŒ ๋ณด๊ธฐ์œ„ํ•ด

velog.io

 

[Swift] Enum ์—ด๊ฑฐํ˜• ์ •๋ณตํ•˜๊ธฐ 1ํŽธ (Raw, Associated Values)

์—ด๊ฑฐํ˜•(Enumeration)์€ ์—ฐ๊ด€๋œ ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ์„ ๊ณตํ†ต๋œ ํƒ€์ž…์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ด๊ฑฐํ˜•์€ type-safe ํ•˜๊ฒŒ ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์ฃ . ์ฃผ๋กœ ์š”์ผ๊ณผ ๊ฐ™์ด ํ•œ์ •๋œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ

onelife2live.tistory.com

 

'Swift ๊ธฐ๋ณธ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift] Result  (0) 2024.08.14
[Swift] Hashable ํ”„๋กœํ† ์ฝœ  (0) 2024.05.24
[Swift] enumerated()  (0) 2024.05.24
[Swift] ํƒ€์ž… ์บ์ŠคํŒ…(Type Casting)  (0) 2024.02.02
user-img ๋“คํŒ์„์ง€๋‚˜๋Šช์ง€๋Œ€๋ฅผ๊ฑด๋„ˆ
kiln
ํ˜„์žฌ๊ธ€
[Swift] ์—ด๊ฑฐํ˜•(Enumeration)
ํ•จ๊ป˜ ๋ณด๋ฉด ์ข‹์„ ํฌ์ŠคํŠธ