BIBI BLOG
[Swift] @frozen 속성: 더 안정적이고 빠른 코드 만들기 본문
Swift의 @frozen 속성: 더 안정적이고 빠른 코드 만들기 🚀
Swift에서 @frozen 속성은 enum(열거형)이나 struct(구조체)가 미래에도 변하지 않을 것임을 명확히 선언하는 기능입니다. 특히 라이브러리나 프레임워크를 만들 때 매우 유용합니다.
이번 글에서는 @frozen이 무엇인지, 왜 중요한지, 그리고 어떤 상황에서 사용하면 좋은지 쉽게 설명해 보겠습니다. 💡
🔹 @frozen이란?
@frozen을 사용하면 해당 enum의 값이 변경되지 않을 것임을 Swift 컴파일러에 알릴 수 있습니다.
이 속성을 사용하면 성능이 최적화되고, ABI(Application Binary Interface) 안정성이 보장됩니다.
✅ 간단한 개념 정리
- @frozen이 없는 enum → 앞으로 새로운 값이 추가될 가능성이 있음
- @frozen이 적용된 enum → 새로운 값이 추가되지 않음 (고정된 상태)
이 속성은 SwiftUI에는 포함되지 않지만, Swift 프레임워크 개발에서는 자주 사용됩니다.
🔹 @frozen을 사용하지 않는 경우 (유연한 Enum)
우선, @frozen을 사용하지 않는 일반적인 유연한 enum을 살펴보겠습니다.
📌 예제 1: 유연한 열거형 (변경 가능)
// 미래에 새로운 타입이 추가될 가능성이 있음
public enum FileType {
case pdf
case txt
case docx
}
✅ 이 FileType 열거형은 앞으로 새로운 파일 타입(ex. csv, pptx)이 추가될 가능성이 있습니다.
따라서 @frozen을 사용하지 않습니다.
📌 스위치 문에서 활용할 때
func openFile(type: FileType) {
switch type {
case .pdf:
print("Opening PDF file")
case .txt:
print("Opening TXT file")
case .docx:
print("Opening DOCX file")
}
}
❗ 만약 라이브러리 업데이트로 csv가 추가된다면?
컴파일러가 "switch문에서 새로운 case를 처리해야 한다"는 경고를 띄울 것입니다.
이때 해결 방법은?
👉 @unknown default를 추가하면 됩니다!
📌 미래에 새로운 case가 추가될 때 대비하기
func openFile(type: FileType) {
switch type {
case .pdf:
print("Opening PDF file")
case .txt:
print("Opening TXT file")
case .docx:
print("Opening DOCX file")
@unknown default:
print("Unknown file type") // 새 case가 추가되면 여기서 처리됨
}
}
✅ @unknown default를 사용하면, 미래에 새로운 case가 추가되더라도 코드가 깨지지 않습니다! 🎉
🔹 @frozen을 사용하는 경우 (변경되지 않는 Enum)
이제 @frozen을 사용하는 경우를 살펴볼까요?
만약 enum의 값이 절대 바뀌지 않는다면, @frozen을 사용해서 더 안전하고 빠르게 만들 수 있습니다.
📌 예제 2: @frozen 적용 (변경되지 않는 Enum)
@frozen public enum DayOfWeek {
case monday, tuesday, wednesday, thursday, friday, saturday, sunday
}
✅ 요일은 앞으로 새로운 값이 추가될 가능성이 거의 없기 때문에 @frozen을 사용할 수 있습니다.
📌 스위치 문에서 활용할 때
func printDay(day: DayOfWeek) {
switch day {
case .monday: print("It's Monday!")
case .tuesday: print("It's Tuesday!")
case .wednesday: print("It's Wednesday!")
case .thursday: print("It's Thursday!")
case .friday: print("It's Friday!")
case .saturday: print("It's Saturday!")
case .sunday: print("It's Sunday!")
}
}
🚀 @frozen이 적용되었기 때문에
✅ 새로운 요일을 추가할 수 없음!
✅ 컴파일러가 모든 case를 다 다루도록 강제함!
❗ 만약 DayOfWeek에 "holiday"라는 새로운 case를 추가하려고 하면?
@frozen public enum DayOfWeek {
case monday, tuesday, wednesday, thursday, friday, saturday, sunday, holiday // ❌ 오류 발생!
}
⚠️ 컴파일 에러가 발생합니다!
👉 @frozen은 enum이 절대 변경되지 않는다는 약속이므로, 새 값을 추가하면 컴파일 오류가 발생합니다.
🔹 언제 @frozen을 사용할까?
✅ @frozen을 사용하는 경우
✔ 절대 바뀌지 않는 값 (예: DayOfWeek, Axis2D)
✔ 라이브러리에서 사용하는 API의 Enum
✔ 최적화가 필요할 때 (성능 개선)
❌ @frozen을 사용하지 않는 경우
❌ 미래에 새로운 값이 추가될 가능성이 있는 경우 (예: FileType, ColorScheme)
❌ 내부적으로만 사용하는 enum (private enum)
🔹 @frozen이 중요한 이유
💡 컴파일 최적화 → @frozen을 사용하면 컴파일러가 더 효율적으로 최적화할 수 있습니다.
💡 안정성 유지 → 라이브러리 업데이트 시 기존 코드가 깨지는 문제를 방지할 수 있습니다.
💡 불필요한 경고 방지 → 개발자가 모든 case를 처리해야 하므로, 예상치 못한 동작을 줄일 수 있습니다.
🔹 결론: @frozen, 언제 써야 할까?
상황 | @frozen 사용 여부 |
요일 (DayOfWeek)처럼 절대 변경되지 않는 값 | ✅ 사용 |
파일 타입 (FileType)처럼 미래에 변경될 가능성이 있는 값 | ❌ 사용하지 않음 |
좌표 축 (Axis2D)처럼 개수가 고정된 값 | ✅ 사용 |
앱의 테마(다크모드, 라이트모드 등)처럼 새 옵션이 추가될 가능성이 있는 값 | ❌ 사용하지 않음 |
🚀 @frozen을 잘 사용하면 더 안전하고, 빠르고, 유지보수하기 쉬운 코드를 만들 수 있습니다!
Swift로 라이브러리나 API를 개발한다면 꼭 활용해 보세요.
자료:
'iOS > Swift' 카테고리의 다른 글
Swift 6의 새로운 동시성(Concurrency) 기능 이해하기 🚀 (0) | 2025.02.24 |
---|---|
SwiftUI가 Struct를 사용하여 뷰를 정의하는 이유 (0) | 2025.02.22 |
[Swift 6.0] Protocol Extensions: 더 강력해진 POP 🚀 (0) | 2025.02.18 |
Swift 네이밍 규칙 (0) | 2023.11.08 |
Swift 텍스트를 ASCII, Base64변환하기(String to ASCII, String to Base64) (0) | 2021.12.30 |