πŸ₯– Bread Basics/Swift

Swift 곡식 λ¬Έμ„œ 정리 - μ—΄κ±°ν˜• (Enumerations)

BreadDev 2025. 4. 11. 09:52
728x90

μ•ˆλ…•ν•˜μ„Έμš”. μ΄λ²ˆμ—λŠ” μ—΄κ±°ν˜•(Enumeration)에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

πŸ“Œ μ—΄κ±°ν˜•μ΄λž€?

**μ—΄κ±°ν˜•(Enumeration)**은 κ΄€λ ¨λœ κ°’λ“€μ˜ 그룹을 μœ„ν•œ μ‚¬μš©μž μ •μ˜ νƒ€μž…μœΌλ‘œ, μ½”λ“œμ—μ„œ νƒ€μž…-세이프 λ°©μ‹μœΌλ‘œ μž‘μ—…ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

νƒ€μž…-세이프: μ»΄νŒŒμΌλŸ¬κ°€ μ½”λ“œμ˜ νƒ€μž… μ•ˆμ „μ„±μ„ κ²€μ‚¬ν•˜μ—¬ νƒ€μž… 뢈일치둜 μΈν•œ 였λ₯˜λ₯Ό λ°©μ§€ν•˜λŠ” νŠΉμ„±

Cμ–Έμ–΄μ˜ μ—΄κ±°ν˜•μ΄ λ‹¨μˆœνžˆ μ •μˆ˜κ°’μ— 이름을 λΆ€μ—¬ν•˜λŠ” 것과 달리, Swift의 μ—΄κ±°ν˜•μ€:

  • μ •μˆ˜κ°’μ„ κ°€μ§ˆ ν•„μš”κ°€ μ—†μŒ
  • λ¬Έμžμ—΄, 문자, μ •μˆ˜, λΆ€λ™μ†Œμˆ˜μ  λ“± λ‹€μ–‘ν•œ νƒ€μž…μ˜ μ›μ‹œκ°’ μ‚¬μš© κ°€λŠ₯
  • μ—°κ΄€κ°’(associated values)을 톡해 각 μΌ€μ΄μŠ€μ— μΆ”κ°€ 정보 μ €μž₯ κ°€λŠ₯
  • λ©”μ„œλ“œμ™€ κ³„μ‚°λœ ν”„λ‘œνΌν‹°λ₯Ό κ°€μ§ˆ 수 있음
  • μ΄ˆκΈ°ν™” ꡬ문과 ν™•μž₯ κΈ°λŠ₯ 제곡
  • ν”„λ‘œν† μ½œ μ€€μˆ˜ κ°€λŠ₯

πŸ“Œ μ—΄κ±°ν˜• κΈ°λ³Έ ꡬ문

// κΈ°λ³Έ μ—΄κ±°ν˜• μ •μ˜
enum CompassPoint {
    case north
    case south
    case east
    case west
}

// ν•œ μ€„λ‘œ μž‘μ„±ν•˜λŠ” 방법
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

enum: μ—΄κ±°ν˜•μ„ μ •μ˜ν•˜λŠ” ν‚€μ›Œλ“œ

case: μ—΄κ±°ν˜•μ˜ 각 μΌ€μ΄μŠ€(κ°’)λ₯Ό μ •μ˜ν•˜λŠ” ν‚€μ›Œλ“œ

μ—΄κ±°ν˜• κ°’ μ‚¬μš©ν•˜κΈ°

var directionToHead = CompassPoint.west
// νƒ€μž…μ΄ 이미 μ•Œλ €μ§„ 경우 더 짧은 점 ꡬ문 μ‚¬μš© κ°€λŠ₯
directionToHead = .east

πŸ“Œ 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")
}
// "Watch out for penguins" 좜λ ₯

