Swift에서 열거형인 enum에 대해 알아보는 시간이에요.열거형은 관련있는 데이터들이 멤버로 구성되어 있는 자료형 객체를 의미해요.
다음과 같은 상황에서 주로 사용해요.

다음과 같은 분류를 원할 때 사용할 수 있어요.
열거형은 다음과 같은 방식으로 정의할 수 있어요. 코드를 통해서 확인해볼게요.
enum Compass {
case North
case South
case East
case West
}
//var x : Compass // Compass형 인스턴스 x
print(Compass.North) // North
var x = Compass.West
print(type(of:x)) // Compass
x = .East
print(x) // East

열거형에 메서드를 정의해서 활용하는 것도 가능해요.
enum Week {
case Mon,Tue,Wed,Thur,Fri,Sat,Sun
func printWeek() { //메서드도 가능
switch self {
case .Mon, .Tue, .Wed, .Thur, .Fri:
print("주중")
case .Sat, .Sun:
print("주말")
}
}
}
Week.Sun.printWeek()

열거형의 rawValue를 지정할 수 있어요.
값이 없는 경우에는 초기값을 0으로 가져요.
중간에 다른 값으로 지정해준 경우에는 그 숫자의 다음 값을 가져요.
enum Color: Int { //원시값(rawValue) 지정
case red
case green = 2
case blue
}
print(Color.red) //red
print(Color.blue)
print(Color.red.rawValue) //0
print(Color.blue.rawValue)

위 경우에는 중간 green의 값을 2로 지정해줬기 때문에 다음 값인 blue가 3으로 출력되는 것을 확인할 수 있어요.
String 형 값을 갖는 열거형의 rawValue열거형의 자료형이 String으로 지정되어 있고, 원시값(rawValue)을 지정해주지 않은 경우 해당 case의 값이 이름으로 지정돼요.
enum Week: String {
case Monday = "월"
case Tuesday = "화"
case Wednesday = "수"
case Thursday = "목"
case Friday = "금"
case Saturday //값이 지정되지 않으면 case 이름이 할당됨
case Sunday // = "Sunday"
}
print(Week.Monday) //Monday
print(Week.Monday.rawValue) //월
print(Week.Sunday)
print(Week.Sunday.rawValue)

associated value)을 갖는 enum연관값(associated value)은 Swift 열거형(enum)의 각 케이스에 추가적인 데이터를 연결하는 기능이에요.
각 케이스는 Int, String, 튜플 등 서로 다른 타입의 값을 가질 수 있어요.
enum Date {
case intDate(Int,Int,Int) //(int,Int,Int)형 연관값을 갖는 intDate
case stringDate(String) //String형 연관값을 값는 stringDate
}
var todayDate = Date.intDate(2025,4,30)
todayDate = Date.stringDate("2025년 5월 20일")
switch todayDate {
case .intDate(let year, let month, let day):
print("\(year)년 \(month)월 \(day)일")
case .stringDate(let date):
print(date)
}

위 예제에서는 5번 줄에서 todayDate 의 값을 변경했기 때문에 2025년 5월 20일 이 출력되었어요.
만약, 해당 줄이 없었으면 2025년 4월 30일 이 출력돼요.
none과 somenone : Optional이 nil인 상태로 값이 없음을 나타내요.some : Optional이 실제 값을 가지는 상태로 연관값(associated value)으로 실제 데이터(Wrapped 타입)를 포함하는 것을 의미해요.none 과 some이 가지는 특징은 다음과 같아요.none 은 데이터 부재, some 은 데이터 존재를 명시함switch 나 패턴 매칭으로 none 과 some 을 분기 처리Optional 의 연산(map, flatMap, ?? 등)은 none 과 some 기반
Swift에서 구조체(Structure)는 관련된 데이터와 기능을 하나의 단위로 묶는 타입이에요.
다음과 같은 특징을 가져요.
Value Type)으로, 복사될 때 값이 복사돼요.Initializer)를 정의할 수 있어요.Swift에서 구조체는 기본적으로 Memberwise Initializer를 자동으로 제공해요.
Memberwise Initializer란 모든 구조체에 자동으로 생성된 멤버별 초기화가 되며, 이를 사용하여 새 구조체 인스턴스의 멤버 속성을 초기화할 수 있는 것을 의미해요.
그러나 직접 이니셜라이저를 정의하면 자동으로 생성되는 Memberwise Initializer는 사용할 수 없어요.
이해를 돕기 위해 코드를 통해서 다양하게 확인해볼게요.
struct Resolution {
var width : Int
var height : Int
}
let myComputer = Resolution(width:1920, height:1080)
print(myComputer.width)

