[iOS_Swift] Swift Attributes - discardableResult, frozen에 대하여

2022. 1. 23. 19:43Programming/iOS_Swift

  Swift언어에는 Attributes라고 하는 개념이 존재한다. 오늘은 그 중에서 discardableResult와 frozen에 대해 다뤄보려고 한다. 우선, Attributes 개념이 무엇인지 이해하고 넘어가자.

 

Attributes란?

  Attributes는 한글로 표현하면 '속성'으로 표현한다. 그런데, 속성으로 공부하기보다는 영단어 Attributes 그대로 받아들이는게 좀 더 이해하는데에 편할 것 같다. 공식 문서에 따르면 어트리뷰트는 declarations과 types에 적용할 수 있다고 설명하고 있다. 즉, 쉽게 정리하면 어트리뷰트는 선언이나 타입에 적용되는 추가 특성 같은 것이라고 이해하면 편할 것 같다. 어트리뷰트는 두 가지로 분류되며 선언 어트리뷰트, 타입 어트리뷰트로 나눠진다.

 

  사실 어트리뷰트는 우리 생각보다 자주 접하고 있는 개념이다. 간단한 예로, 우리가 흔히 사용하고 있는 @objc 또한 선언 어트리뷰트이다. 해당 어트리뷰트를 메서드, 프로퍼티 등의 선언에 사용함으로써 컴파일러가 Objective-C의 코드로 인식할 수 있게끔 만들어주는 '추가 특성'인 것이다. 이렇듯 생각보다 어트리뷰트는 우리의 코드와 밀접한 관련이 있다.

 

1. discardableResult

 

  공식 문서에 따르면, discardableResult 어트리뷰트는 함수나 메서드의 선언에 적용할 수 있다고 나와있다. 해당 어트리뷰트를 사용하면 함수나 메서드의 리턴값을 사용하지 않을 때 발생하는 컴파일러의 경고를 무시할 수 있다고 설명한다. 예시를 통해 보자.

 

  위의 코드를 보면 훈련병 수를 count 해주는 메서드를 만들어줬다. 그런데, 리턴 값인 훈련병 수를 상수나 변수에 할당도 안하고 특별히 사용도 안할 경우, 위와 같은 컴파일러의 경고를 확인할 수 있다. 이럴 경우 만약 정말 리턴 값을 사용자가 어느 곳에서도 활용하지 않을 것이고 컴파일러의 경고도 무시하고 싶을 때, 사용하는 것이 discardableResult 선언 어트리뷰트이다.

  정상적으로 컴파일러의 경고가 사라졌음을 확인할 수 있다.

 

2. frozen

  frozen 어트리뷰트의 경우 자주 봤을지도 모른다. 우리가 자주 사용하는 옵셔널, Result타입이 대표적으로 frozen 어트리뷰트가 적용된 케이스이다.

 

frozen 어트리뷰트를 확인할 수 있다

  공식문서에 따르면, frozen은 구조체나 열거형에 사용되어지며 사용자가 만들 수 있는 변화들(adding, removing, reordering ...)을 제한할 수 있는 기능을 가지고 있다. 다만, frozen 어트리뷰트는 라이브러리나 프레임워크를 만들 때에만 사용되어질 수 있는 속성이다. 즉 이게 무슨 뜻이나면, 내가 라이브러리에 쓸 어떤 열거형을 만들었는데 넣으려고 계획한 모든 case를 넣어서 더 이상 변화의 여지가 없을 때 frozen 어트리뷰트를 적용시켜서 이 열거형을 묶어버리는 것이다. 위의 예시를 보면 옵셔널의 경우 값이 없는 case, 값이 있는 case 두 가지이고 더 이상 새로운 케이스가 추가되거나 사라질 여지가 없기에 frozen 어트리뷰트를 적용시킨 것이다.

  정리하자면, 우리는 라이브러리나 프레임워크를 만들 때, frozen 어트리뷰트를 열거형이나 구조체에 적용시킴으로써 사용자(Client)는 해당 열거형이나 구조체에서 나중에 생길 수도 있는 케이스나 프로퍼티들을 전혀 고려할 필요가 없어지게 된다. 만약 다음 버전에서 옵셔널에 새로운 케이스가 생겼다고 상상해보자. 우리는 기존에 있는 모든 코드들을 갈아엎어야할지도 모른다. 이런 일을 방지하기 위해 일종의 잠금 장치인 frozen 어트리뷰트를 써주는 것이다!