μ€‘μš”: Swift의 switch 문은 μ—΄κ±°ν˜• μΌ€μ΄μŠ€λ₯Ό μ²˜λ¦¬ν•  λ•Œ μ™„μ „ν•΄μ•Ό ν•©λ‹ˆλ‹€. λͺ¨λ“  μΌ€μ΄μŠ€λ₯Ό 닀루지 μ•ŠμœΌλ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. λͺ¨λ“  μΌ€μ΄μŠ€λ₯Ό 각각 μ²˜λ¦¬ν•˜κ³  μ‹Άμ§€ μ•Šμ€ 경우 default μΌ€μ΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ μ—΄κ±°ν˜• μΌ€μ΄μŠ€ λ°˜λ³΅ν•˜κΈ°

CaseIterable ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜λ©΄ μ—΄κ±°ν˜•μ˜ λͺ¨λ“  μΌ€μ΄μŠ€λ₯Ό μˆ˜μ§‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

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

// μΌ€μ΄μŠ€ 수 μ–»κΈ°
let numberOfChoices = Beverage.allCases.count
print("\(numberOfChoices) beverages available")
// "3 beverages available" 좜λ ₯

// λͺ¨λ“  μΌ€μ΄μŠ€ λ°˜λ³΅ν•˜κΈ°
for beverage in Beverage.allCases {
    print(beverage)
}
// coffee, tea, juice 좜λ ₯

CaseIterable: μ—΄κ±°ν˜•μ— λͺ¨λ“  μΌ€μ΄μŠ€μ˜ μ»¬λ ‰μ…˜μ„ μ œκ³΅ν•˜λŠ” ν”„λ‘œν† μ½œ

πŸ“Œ μ—°κ΄€ κ°’(Associated Values)

μ—΄κ±°ν˜•μ˜ 각 μΌ€μ΄μŠ€μ— λ‹€λ₯Έ νƒ€μž…μ˜ μΆ”κ°€ 정보λ₯Ό μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

enum Barcode {
    case upc(Int, Int, Int, Int)  // UPC λ°”μ½”λ“œ: 숫자 μ‹œμŠ€ν…œ, μ œμ‘°μ—…μ²΄ μ½”λ“œ, μ œν’ˆ μ½”λ“œ, 검사 숫자
    case qrCode(String)           // QR μ½”λ“œ: λ¬Έμžμ—΄ 데이터
}

// μ—°κ΄€ 값을 κ°€μ§„ μ—΄κ±°ν˜• μ‚¬μš©ν•˜κΈ°
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

μ—°κ΄€ κ°’: μ—΄κ±°ν˜• μΌ€μ΄μŠ€μ™€ ν•¨κ»˜ μ €μž₯λ˜λŠ” μΆ”κ°€ μ •λ³΄λ‘œ, μΌ€μ΄μŠ€κ°€ μ‚¬μš©λ  λ•Œλ§ˆλ‹€ λ‹€λ₯Έ 값을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

switch 문으둜 μ—°κ΄€ κ°’ μΆ”μΆœν•˜κΈ°

switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check)")
case .qrCode(let productCode):
    print("QR code: \(productCode)")
}
// "QR code: ABCDEFGHIJKLMNOP" 좜λ ₯

// 더 κ°„κ²°ν•œ 방법
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
    print("UPC: \(numberSystem), \(manufacturer), \(product), \(check)")
case let .qrCode(productCode):
    print("QR code: \(productCode)")
}

πŸ“Œ μ›μ‹œ κ°’(Raw Values)

μ—΄κ±°ν˜•μ˜ 각 μΌ€μ΄μŠ€μ— λ™μΌν•œ νƒ€μž…μ˜ 기본값을 μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

μ›μ‹œ κ°’: μ—΄κ±°ν˜•μ„ μ •μ˜ν•  λ•Œ 각 μΌ€μ΄μŠ€μ— 미리 μ„€μ •ν•˜λŠ” κ°’μœΌλ‘œ, λͺ¨λ“  μΌ€μ΄μŠ€μ—μ„œ λ™μΌν•œ νƒ€μž…μ„ κ°€μ§‘λ‹ˆλ‹€.

