스파르타 코딩 클럽 - iOS 스타터 6기/본 캠프
12. 스파르타 코딩 클럽 - 열거형 (Enum)
seongpil Heo
2025. 3. 13. 16:21
📚 열거형은 Swift에서 특정 주제나 종류에 따라 묶을 수 있는 값들을 그룹화하고 정의하여 데이터타입으로 사용할 수 있습니다.
🛠️ enum의 특징
- 관련된 값을 그룹화할 수 있습니다.
- enum 키워드와 코드블록을 사용하여 정의할 수 있습니다.
- 그룹화된 값은 enum의 코드블록 내에서 case를 사용하여 정의할 수 있습니다.
- 타입 안정성을 보장하고, 의도를 명확하게 파악할 수 있습니다.
- 정의한 enum은 데이터 타입으로 사용할 수 있습니다.
- enum을 사용하여 만들어진 인스턴스는 Value Type
📝 enum 기번 선언 방법 및 사용 방법
1️⃣ 기본 선언 방법
// enum 뒤에 열거형의 이름을 작성하고 코드블록 안에서 그룹화된 값들을 case로 작성합니다.
// 기본 선언 방법
enum Season {
case spring
case summer
case autumn
case winter
}
// 한국말로 풀어보기
// Season enum을 선언합니다.
// Season이 그룹화하여 갖고있는 값은 spring, summer, autumn, winter 입니다.
2️⃣ 사용 방법
// 기본 사용 방법
// 기본적인 접근 방법
Season.spring // Enum의 이름 뒤에 .을 찍고 데이터에 접근할 수 있습니다.
Season.summer
// 데이터 타입 (String, Int ...) 처럼 변수나 상수에 저장할 수 있습니다.
var season: Season = .spring // 데이터 타입을 Season이라고 명시한다면
// Season.spring에서 Season을 생략할 수 있습니다.
var summer = Season.summer // 데이터 타입을 명시해서 값을 넣으면
// 컴파일러가 데이터 타입을 추론해줍니다.
summer = .spring // summer의 타입이 Season으로 판단되어
// Season.spring에서 Season을 생략할 수 있습니다.
❓ enum Associated Values (연관 값)
- 단순히 여러 값을 나열하는 것 이상의 기능을 제공합니다.
- 추가적인 정보와 연관시켜 저장할 수 있는 기능입니다.
- 각 case와 함께 타입을 지정하여 선언하면 연관값을 가질 수 있습니다.
Associated Value 기본 선언 방법 및 사용 방법
// 선언 방법
// 택배 배송 상태를 관리하는 열거형
enum DeliveryStatus {
// 주문함
case ordered
// 배달중의 상태로 연관값으로 String형태의 trackingNumber를 저장합니다.
case shipping(trackingNumber: String)
// 배달완료 상태로 연관값으로 String 타입의 date 정보를 저장합니다.
case delevereCompleted(date: String)
}
let status = DeliveryStatus.shipping(trackingNumber: "123")
print(status) // shipping(trackingNumber: "123")
switch status { // status 값을 switch 코드블록에 넣습니다.
case .ordered: // .ordered 상태일 때 아래 코드를 실행합니다.
print("주문완료!")
case .shipping(let trackingNumber): // .shipping 상태일 때 아래의 코드를 실행합니다. 연관값은 trackingNumber 상수에 넣습니다.
print("배송중! 송장번호: \(trackingNumber)")
case .delevereCompleted(let date): // .delevereCompleted 상태일 때 아래의 코드를 실행합니다. 연관값은 date 상수에 넣습니다.
print("배송완료! 배송일: \(date)")
}
❓ enum Raw Values (원시 값)
- 각 case마다 기본으로 설정된 원시값을 저장할 수 있습니다.
- enum 이름 뒤에 콜론 : 을 작성한 후 타입을 명시해주어야 합니다.
- case 뒤에 = 을 사용하여 원시값을 정해줄 수 있습니다.
- rawValue를 사용하여 enum의 값을 만들 수 있습니다.
- 이때는 매칭되는 rawValue가 없을 수 있기 때문에 Optional 값으로 나옵니다.
Raw Values 사용 방법
// 문자열의 Raw Value
// 이름(Season)뒤에 : String을 붙여줘서 원시값을 String이라고 명시했습니다.
enum Season: String {
case spring = "값을 정해줄 수 있어요!"
case summer // 값이 없다면 case 이름과 동일하게 됩니다.
case autumn
case winter
}
// 사용 방법
let season = Season.spring
print(season.rawValue) // "값을 정해줄 수 있어요!"
let season2 = Season.summer
print(season2.rawValue) // "summer"
// 반대로 rawValue를 가지고 Season 상수(변수)를 만들 수 있어요.
let newSeason = Season(rawValue: "summer")
print(newSeason) // Optional(summer)
// 숫자형의 Raw Value
enum Month: Int {
case january = 1 // 값을 정해주지 않는다면 0부터 1씩 올라갑니다.
case february = 3
case march // 값을 정해주지 않아서 3 다음에 4가 됩니다.
case april // 값을 정해주지 않아서 5가 됩니다.
case may
case june
case july
case august
case september
case october
case november
case december
}
print(Month.january.rawValue) // 1
print(Month.february.rawValue) // 3
print(Month.march.rawValue) // 4
print(Month.april.rawValue) // 5
let month = Month(rawValue: 3)
print(month) // Optional(february)
🎯 enum 실습하기
// enum 안에 함수를 만들고 호출해서 사용할 수 있습니다.
enum Season: String {
case spring
case summer
case autumn
case winter
func weather() -> String{
switch self {
case .spring:
return "따뜻해요"
case .summer:
return "더워요"
case .autumn:
return "시원해요"
case .winter:
return "추워요"
}
}
}
let season = Season.spring
print(season.weather()) // "따뜻해요"가 출력됩니다!
// 1. 기본 enum
enum Direction {
case north
case east
case south
case west
func toString() -> String {
switch self {
case .east:
return "동"
case .west:
return "서"
case .south:
return "남"
case .north:
return "북"
}
}
}
var direction = Direction.west
// direction: Direction = .west
print(direction)
if direction == .east {
print("동쪽입니다")
}
print(direction.toString())
// 2. rawValue
enum Rainbow: Int {
case red = 0
case orange = 1
case yellow = 2
case green
case blue
case navy
case purple
}
var rainbow: Rainbow
rainbow = .yellow
print(rainbow.rawValue)
var rainbow2 = Rainbow(rawValue: 6)
print(rainbow2)
// 3. 연관값 사용하기
enum Beverage {
case coffee(coffeeName: String, size: Int)
case tea(teaName: String, isIced: Bool)
case juice(juiceName: String)
}
var myDrink = Beverage.coffee(coffeeName: "아이스아메리카노", size: 100)
myDrink = Beverage.tea(teaName: "페퍼민트티", isIced: true)
switch myDrink {
case .coffee(let coffeeName, let size):
print("제가 주문한 커피는 \(coffeeName)이고 사이즈는 \(size)입니다.")
case .tea(let teaName, let isIced):
print("제가 주문한 tea는 \(teaName)이고 \(isIced ? "얼음있음" : "얼음없음") 입니다.")
case .juice(let juiceName):
print("제가 주문한 주스는 \(juiceName)입니다.")
}
🔷 Swift Convention Guide No.6 → enum, class, struct 이름 짓는 방법
enum, class, struct 공통으로 이름 짓는 방법입니다!
enum, class, struct는 데이터 타입으로 사용할 수 있으며, 이름은 대문자로 시작하는 Camel Case로 이름을 만들고 있어요!
저희가 지금까지 사용했던 String, Int도 사실은 struct으로 만들어진 데이터 타입이였습니다
enum Weather { // ✅ 대문자로 시작하고 있네요. 좋습니다!
}
enum weather { // ❌ 소문자로 시작하면 안되요.
}
enum SeasonWeather { } // ✅ 대문자로 시작하고 Camel Case 형식이네요. 좋아요!
enum Seasonweather { } // ❌ 대문자로 시작했지만 중간에 대문자가 없어서 읽기 불편해요.