BIBI BLOG

[Swift] @frozen 속성: 더 안정적이고 빠른 코드 만들기 본문

iOS/Swift

[Swift] @frozen 속성: 더 안정적이고 빠른 코드 만들기

BIBI⭐️ 2025. 2. 20. 12:54
728x90

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를 개발한다면 꼭 활용해 보세요.

 

자료:

https://medium.com/@shobhakartiwari/understanding-the-frozen-attribute-in-swift-a-guide-for-developers-bbb98cf8c235

728x90
Comments