위 코드를 보면 따로 init을 생성하지 않았지만, 코드가 정상적으로 실행된 것을 확인할 수 있어요.
이처럼 구조체의 경우 Memberwise Initializer를 통해 따로 Initializer를 생성하지 않아도 바로 사용할 수 있다는 특징이 있어요.
구조체를 활용하면 다음과 같이 클래스 내에서 별도의 init 없이 정의할 수 있어요.
struct Resolution {
var width = 1024
var height = 768
}
class VideoMode {
var resolution = Resolution()
var frameRate = 0.0
}
let myVideo = VideoMode()
print(myVideo.resolution.width)

Resolution 구조체를 정의해서 VideoMode의 resolution의 값을 구조체로 초기화했어요.
이런식으로 초기화를 진행하면 문제없이 코드를 작성할 수 있다는 특징이 있어요.
이렇게만 본다면 구조체와 클래스는 공통점이 굉장히 많다는 것을 알 수 있어요.
두 기능의 쓰임이 비슷하다보니 사용 시에 헷갈릴 수 있어요.
각각 사용해야 하는 시점이나 기능이 어떤 점에서 다른지 알아볼게요.

Swift에서 클래스와 구조체는 모두 데이터와 기능을 하나의 단위로 묶는 역할을 해요.Extension)을 통해 기능을 추가할 수 있고, 프로토콜을 채택해 특정 기능이나 인터페이스를 구현할 수 있어요.
Value Type)인 반면, 클래스는 참조 타입(Reference Type)이에요.override)할 수 있어요.Deinitializer)deinit이라는 소멸자를 가질 수 있어 인스턴스가 메모리에서 해제되기 전에 정리 작업을 수행할 수 있어요.ARC)을 통해 메모리 관리가 이루어져요.Memberwise InitializerMemberwise Initializer를 자동으로 제공하지만, 클래스는 그렇지 않아요.Identity Operators=== 및 !== 연산자를 사용해 두 변수가 같은 인스턴스를 참조하는지 확인할 수 있어요.let)로 선언된 구조체 인스턴스는 그 프로퍼티도 변경할 수 없지만, 상수로 선언된 클래스 인스턴스의 가변 프로퍼티는 변경할 수 있어요.struct Human {
var age : Int = 1
}
var kim = Human()
var lee = kim //값 타입
print(kim.age, lee.age)
lee.age = 20
print(kim.age, lee.age)
kim.age = 30
print(kim.age, lee.age)

reference가 2개 생기는 방식이에요.class Human {
var age : Int = 1
}
var kim = Human()
var lee = kim //참조 타입
print(kim.age, lee.age)
lee.age = 20
print(kim.age, lee.age)
kim.age = 30
print(kim.age, lee.age)

extensionprotocol에 새로운 기능을 추가extension은 기존 클래스에 메서드, 생성자(initializer), 계산 프로퍼티 등의Swift built-in 클래스와 iOS 프레임워크에 내장된 클래스에 기능을 추가할 때extension을 이용하면 매우 효과적임protocol)는 다음과 같은 형태로 extension 함
클래스는 다음과 같은 상황에서 주로 사용돼요.
deinit)가 필요한 경우UIKit, AppKit 등 Objective-C 기반 프레임워크와 상호작용할 때 (대부분 클래스 기반)구조체는 다음 상황에서 적합해요.
열거형은 다음 경우에 사용돼요.
프로토콜은 다음과 같은 경우에 사용돼요.
확장은 다음과 같은 경우에 사용돼요.
enum에 대해 알아서 알아봤어요.Swift에서 타입과 기능별 사용 시기를 정리해서 어떤 시기에 어떤 것이 사용되는 지 확인할 수 있었어요.