[Swift 문법] 열거형 (Enum)

2na·2025년 5월 11일

Swift 🍎

목록 보기
3/9

열거형은 연관성이 있는 값들을 모아둔 것입니다. 열거형은 일급객체로서 프로퍼티를 계산 및 추가적인 정보를 처리하는 인스턴스 메소드를 제공한다고 하는데요. 솔직히 무슨말인지 잘 모르겠으니까 처음부터 차근차근 정리해보겠습니다.

0. 들어가며

일급객체(First-class Object)란?

특정 조건을 만족하는 객체들을 일급객체라고 하는데요. 그 조건은 다음과 같습니다.

  • 런타임 중 에도 객체가 생성이 가능해야한다.
  • 객체를 전달 인자로 전달 가능하다.
  • 객체를 변수나 데이터 구조 안에 담을 수 있다.
  • 객체를 리턴 값으로 사용 가능하다.

⇒ 요약 : 변수나 상수처럼 사용할 수 있어야 한다!

1. enum 정의하기

1) 원시값이 없는 열거형

enum Sopt {
	case plan
	case server
	case web
	case android
	case ios 
	case design
}
enum Sopt {
	case plan, server, web, android, ios, design
}

위와 같이 열거형의 이름만 쓰고 선언해주면 원시값이 없는 열거형입니다.

실제로 사용할 때에는, 선언한 열거형이 하나의 자료형이 됩니다.

var member1: Sopt = .ios

이렇게 .을 통해 내가 선언한 case 내에서만 접근이 가능합니다.

2) 원시값이 있는 열거형

원시값(Raw Value)이 될 수 있는 자료형은 Number, Character, String 타입 총 3가지가 있습니다.

원시값을 가지고 싶다면, enum 선언 시 꼭 타입을 명시해주어야 하는데요!

🔵 Number Type

enum Member: Int {
	case ob
	case yb
	case leader
}

이렇게 Int를 명시해주게 되면, 가장 먼저 선언된 case부터 0, 1, 2.. 가 차례대로 들어가게 됩니다.

enum Member: Int {
	case ob // 0 
	case yb = 2
	case leader // 3
}

만약에 yb에 원시값을 2라고 지정해주고, leader에는 따로 원시값을 지정하지 않았다면 바로 이전 케이스의 원시값에서 +1된 값으로 세팅됩니다.

✅ 주의할점 !!

만약에 Double 타입으로 enum을 선언했다고 가정해봅시다.

enum Member: Double {
	case ob = 1.0
	case yb = 2.0
	case leader //error!
}

Double이나 Float에서는 모든 case에 원시값을 선언해주지 않으면 에러가 나게 되는데요.

바로 이전 케이스 값에 +1을 더하기 때문에, 실수값에 정수를 더할 수 없기 때문에 에러가 나게 됩니다.

그래서 이 Double이나 Float으로 enum 타입을 지정했을 때, 원시값을 지정해주고 싶다면 모든 case에 원시값을 선언해주어야 합니다. 하지만! 굳이 생략을 하고 싶다면 이전 case의 값을 정수 지정해주면 에러 없이 사용할 수 있습니다.

🔵 Character Type

enum Sopt: Character {
	case plan = "p"
	case server = "s"
	case web = "w"
	case android = "a"
	case ios = "i"
	case design = "d"
}

Character로 enum의 타입을 지정해줄 경우 반드시 모든 case에 대해 원시값을 지정해주어야합니다.

아스키코드처럼 +1을 더하면 되지 않나? 라는 생각은 안됩니다.. (아까 Float와 비슷한 이유로 이전값이 정수가 아니기 때문에 계산이 불가능합니다)

🔵 String Type

String type은 원시값을 지정하지 않으면 case 이름과 동일한 원시값이 자동으로 지정됩니다.

enum Sopt: String {
	case plan                //plan
	case server              //server
	case web                 //web
	case android             //android
	case ios = "요아정"
	case design              //design
}

