xxo' TIL/WIL

IOS/Swift

[Swift] 열거형 enum(Enumerations)

xxoxec 2025. 6. 13. 15:10

enum은 열거형(Enumerations)의 줄임말로, 서로 관계있는 값들을 모아서 표현해 놓은 것으로 특정 타입을 표현할 때 사용하기 좋다. 애플 개발자 문서 swift enum 정의를 해석해 보면

 

열거 형은 관련된 값의 그룹에 대한 공통 유형을 정의하고
코드 내에서 유형 안전한 방식으로 해당 값을 사용할 수 있게 해 줍니다.


https://docs.swift.org/swift-book/documentation/the-swift-programming-language/enumerations/

 

Documentation

 

docs.swift.org

 

열거형 : 관련된 값으로 이루어진 그룹을 공통의 형으로(type) 선언해 형 안전성(type-safety)을 보장하는 방법으로 코드를 다룰 수 있게 해 준다. 특정 그룹 내에서 관련 있는 값들의 집합을 표현하는 데 사용된다. enum 을 사용하면 코드의 가독성을 향상시킬 수 있으며, 예상치 못한 값이나 오류를 줄일 수 있다.

C나 Objective-C가 Integer값 들로 열거 형을 구성한 것에 반해 Swift에서는 case값이 string, character, integer, floting 값들을 사용할 수 있다. 열거형은 1급 클래스 형(first-class types)이어서 계산된 프로퍼티(computed properties)를 제공하거나 초기화를 지정하거나, 초기 선언을 확장해 사용할 수 있다.

 

enum 키워드를 사용하며, 다음과 같이 요일을 case로 갖는 열거형을 정의할 수 있다. enum은 타입이므로 대문자 카멜케잉스를 사용하여 이름을 정의하고, 각 case는 소문자 카멜케이스로 정의한다. 각 case는 그 자체가 고유의 값이다.

각 여러 case는 콤마(,)로 구분하여 한 줄에 적을 수 있다.

// enum 키워드를 사용하여 열거형을 정의
enum someEnum { // 열거형명
	// 열거형 정의
}

// case로 요일을 가지는 enum 정의
enum WeekDay {
    case mon
    case tue
    case wed
    case thu
    case fri
}

var today: WeekDay = .fri
// var today: weekDay = Weekday.fri

// 여러 case를 콤마(,)로 구분하여 한줄 작성
enum WeekDay {
	case mon, tue, whe, thu, fri
}

 

열거형은 case 기본 값을 할당하지 않는다. 열거형의 이름은 다른 타입들과 마찬가지로 대문자로 시작해야 하며, 열거형으로 정의된 변수가 해당 열거형 타입으로 한 번 정의가 되면 다음에 값을 할당할 때 형을 생략한 점 문법(dot syntax)을 이용해 값을 할당하는 축약형 문법을 사용할 수 있다.

열거형으로 타입이 지정된 경우, 위처럼 .(점문법)을 이용해 내가 선언한 case에 한해서만 접근 할 수 있다.
타입 지정을 안할 경우 어떤 타입인지 확인 할 수 없기 때문에 타입 지정을 해줘야 한다.
위처럼 String 으로 표현 할 수도 있지만 오타 발생이 높다.
오타 발생 시 바로 확인이 가능하여 오타의 가능성을 줄여준다.

 

열거형으로 타입이 지정된 경우 .(점문법)을 이용해 내가 선언한 case에 한해서만 접근할 수 있다.

또한 타입을 정해줌으로써 String 대신 enum을 사용하면 오타의 가능성을 줄여 에러 발생을 줄일 수 있고, 코드의 가독성도 높아진다.

 

다른 예로 방향을 나타내고 싶을 때 "동, 서, 남, 북"과 같은 제한된 선택지를 표현하고 싶을 때 이런 경우에 enum을 사용하면 정확하고 안전하게 코드를 작성할 수 있다. 이처럼 enum은 제한된 선택지를 표현하고자 할 때 유용하게 사용된다.

Direction 이라는 Enum 을 정의하여 "동, 서, 남, 북"을 나타내는 방향 선택지를 만들고, switch 문을 사용하여 현재의 방향에 따른 출력을 구현

 

연관값 혹은 관련값(associated value)을 가지고 있는 형태로 표현도 가능하며,

열거형의 각 case에는 custom type의 추가적인 정보를 저장할 수 있다.

// 미디어 타입 enum
enum MediaType {
    case audio
    case video
}

var mediaType: MediaType = .audio


// 미디어 타입에, 파일 확장자를 문자열로 받을수 있게 수정

enum MediaType {
    case audio(String)
    case video(String)
}

var mp3: MediaType = .audio("mp3")
var h264: MediaType = .video("h264")

연관값(associated value)을 가지고 있는 형태로 표현도 가능

 

원시값, Raw값 (Raw Values) : enum을 표시할 때 value를 할당해서 표시해야 할 때도 있음

Raw 값은 String, Character, Integer, Float 등의 타입을 사용할 수 있다.

각 Raw 값은 열거 형 내에서 고유한 값을 가져야 하며, Raw 값은 rawValue를 사용하여 접근할 수 있다.

  • Int 타입의 경우 위의 케이스부터 0부터 시작. 일부 case에 값이 지정되지 않아도 자동으로 값 증가

value를 int 타입으로 할당해서 값 증가

  • String 타입의 경우 case을 따르거나, 새로 지정할 수 있음. case에 값이 지정되지 않아도 텍스트가 자동으로 raw 값으로 할당

value를 String 타입으로 할당
숫자로 표현하고 싶을시 rawaValue 활용, value 할당 값이 없을 시 nil
없을 시 이름 자체를 rawValue로 사용하며, 지정시 지정된 이름으로 나타냄

 

enum의 특징
  1. They are stored in stack
  2. They have no inheritance
  3. They don’t require explicit initializer
  4. They can conform to protocols
  5. It can have extensions
  6. It even can have methods and computed properties(not stored!)
  7. And it can be used with generic types
  • enum은 struct와 같이 value-type이다.
enm 열거형을 쓰는 이유
  1. 입력받을 값이 한정적일 때
  2. 오타의 가능성을 줄여 에러 발생 방지
  3. 특정 값 중 하나만 선택할 때
  4.  코드의 가독성

 

 


 

 

그 외 Switch문을 이용하면 enum의 다양한 기능을 활용할 수 있다.

각 열거형 값을 Switch 문에서 매칭할 수 있고, switch 문은 반드시 열거형의 모든 case를 완전히 포함한다고 한다.

만약 모든 case 처리를 하지 않아도 된다면, switch 구문의 default case를 이용.

해당 내용은 Switch문 학습 후 추가 작성.