열거형(Enum)
- enum은 관련된 값들을 하나의 그룹으로 묶고, 해당 값들을 case로 정의하여 타입 안전하고 명확한 코드를 작성할 수 있도록 해준다.
- enum은 값을 표현하는 새로운 데이터 타입으로 정의할 수 있다.
- 타입 안전성을 보장하고, 의도를 명확하게 파악할 수 있다.
// 기본
enum Season {
case spring
case summer
case autumn
case winter
}
// 기본 접근 방법
Season.spring
Season.summer
// 데이터 타입처럼 저장
var season: Season = .spring
var summer = Season.summer
enum Associated Values (연관 값)
연관 값(Associated Value)은 각 case가 고유한 데이터를 함께 가질 수 있도록 한다. 각 case에 괄호를 사용해 타입을 지정해 저장한다.
// 택배 배송 상태를 관리하는 열거형
enum DeliveryStatus {
case ordered // 주문함
case shipping(trackingNumber: String) // 배달 중
case deliveredCompleted(date: String) // 배달 완료
}
let status = DeliveryStatus.shipping(trackingNumber: "test")
print(status) // shipping(trackingNumber: "test")
switch status {
case .ordered: // .ordered 상태일 때 아래의 코드 실행
print("주문이 완료되었습니다.")
case .shipping(let trackingNumber): // .shipping 상태일 때 아래의 코드 실행
print("배송중입니다. 송장 번호: \(trackingNumber)")
case .deliveredCompleted(let date): //.deliveredCompleted 상태일 때 아래의 코드 실행
print("배송 완료되었습니다. 배송일: \(date)")
}
enum Raw Values (원시 값)
- enum의 각 케이스에 고유한 값(정수, 문자열 등)을 할당한 것이다.
- enum 이름 뒤에
콜론(:)
을 작성한 후 타입을 명시해주어야 하며, 각 case에=
을 사용해 원시 값을 명시하거나, 생략하면 자동으로 할당된다.- String 타입: 값을 생략하면 case 이름 그대로가 원시값이 된다.
- Int 타입: 값을 생략하면 이전 값에 +1이 자동으로 지정된다.
RawValue
속성으로 해당 케이스에 연결된 값을 가져올 수 있고, 문자열이나 숫자를 통해 enum을 초기화할 땐 해당 값이 존재하지 않을 수 있어Optional
타입으로 반환된다.
문자형의 Raw Value
enum Direction: String {
case north = "북쪽"
case east = "동쪽"
case south = "남쪽"
case west // 값이 없다면 case 이름과 동일하게 된다. (숫자형이라면 그 전번 숫자 +1)
}
let dir = Direction.east
print(dir.rawValue) // 출력: "동쪽"
let dir2 = Direction.west
print(dir2.rawValue) // 출력: "west"
// rawValue를 가지고 Direction 상수(변수)를 만들 수 있다.
let newDir = Direction(rawValue: "남쪽")
print(newDir) // 출력: Optional(Direction.south)
숫자형의 Raw Value
enum NumberGame: Int {
case one = 1
case two = 2
case three // 값을 정해주지 않아서 2다음인 3이 된다.
case four // 값을 정해주지 않아서 4가 된다.
}
print(NumberGame.one.rawValue) // 1
print(NumberGame.two.rawValue) // 2
print(NumberGame.three.rawValue) // 3
print(NumberGame.four.rawValue) // 4
let anotherNumber = NumberGame(rawValue: 3)
print(anotherNumber) // Optional(NumberGame.three)
enum 활용
enum은 단순히 값을 나열하는 것뿐 아니라, enum안에 메서드를 정의하여 각 case마다 다른 동작을 하도록 만들 수 있다.
아래처럼 Season
열거형 안에 weather()
메서드를 정의하여, 각 계절마다 날씨 설명을 반환하도록 할 수 있다.
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()) // 따뜻해요
즉, enum 내부에 메서드를 정의하여 각 케이스별로 행동을 함께 관리할 수 있기에, 마치 값과 기능을 함께 가진 작은 객체처럼 다룰 수도 있다.
아래에 compactMap과 flatMap은 알고리즘 문제를 공부하다가
처음 몬 문법들이 궁금해서 공부한김에 같이 정리했다.
compactMap
compactMap
은 Optional
을 반환하는 변환 작업을 수행한 뒤, 결과에서 nil
값을 제거한 새로운 배열을 반환한다.
문자열 배열을 숫자로 변환할 때처럼, 변환 과정에서 nil
이 발생할 수 있는 경우에 사용한다.
let stringNumbers = ["1", "2", "three", "4", "five"]
let numbers = stringNumbers.compactMap { Int($0) }
print(numbers) // [1, 2, 4]
three
와five
는Int($0)
변환에 실패해서nil
이 되고,compactMap
은 이nil
들을 제거한 후[1, 2, 4]
만 반환한다.
flatMap
flatMap
은 중첩된 배열(2차원 배열 등)을 1차원 배열로 “평탄화(flatten)”해주는 함수이다.
중첩 배열에서 요소들을 꺼내 한 줄짜리 배열로 만들고 싶을 때 유용하다.
let nestedArray = [[1, 2, 3], [4, 5], [6, 7, 8]]
let flatArray = nestedArray.flatMap { $0 }
print(flatArray) // [1, 2, 3, 4, 5, 6, 7, 8]
- 각 내부 배열
[1, 2, 3], [4, 5], [6, 7, 8]
의 요소들을 모두 꺼내 하나의 배열로 만든다.
'🖋️ TIL Journal' 카테고리의 다른 글
개인과제 Level4 역할 분리 및 구조 개선 회고 (1) | 2025.06.09 |
---|---|
enumerated()가 제네릭에서 안 된다고..? (1) | 2025.06.05 |
Closure.. 난 너가 밉다.. (0) | 2025.06.02 |
실수로 날린 커밋, reflog로 되살리기 (0) | 2025.05.30 |
꽤나 자주 보이던 키워드들 간단 정리 (0) | 2025.05.29 |