Hamp 2025. 3. 18. 21:48
반응형

👋 들어가기 전

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

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

역할

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

대상

structenum이 있다.

필요한 이유

기본적으로 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이 없다.

반응형