-
Swift - Generic TypeProgramming/Swift 2022. 1. 18. 16:57
안녕하세요 BeePeach입니다 :)
이번 포스팅에서는 Generic Type에 대해서 공부를 해보려고 합니다.
이전 포스팅에서 Generic Function에 대해서까지만 설명하고 Generic Type에 대해서는 설명하지 않았습니다.
Generic Type(제네릭 타입)이란 custom class, struct, enum이 Type에 상관없이 동작하는 Type을 의미합니다.
예를 들자면 지금까지 사용했던 Array, Dictionary를 생각해보겠습니다.
Array, Dictionary 모두 struct입니다.
Array에는 어떠한 Type이라도 모두 저장할 수 있었습니다. 모든 Type에 대해서 코드가 다 작성돼있지는 않았겠죠??
심지어 잘 생각해보니 Array와 Dictionary의 Type을 지정할떄 단축 문법이 아닌 정식 문법을 생각해보면..
이전 포스팅에서 배웠던 <>가 들어가 있었네요.
Generic Type에서도 TypeParameter의 개념이 사용됐습니다.
이렇게 확인한것과 같이 Array, Dictionary, Set도 Generic으로 구현되어 있었습니다.
그럼 이러한 GenericType을 어떻게 선언하고 사용하는지 같이 공부해보도록 하겠습니다.
Generic Type
(타입 파라미터가 이해되지 않으신다면 이전 포스팅을 참고해주세요.)
Custom Type에서 타입 파라미터를 프로퍼티의 Type, 메서드의 Return Type, Parameter Type 등 멤버 선언을 정의할 때 Type이 위치하는 곳에 사용할 수 있습니다.
위 문법에서 타입 파라미터의 의미는
이 프로퍼티의 Type이 뭐가 될지는 모르지만 T로 할거야!
이 메서드의 파라미터의 Type이 뭐가 될지 모르고 리턴 Type도 뭐가 될지는 모르지만 둘 다 같은 T가 될거야! 라는 의미가 됩니다.
어려울 게 없죠?? 그럼 바로 예시를 보도록 하겠습니다.
Stack
Generic Type의 예시로 가장 기본적인 자료구조 중 하나인 Stack을 구현해보도록 하겠습니다.
Stack이란 LIFO(Las In First Out)의 구조를 가진 자료구조를 나타냅니다.
push를 통해서 데이터를 저장하고 pop을 이용해서 데이터를 꺼냅니다. (Stack에 대해서 간단하게 설명한 포스팅도 있습니다!)
Swift에서는 Array를 이용해서 Stack을 쉽게 구현할 수 있습니다.
먼저 Generic을 사용하지 않는 경우를 보겠습니다.
Stack의 경우에 모든 데이터를 저장할 수 있어야 하는데 이 경우에는 Int가 아닌 데이터를 저장하지 못합니다.
(여기서 설명하는 모든 데이터를 저장한다는 의미는 한 Stack에 Int, String, Double 등 다른 Type의 데이터를 혼합해서 넣는다는 말이 아닙니다.)
String 데이터를 넣고 싶으면 또 StringStack을 선언해야 하는데 매우 비효율적입니다.
그럼 이 문제를 Type Parameter를 이용해서 해결해보겠습니다.
Name뒤에 <TypeParameter>를 적어주고 이 타입 파라미터를 멤버선언에서 Type이 사용되는곳에서 사용하면 됩니다.
이전 포스팅에서는 타입파라미터 이름으로 T를 주로 사용했는데 여기선 Element라고 하는 게 더 직관적이고 좋은 이름이어서 Element로 써줬습니다.
물론 이름을 내 맘대로 아무렇게 지어줘도 에러는 발생하지 않습니다.
Generic Type 사용하기
Generic Function과는 다르게 generic type의 인스턴스를 생성 할 때는 <>와 함께 타입 파라미터 대신 사용될 Type을 명시해주어야 합니다.
Type annotation(타입 지정), Type Inference(타입 추론) 두 가지 모두 <>과 함께 Type을 같이 전달한 것을 확인할 수 있습니다.
만약 타입추론을 사용하면서 타입파라미터를 명시해주지 않는다면 에러가 발생하는것을 확인할 수 있습니다.
728x90'Programming > Swift' 카테고리의 다른 글
Swift - Generic Type 확장하기 (0) 2022.01.24 Swift - Associated Type (0) 2022.01.19 Swift - Generic (0) 2022.01.17 Swift - Hashable Protocol (0) 2022.01.16 Swift - Comparable Protocol (0) 2022.01.15