열거형(Enum)과 compactMap, flatMap

2025. 6. 4. 19:54·🖋️ TIL Journal
-->

 

열거형(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
'🖋️ TIL Journal' 카테고리의 다른 글
  • 개인과제 Level4 역할 분리 및 구조 개선 회고
  • enumerated()가 제네릭에서 안 된다고..?
  • Closure.. 난 너가 밉다..
  • 실수로 날린 커밋, reflog로 되살리기
MoriOS
MoriOS
기억하기 위해 기록하는 공간 🖋️
  • MoriOS
    MoriOS
    MoriOS
  • 전체
    오늘
    어제
    • 분류 전체보기 (66)
      • 📌 Swift (12)
      • 📱 iOS (9)
      • 💡 Algorithm (1)
      • ❕Data structure (4)
      • 🪙 Python (0)
      • ⚙️ Git (2)
      • 🖋️ TIL Journal (35)
      • 📝 Etc (3)
  • 블로그 메뉴

    • GitHub
  • 인기 글

  • 태그

    후행클로저
    swift cow
    remakeconstraints
    셀 높이
    cow 값 타입
    isscrollenabled
    swift optional
    동적 셀
    SnapKit
    cow 쓰기 복사
    Split
    프로그래머스
    제약조건 변경
    Optional
    makeconstraint
    제약조건 수정
    Codable
    동적 스크롤
    스크롤 길이
    static
    TiL
    ios
    prepareconstraints
    uikit
    updateconstraints
    weak
    swift
    Components
    GitHub
    cow 참조 타입
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
MoriOS
열거형(Enum)과 compactMap, flatMap
상단으로

티스토리툴바