2022. 2. 14. 10:17ㆍProgramming/iOS_Swift
오늘은 Swift에서 너무나 자주 유용하게 쓰이는 Generic(제네릭)에 대해서 다뤄보려고 한다. 먼저 공식문서부터 살펴보자!
공식문서 시작부터, 제네릭에 대한 극찬으로 가득하다. 요약해보자.
제네릭 코드는 사용자가 아주 flexible하고 reusable한 함수와 타입을 작성하게 해준다. 사용자는 제네릭을 사용함으로써 코드 중복을 피할 수 있고 명확하게 사용자의 의도를 표현할 수 있다.
제네릭은 스위프트의 가장 powerful한 특징 중에 하나이다. 또, Swift standard library의 대부분이 제네릭 코드로 만들어졌다. 사실 사용자는 알게 모르게 제네릭을 사용하고 있는 중이다. 예를 들어, 배열과 딕셔너리 타입들도 모두 제네릭 콜렉션 타입이다. 사용자는 제네릭 코드를 사용함으로써, 어떠한 제한 없이 너가 사용하고 싶은 모든 타입을 적용할 수 있다.
대충 의역했는데, 제네릭에 대한 스위프트 개발자들의 자부심이 느껴진다. 정리하면
Generic이란?
타입에 대한 제약을 없애주고, 사용자가 다양한 타입을 상황에 따라 유동적으로 적용시켜주게 만드는 코드이다.
구체적인 예시를 통해, 제네릭이 어떻게 타입에 대한 제약을 없애는지 확인해보자. 예시는 공식문서의 예시를 활용하려고 한다. 직접 만들어 볼까도 생각했는데, 공식 문서 예시가 가장 이해하기도 편하고 직관적이다.
(inout Parameter를 모른다면 여길 참고하자 https://daltonic.tistory.com/40)
위의 코드를 보면 전달받은 두 개의 Int타입 인자를 서로 바꿔주는 함수가 있다. 만약 사용자가 String타입 인자를 서로 바꿔주고 싶다면 우리는 별도의 함수를 다시 만들어야할 것이다. 다른 타입들도 마찬가지이다.
코드를 보면 바디는 모두 똑같은데 단지 매개변수의 타입만 다르다. 이 때 우리는 제네릭을 적용해줌으로써 훨씬 유연하고 재사용성이 높은 함수를 작성할 수 있다! 바로 적용해보자.
제네릭이 적용된 함수이다. 기존의 함수와 비교해서 보면 매개변수 타입으로 T라는 정체를 알 수 없는 타입이 사용됐고 함수명 옆에 해당타입이 꺾쇠 괄호(angle bracket)에 감싸져 있다. 우리는 제네릭이 적용된 이 함수 하나로 기존에 타입 별로 여러 개 만들어야했던 함수들을 모두 대체할 수 있다. 어떻게 사용되는지 대강 알았으니 이제 저 정체를 알 수 없는 타입 T에 대해서 다뤄보자.
우리가 사용했던 T는 Placeholder 타입이면서 Type Parameter(타입 파라미터)이다. 다시 말해, 타입 파라미터는 실제로 존재하는 타입이 아닌 가상의 Placeholder타입을 만들어낸다. 즉 T는 실제로 존재하지 않는 우리가 임의로 이름지은 타입인 것이다. T 대신에 Element라고 하든 군인이 좋으면 Soldier라고 하든 모두 사용자의 자유이다.
하지만, 우리 맘대로 막 이름지을 수 있긴 한데, 기본적인 네이밍 룰이 있다. 웬만하면 이를 지키는게 다른 사람이 우리의 코드를 봤을 때 훨씬 이해하기 편할 것이다.
위의 문서를 보면, 타입 파라미터의 기본적인 네이밍 룰에 대해 설명하고 있다. 가령 딕셔너리의 경우 <Key, Value>, 배열의 경우 <Element> 이런 식으로 말이다. 하지만 딱히 타입파라미터와 메서드 등과 의미있는 연관 관계가 없다면 그냥 T, U, V 등 한 개의 문자로 표현해도 된다. 단, 타입 파라미터의 이름은 언제나 upper camel case로 써주자.
제네릭의 기본적인 부분들에 대해서 알아봤다. 코드의 재사용성과 유연한 사용을 위해 꼭 숙지해두자.
'Programming > iOS_Swift' 카테고리의 다른 글
[iOS_Service Level Project(SLP)] Clean Architecture 적용기 (2) - Dependency, Clean Architecture 적용 이유에 대하여 (4) | 2022.02.28 |
---|---|
[iOS_Service Level Project(SLP)] Clean Architecture 적용기 (1) - MVVM과 Clean Architecture (0) | 2022.02.25 |
[iOS_Swift] inout Parameter에 대하여 (0) | 2022.02.10 |
[iOS_Swift] Properties - 지연 저장 프로퍼티(Lazy Stored Property) (0) | 2022.02.06 |
[iOS_Swift] mutating에 대하여 (0) | 2022.02.03 |