μ•”μ‹œμ μœΌλ‘œ ν• λ‹Ήλœ μ›μ‹œ κ°’

μ •μˆ˜λ‚˜ λ¬Έμžμ—΄ μ›μ‹œ 값을 κ°€μ§„ μ—΄κ±°ν˜•μ€ λͺ…μ‹œμ μΈ 값을 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μžλ™μœΌλ‘œ 값이 ν• λ‹Ήλ©λ‹ˆλ‹€:

// μ •μˆ˜ μ›μ‹œ κ°’μ˜ 경우: 이전 μΌ€μ΄μŠ€λ³΄λ‹€ 1 증가
enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
// venusλŠ” 2, earthλŠ” 3, ...

// λ¬Έμžμ—΄ μ›μ‹œ κ°’μ˜ 경우: μΌ€μ΄μŠ€ 이름과 같은 λ¬Έμžμ—΄
enum CompassPoint: String {
    case north, south, east, west
}
// northλŠ” "north", southλŠ” "south", ...

μ›μ‹œ κ°’ μ ‘κ·Όν•˜κΈ°

let earthsOrder = Planet.earth.rawValue  // 3
let sunsetDirection = CompassPoint.west.rawValue  // "west"

μ›μ‹œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜κΈ°

// μ›μ‹œ κ°’μœΌλ‘œλΆ€ν„° μ—΄κ±°ν˜• μΌ€μ΄μŠ€ 생성 (μ˜΅μ…”λ„ λ°˜ν™˜)
let possiblePlanet = Planet(rawValue: 7)  // uranus

// μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ›μ‹œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”
let positionToFind = 11
if let somePlanet = Planet(rawValue: positionToFind) {
    switch somePlanet {
    case .earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
    }
} else {
    print("There isn't a planet at position \(positionToFind)")
}
// "There isn't a planet at position 11" 좜λ ₯

μ€‘μš”: μ›μ‹œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜λŠ” 것은 μ‹€νŒ¨ν•  수 μžˆμœΌλ―€λ‘œ 항상 μ˜΅μ…”λ„ μ—΄κ±°ν˜• μΌ€μ΄μŠ€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

πŸ“Œ μž¬κ·€ μ—΄κ±°ν˜•(Recursive Enumerations)

μžμ‹ μ˜ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€λ₯Ό μ—°κ΄€ κ°’μœΌλ‘œ κ°€μ§€λŠ” μ—΄κ±°ν˜•μ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

// indirect ν‚€μ›Œλ“œλ‘œ μž¬κ·€μ  μΌ€μ΄μŠ€ ν‘œμ‹œ
enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

// λ˜λŠ” 전체 μ—΄κ±°ν˜•μ„ indirect둜 ν‘œμ‹œ
indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

indirect: μž¬κ·€μ  데이터 ꡬ쑰λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ»΄νŒŒμΌλŸ¬μ—κ²Œ ν•„μš”ν•œ κ°„μ ‘ 계측을 μ‚½μž…ν•˜λ„λ‘ μ§€μ‹œν•˜λŠ” ν‚€μ›Œλ“œ

μž¬κ·€ μ—΄κ±°ν˜• μ‚¬μš© 예제

// (5 + 4) * 2 ν‘œν˜„μ‹ λ§Œλ“€κΈ°
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 좜λ ₯ ((5 + 4) * 2)

Swift의 μ—΄κ±°ν˜•μ€ λ‹¨μˆœν•œ κ°’ λͺ©λ‘ μ΄μƒμ˜ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. μ—°κ΄€ κ°’κ³Ό μ›μ‹œ κ°’, μž¬κ·€ ꡬ쑰, ν”„λ‘œν† μ½œ μ€€μˆ˜ λ“±μ˜ κΈ°λŠ₯을 톡해 λ³΅μž‘ν•œ 데이터 λͺ¨λΈμ„ κ°„κ²°ν•˜κ³  νƒ€μž… μ•ˆμ „ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.