본문 바로가기

Swift/기초 문법

enum 케이스 나누기

  • enum을 통해 카테고리를 구분할 수 있다.
// 학교 - 초, 중, 고
enum School {
//    case elementary
//    case middle
//    case high
    case elementary, middle, high
}
  • 위의 코드는 School 이라는 enum을 생성하였고, 그 안에 case를 통해 elementary, middle, high를 구분했다.
  • case 별로 작성해도 되고, 1개의 case에 여러 개 작성해도 된다.
  • 사용은 아래와 같이 변수 또는 상수에 할당하여 사용한다.
  • print 문을 쓸 때는 2가지 방법으로 사용할 수 있다.
let yourSchool = School.high
//print("yourSchool: \\(yourSchool)")
print("yourSchool: ", yourSchool)

yourSchool:  high
  • enum 안의 case 별로 rawValue를 지정할 수 있다.
  • rawValue를 출력하는 방법은 다르나, 결과는 같다.
enum Grade : Int {
    case first = 1
    case second = 2
}

let yourGrade = Grade.second.rawValue
print("yourGrade : \\(yourGrade)")

또는 

let myGrade = Grade.first
print("myGrade: \\(myGrade.rawValue)

yourGrade : 2
  • 각 case 별로 값을 입력받을 수 있다.
enum SchoolDetailInfo {
    case elementary(name: String)
    case middle(name: String)
    case high(name: String)
}

let mySchool = SchoolDetailInfo.elementary(name: "컴온 초등학교")
  • 지금은 입력을 받는 것인데, 입력 받은 값을 가져올라면 어떻게 하면 좋을까?
enum SchoolDetail {
    case elementary(name: String)
    case middle(name: String)
    case high(name: String)
    
    func getName() -> String {
        switch self {
        case .elementary(let name):
            return name
        case let .middle(name):
            return name
        case .high(let name):
            return name
        }
    }
}

 

위의 코드에서 getName() 메서드의 역할은 각 SchoolDetail 열거형 케이스에 포함된 이름(name) 값을 반환하는 것입니다.

 

상세 설명:

SchoolDetailelementary, middle, high 세 가지 케이스를 가지며, 각 케이스는 문자열(name) 값을 동반합니다. 각 케이스는 특정 학교의 이름을 나타냅니다.

getName() 메서드는 현재 SchoolDetail 인스턴스가 어떤 케이스인지에 따라, 해당 케이스에 저장된 name 값을 반환합니다. 이를 위해 switch 문을 사용하여 열거형 케이스를 패턴 매칭합니다.

위의 코드에서 getName() 메서드의 역할은 각 SchoolDetail 열거형 케이스에 포함된 이름(name) 값을 반환하는 것입니다.

 

역할의 요약:

  • getName() 메서드는 SchoolDetail 타입의 값을 구체적으로 확인하고, 해당 값에 포함된 학교 이름을 반환하는 도우미 메서드입니다.
  • 예를 들어, SchoolDetail.middle(name: "Greenwood Middle")인 경우, getName()은 "Greenwood Middle"을 반환합니다.
let school1 = SchoolDetail.elementary(name: "Sunrise Elementary")
let school2 = SchoolDetail.middle(name: "Greenwood Middle")
let school3 = SchoolDetail.high(name: "Lakeside High")

print(school1.getName()) // "Sunrise Elementary"
print(school2.getName()) // "Greenwood Middle"
print(school3.getName()) // "Lakeside High"

 

getName 메서드를 사용하지 않고도 열거형에 저장된 값을 직접 꺼내 쓸 수 있습니다. 하지만 getName 메서드를 사용하는 이유는 코드의 가독성, 안전성, 그리고 유지보수성과 관련이 있습니다.

직접 값에 접근하는 방법

아래처럼 SchoolDetail 값을 만들고, 필요할 때마다 직접 패턴 매칭을 통해 값을 추출할 수도 있습니다.

let yourMiddleSchool = SchoolDetail.middle(name: "정대리중학교")

if case let SchoolDetail.middle(name) = yourMiddleSchool {
    print(name) // "정대리중학교"
}

 

이 방식은 가능하지만, 매번 case를 확인하고 값을 추출해야 하기 때문에 반복적이고 장황해질 수 있습니다.

getName 메서드를 사용하는 이유

1. 간단한 사용법

getName을 사용하면, 위의 과정이 단순화됩니다. 패턴 매칭이나 추가적인 코드를 작성하지 않아도 값을 바로 가져올 수 있습니다.


let yourMiddleSchool = SchoolDetail.middle(name: "정대리중학교")
print(yourMiddleSchool.getName()) // "정대리중학교"

2. 가독성 향상

메서드 이름 자체가 "이 열거형에서 이름을 가져오는 동작"임을 명확히 표현합니다. 다른 개발자들이 코드를 읽을 때 의도를 더 쉽게 파악할 수 있습니다.

3. 공통된 처리 로직

getName 메서드로 공통된 동작을 캡슐화하여, 열거형의 내부 구조를 사용하는 쪽에서 신경 쓰지 않아도 됩니다. 예를 들어, 나중에 SchoolDetail이 더 복잡한 데이터를 가지도록 변경되더라도, getName 메서드만 수정하면 호출하는 쪽은 변경 없이 사용할 수 있습니다.

4. 확장성

getName 메서드는 단순히 값을 반환하는 것 이상의 추가 로직을 포함할 수도 있습니다. 예를 들어, 이름을 포맷팅하거나 디버깅용 로그를 추가할 수 있습니다.


func getName() -> String {
    print("Getting school name") // 디버깅용 로그
    switch self {
    case .elementary(let name), .middle(let name), .high(let name):
        return "학교 이름: \\(name)"
    }
}

결론: 사용 목적에 따라 선택

  • 간단한 코드에서는 직접 접근이 가능하고 충분히 직관적입니다.
  • 하지만 프로젝트가 커지거나, 동일한 동작을 여러 곳에서 반복해야 한다면 getName과 같은 메서드를 통해 코드의 재사용성과 유지보수성을 높이는 것이 더 효율적입니다.

따라서 작은 예제에서는 불필요해 보일 수 있지만, 규모가 커질수록 getName 같은 메서드가 유용합니다. 

'Swift > 기초 문법' 카테고리의 다른 글

컬렉션 타입 3편 - 딕셔너리  (0) 2024.12.11
컬렉션 타입 2편 - 집합  (0) 2024.12.11
컬렉션 타입 1편 - 배열  (0) 2024.12.10
기본 연산자 (Basic Operators)  (0) 2024.12.02