상세 컨텐츠

본문 제목

Enumeration

Swift&SwiftUI

by (방울)도마토 2024. 10. 2. 07:58

본문

열거형(Enumeration)

- 하나의 주제로 연관된 데이터들이 멤버로 구성되어 있는 자료형 객체 

- 열거형의 데이터 멤버들은 정의(Definition) 개념으로 정의 → 타입으로 사용 가능, 컴파일러가 미리 인지 가능 

 

* 컴파일러의 인지? 

- 열거형을 이용하여 데이터 타입을 정의하고 사용하면 오타나 실수 발생 시 컴파일 오류가 나타남 

- 집단 자료형(배열, 딕셔너리, 셋 등)을 사용하여 데이터 타입을 사용하면 런타임 오류가 나타남

→ 오류나 실수를 방지하기에 열거형을 사용하는 것이 좋음 

 

* 열거형 객체를 정의하여 사용하는 것이 좋은 경우 

1. 원치 않는 값이 잘못 입력되는 것을 막고 싶을 때

2. 입력받을 값을 미리 특정하고 싶을 때 

3. 제한된 값 중에서만 선택할 수 있도록 강제하고 싶을 때

 

enum 열거형 이름 {
    case 멤버값 1
    case 멤버값 2
    case ...
}


// 방향을 열거형으로 표현 
enum Direction {
    case north
    case south 
    case east, west     // 한 줄로도 정의 가능 
}

 

 

 

열거형 객체의 사용 

- 열거형 정의 = 새로운 타입의 데이터 정의

- 변수나 상수에 해당 멤버를 대입 → 열거형 타입으로 값이 선언됨 

var directionToHead = Direction.west 
var directionToHead: Direction = Direction.west 
var directionToHead: Direction = .west 
//var directionToHead = .west    // 타입오류: Direction 타입임을 알 수 없음 

var directionToHead = .east    // 값 변경시에는 열거형 타입명 생략 가능

 

* 열거형 타입을 생략할 수 있을 때와 없을 때 

1. 열거형 타입으로 정의된 변수에는 열거형 타입을 생략하고 멤버값만 대입해도 오류가 발생하지 않음 

2. 변수나 상수 타입 어노테이션을 명시한 후, 처음부터 타입명을 생략하고 멤버값만 대입해도 오류가 발생하지 않음

3. 타입 어노테이션 없이 변수, 상수 초기화시 타입명은 생략할 수 없음 

 

 

switch 구문과 열거형

switch directionToHead {
case Direction.north:    // 타입명 생략 가능 
    print("North")
case Direction.south:
    print("South")
case Direction.west:
    print("West")
case Direction.east:
    print("East")
    // 열거형의 모든 경우를 다루었으므로 default 생략 가능
}

 

 

멤버와 값의 분리

1. 원시값(RawValue)

 

- 멤버에 별도의 값을 대입할 때에는 열거형 타입 선언 뒤 타입 어노테이션으로 표기해야 함 

 

 

- 자동 할당: Int 타입일 경우 시작하는 멤버에만 값을 지정해주면 나머지 멤버들에게 차례로 +1씩 값을 증가하며 할당함 

 

2. 연관값(Associated Value)

- 사용하는 시점에 멤버에 보조값을 설정하는 방법 

- 실행 시점에 값을 저장해야 할 필요가 있을 때 사용 

// 이미지 포맷의 멤버를 모두 정의하지 않고 구분해야 할 값을 연관값으로 처리 
// -> 적은 멤버의 수로 다양한 포맷 처리 
enum ImageFormat {
    case JPEG
    case PNG(Bool)
    case GIF(Int, Bool)
}

 

 

 

열거형 - 연산프로퍼티와 메소드 정의 가능!

- 인스턴스를 생성할 수 없지만, 열거형 멤버를 인스턴스처럼 사용할 수 있음 

    → 인스턴스 프로퍼티, 메소드와 타입 프로퍼티, 메소드를 모두 정의할 수 있음 

enum HTTPcode: Int {    // 원시값
    case OK = 200
    case Not_Modify = 304
    case Incorrect_Page = 404
    case Server_Error = 500
    
    // 연산 프로퍼티
    var value: String {
        return "\(self.rawValue)"
    }
    
    // 메소드
    func getDescription() -> String {
        switch self {
        case .OK:
            return "\(self.rawValue)"
        case .Not_Modify:
            return "\(self.rawValue)"
        case .Incorrect_Page:
            return "\(self.rawValue)"
        case .Server_Error:
            return "\(self.rawValue)"
        }
    }
    
    // 타입 메소드
    static func getName() -> String {
        return "This Enumeration is HTTPcode"
    }
}

var response = HTTPcode.OK    
response.value                // 200
response.getDescription()     // 200
HTTPcode.getName()            // "This Enumeration is HTTPcode"

 

 

 

열거형의 장점

- 사용자의 마구잡이식 입력을 제한할 수 있음 

- 컴파일러의 자동완성으로 입력을 보조받을 수 있음 

- 입력해야할 값이 더욱 분명해짐 

→ 입력해야 할 값을 명확하게 정의하고 벗어나는 값은 입력되지 않을 수 있도록 차단하여 코드의 안정성을 높임!

관련글 더보기

댓글 영역