✅ 원시값 접근하기

이렇게 만들어진 원시값은 rawValue 라는 속성으로 접근해주면 됩니다!

var 나연: Sopt = .ios
var 효은: Sopt = .server

print(나연.rawValue)
print(효은.rawValue)

만약 원시값이 존재하는 열거형이라면, rawValue속성을 이용해 생성자 바로 변수를 만들 수 있는데요

var 나연 = Sopt(rawValue: "ios")
var 효은 = Sopt(rawValue: "sserver")

이렇게 없는 값을 rawValue에 넣어주게 되면 효은 이라는 변수는 nil을 리턴하게 됩니다.

예제를 통해서 알아보겠습니다!

💬 예제

enum Sopt: String{
    case plan
    case server
    case web
    case ios = "요아정"
    case andriod
}

이렇게 작성된 enum을 만들어주었습니다. ios에만 “요아정”이라는 원시값을 주었어요.

var nayeon: Sopt = .ios
print(nayeon)
print(nayeon.rawValue)
print(type(of: nayeon))

실행결과를 보겠습니다.

요렇게 실행결과가 나오게 되는데요. nayeon이라는 변수에는 .ios라는 enum을 주었고, 원시값으로는 “요아정”을 지정했습니다. 타입을 확인해보면 Sopt라는 enum 타입이 나오게 됩니다.

var hyoeun = Sopt(rawValue: "sserver")
print(hyoeun)
print(type(of: hyoeun))

“sserver”라는 없는 원시값으로 새로운 Sopt 타입의 변수를 선언해보겟습니다.

실행결과를 확인해보면

hyoeun이라는 변수에는 아무것도 들어가있지 않습니다. sserver라는 원시값이 enum 내에 존재하지 않기 때문에 nil이 들어가게 되었습니다. 타입을 확인해보니 Sopt Optional 타입이네요. 없는 원시값을 넣어 변수를 생성하게 되면 리턴되는 enum은 옵셔널임을 알게 되었습니다.

2. 연관값 (Associated Values)

1) 배경

솝트의 멤버에 관련된 Enum을 만들어서, yb와 ob case를 만들어서 원시값을 지정해주려고 합니다.

enum SoptMember: String {
	case yb = "ios, 23"
	case ob = "server, 24, 35"
}

하지만 모든 YB가 ios파트에 23살은 아닐거고, 모든 OB가 서버파트에, 최근활동기수가 35기에, 24살은 아닐 것입니다. 이렇게 원시값을 사용하게 될 경우, 모든 case가 동일한 원시값을 가져야하고, case별로 지정된 하나의 값만 가질 수 있습니다. 이럴 때 바로 연관값을 사용하게 됩니다.

2) 연관값을 가지는 Enum 선언하기

enum SoptMember {
	case yb(part: String, age: Int)
	case ob(part: String, age: Int, recent: Int)
}

연관값을 선언할 때에는 case 옆에 튜플 형태로 원하는 타입을 명시하면 됩니다.

3) 연관값을 가지는 Enum 생성하기

enum을 사용할 때에는 연관값을 함께 전달하여 생성하면 됩니다.

let nayeon: SoptMember = .yb(part: "ios", age: 23)
let hyoeun: SoptMember = .ob(part: "server", age: 24, recent: 35)

4) switch 매칭

예제를 통해서 switch-case로 매칭하는 경우를 보겠습니다.

선언했던 연관값 중 하나만으로도 조건을 걸 수 있습니다.

.yb(let part, let age) 이렇게 case를 거는 경우, 연관값을 꺼내서 사용할 수 있게 됩니다.

이렇게 연관값 관련하여 아무 조건도 걸지 않으면 연관값을 무시하고 case값만 맞으면 바로 실행되게 됩니다.

profile
Studying Frontend 👩🏻‍💻

0개의 댓글