@frozen

2025. 3. 18. 21:48·Programing Langauge/swift
반응형

👋 들어가기 전

이제는 더 이상 미룰  없다...

swift에 사용되는 attribute를 슬슬 공부할 때가 온 것 같다.

 

여러가지 옵션과 최적화를 위해 사용하는 attribute를

 

frozen을 시작으로 차근 차근 알아보자.


✊@frozen이 없을 때

frozen을 설명하는 가장 대표적인 키워드는 enum이다.

 

왜냐하면 변화에 굉장히 민감히 반응한다.

 

다음과 같이 enum이 있을 때

enum FontSize {
  case light, regular, medium
}

 

switch를 열어 모두 구현해도 다음과 같은 에러가 발생할 때가 있다.

⚠️ Switch must be exhaustive ....

 

발생하는 원인은 추후 추가되거나 수정될 경우를 대비하라는 경고이다.

 

이 때 기본적으로 우리가 알고 있는 선택지는 `defulat` 또는 `@unknown default`가 있다.

 

여기서 default는 많이 써봤지만 @unknown default는 잘 알지 못한다.

 

이 때 또 다른 선택지가 바로 @frozen이다.


❄️@frozen

역할

선언된 타입의 내용은 변화가 없다는 것을 보장한다.

대상

struct와 enum이 있다.

필요한 이유

기본적으로 Swift에서는 구조체나 열거형이 변할 가능성이 있음을 가정하고,

안전성을 위해 컴파일러가 추가적인 방어 코드를 생성한다.

 

하지만, @frozen을 사용하면 이 타입이 변경되지 않을 것임을 보장하므로,

컴파일러는 추가적인 런타임 체크를 생략할 수 있습니다.

 

즉, 최적화가 가능해지고, 성능이 향상되며, 바이너리 크기가 줄어드는 효과가 있다.

개선

위에서 정의한 enum을 다음과 같이 바꾸면 default나 @unknown default를 쓰지 않아도

warning이 뜨지 않는다.

@frozen enum FontSize {
	case light, regular, medium
}

📌 주의할 점

1. 한 번 @frozen을 적용하면 변경할 수 없음

  • 새로운 속성을 추가할 수 없고, 새로운 enum 케이스도 추가할 수 없음
  • 따라서 공개 API를 설계할 때 매우 신중하게 사용

2. 라이브러리 API 안정성을 높일 때 사용

  • Swift 표준 라이브러리에서도 최적화를 위해 @frozen을 사용한다.
  • 예를 들어, Int, Double 같은 기본 타입도 @frozen struct이다

✌️default와 @unknown default 차이

둘다 추가되거나 수정될 case를 위한 키워드지만 큰 차이가 있다.

 

@unknown default는 미래에 추가될 case를 대비한다.

그렇기 때문에 새로운 case가 추가되면 warning 메시지를 통해 개발자가 알 수 있다.

 

default는 모든 case이외의 모든처리를 담당한다.

case가 새롭게 추가되어도 별도의 warning이 없다.

반응형

'Programing Langauge > swift' 카테고리의 다른 글

Mirror  (0) 2025.03.19
@inlinable  (0) 2025.03.18
lazy  (1) 2025.02.04
Dynamic Key decoding  (3) 2024.12.21
GC vs ARC  (1) 2024.12.13
'Programing Langauge/swift' 카테고리의 다른 글
  • Mirror
  • @inlinable
  • lazy
  • Dynamic Key decoding
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (325)
      • CS (30)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (6)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (41)
        • swift (34)
        • python (6)
        • Kotlin (1)
      • iOS (133)
        • UIKit (37)
        • Combine (1)
        • SwiftUI (33)
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (11)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (20)
        • 어노테이션 (6)
        • 튜토리얼 (13)
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
      • AI (9)
        • 이론 (9)
        • MCP (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    dfs
    protocol
    IOS
    프로그래머스
    GIT
    CS
    AVFoundation
    lifecycle
    property
    UIKit
    백준
    Spring
    SwiftUI
    Tuist
    Swift
    boostcamp
    투포인터
    dispatch
    concurrency
    dp
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
@frozen
상단으로

티스토리툴바