
👋 들어가기 전
이제는 더 이상 미룰 없다...
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 (0) | 2025.02.04 |
Dynamic Key decoding (2) | 2024.12.21 |
GC vs ARC (1) | 2024.12.13 |