본문 바로가기
iOS와 그 외/Swift

[Swift] actor도 final 키워드로 최적화 할 수 있을까?

by lody.park 2024. 8. 24.

흔히들 class에서 상속 구조가 없으면 swift optimizationTips에서 가이드하는 것처럼 아래와 같이 final 키워드를 명시하여 컴파일러가 최적화를 수행할 수 있도록 해준다.

 

class 뿐만 아니라 메서드, 프로퍼티는 final 키워드를 통해 컴파일러가 최적화가 가능하다.

final 키워드는 더 이상 얘는 overriden 되지않아.! 걍 바로 얘 쓰면 돼! 라고 알려주는 것과 같기 때문이다.

 

그렇다면 swift 5.5에 새롭게 등장한 actor는 어떨까?

 

그보다 먼저 actor가 뭔지부터 간략하게 끄적여보면

actor는 class와 같은 reference type이다. class와 다른 점은 상속이 불가능하고, MT-safe를 기본적으로 보장한다.

다른 타입처럼 initializer도 가질 수 있고, 메서드, 프로퍼티, subscript도 가질 수 있다.

 

아래와 같이 하나의 type으로서 정의해서 사용할 수 있다. 

 

CachedImageManager는 사진첩에서 이미지를 불러오고 이를 캐싱하는 책임을 가지는 객체이다.

이미지 캐싱, 비동기 이미지 요청과 캐싱 관리 간에 발생할 수 있는 data race를 방지하기 위해서 actor로 정의했다.

 

코드 리뷰를 해주신 선배 개발자분께서 이 부분에 대해서 코멘트를 주셨다.

 

내가 최적화를 염두에 두고 습관적으로 final을 actor 앞에 명시했지만, 과연 actor에 final을 붙이는 게 최적화에 과연 도움이 될까?

 

앞서 actor는 상속이 불가능한 타입이라고 했다.

그리고 final은 더이상 overriden 하지 않을 것이라는 걸 명시하기 위해 쓴다고도 했다.

 

각 키워드가 의미하는 바를 코드상에서 한글로 바꿔보자

 

사실 actor는 본질적으로 상속이 불가능한 타입이므로, 이미 final의 특성을 내포하고 있다. 

따라서 actor앞에 final을 붙이는 건 같은 의미를 중복해서 명시하는 것.!

굳이 같은 말을 두번쓸 필요가 없다.

 

이제 final을 굳이 쓸 필요가 없다는 것을 알았으니... ✨ 코드를 개선하자.

 

 

 

결론: actor와 final actor는 같으니 깔끔하게 actor로 쓰자.

 

 

정리하면서 마지막으로...

 

이러한 불필요한 코드, 습관성 코드들이 바로 레거시가 되는 것이다.

협업 환경에서 불필요한 리소스를 줄이려면, 어떤 코드를 쓰더라도 꼼꼼히 잘 따져서 작성해야한다.

반성하고, 코드 한줄한줄 더 신경써서 개발하는 주니어가 되자🥹