본문 바로가기

Swift/꼬꼬무

Generics - Generic Types

제네릭 함수 이외에도 Swift는 고유한 제네릭 타입을 정의할 수 있습니다.

 

Array나 Dictionary와 유사한 방식으로 모든 타입에서 동작할 수 있는 커스텀한 클래스, 구조체, 열거형입니다.

 

이번 포스팅에서는 공식 문서의 Stack이라는 제네릭 콜렉션 타입에 대해 살펴볼거에요.

 

Stack은 배열과 비슷하지만 Swift의 배열 유형보다 더 제한된 연산 집합을 가진 정렬된 값 집합입니다.

배열은 배열의 모든 위치에서 새로운 요소를 삽입하고 삭제할 수 있지만, 스택은 끝부분에만 추가할 수 있습니다.(pushing) 마찬가지로 끝부분에서만 값을 삭제할 수 있습니다.(poping)

 

Note
스택의 개념은 네비게이션 계층에서 뷰 컨트롤러를 관리하는 UINavigationController 클래스에 의해 사용됩니다. UINavigationController 클래스에서 새로운 ViewController의 추가 및 삭제는 pushViewController(: animated) 메서드와 popViewController(:) 메서드를 통해 이루어집니다. 스택은 콜렉션 관리에 대한 엄격한 “후입 선출” 접근 방식이 필요할때 유용한 콜렉션 모델입니다.

 

아래는 스택의 푸시와 팝에 대한 동작 입니다.

  1. 스택에 현재 3개의 값이 있습니다.
  2. 4번째 값은 스택의 상단에 푸쉬됩니다.
  3. 스택은 이제 4개의 값을 가지며 최근값이 가장 상단에 위치합니다.
  4. 스택의 최상단 항목은 팝 됩니다.
  5. 값을 팝 한 후에 스택은 다시 3개의 값만 가집니다.

 

다음 예제는 제네릭이 아닌 Int 타입에 대한 스택 입니다.

 

IntStack 구조체는 스택에 값을 저장하기 위해서 items 라는 Int타입의 배열 프로퍼티를 가지고 있고

값을 넣고 빼기 위해서 push와 pop 함수가 구현되어 있습니다. items 배열을 변경해야 하기때문에 mutating으로 선언되어 있습니다.

위 스택은 Int 타입만 사용이 가능합니다.

 

아래는 제네릭 버전의 스택입니다.

 

 

제네릭 버전의 스택은 일반 버전과 거의 유사하지만 Element 라는 타입 파라미터를 사용합니다.

구조체의 이름 바로 뒤에 꺾쇠 괄호 안에 사용합니다.(<Element>)

Element는 나중에 전달 될 타입에 대한 임의의 이름입니다.

이 타입은 구조체 정의 내 어디에서나 Element로 사용이 가능합니다.

 

예제에서는 3군데에서 사용이 됩니다.

  • Element 타입의 값의 빈 배열로 초기화 되는 items 프로퍼티를 생성할때
  • Element 타입의 item 이라는 단일 파라미터를 가지는 push(_:) 메서드를 지정할 때
  • pop() 메서드에 의해 반환되는 값이 Element 타입의 값으로 지정할 때

 

제네릭 타입의 Stack은 Array나 Dictionary처럼 Swift에서 유효한 모든 타입의 스택을 생성하기 위해 사용될 수 있습니다.

꺾쇠 괄호 내에 타입을 작성해서 새로운 Stack 인스턴스를 생성할 수 있습니다.

 

stackOfStrings 인스턴스 에 4개의 값을 push 하고 난 다음의 상태

 

 

이때 스택에서 팝을 하면 반환되는 값은 “cuatro” 입니다.

let fromTheTop = stackOfStrings.pop()
// fromTheTop is equal to "cuatro", and the stack now contains 3 strings

 

다음은 스택이 값을 pop 한 다음의 상태

 

Extending a Generic Type (제네릭 타입 확장)

 

제네릭 타입을 확장할때 확장의 정의 부분에 타입 파라미터 리스트를 작성하지 않습니다.

대신 원래 타입 정의의 타입 파라미터 리스트는 확장의 본문에서 사용할 수 있으며 원래 타입 파라미터 이름은 원래 정의의 타입 파라미터를 참조하는데 사용됩니다.

 

다음 예제는 제네릭 Stack 타입을 확장하여 topItem이라는 읽기 전용 계산 프로퍼티를 추가합니다.

topItem은 스택에서 상위 항목을 팝하지 않고 스택에 반환합니다.

 

 

topItem 프로퍼티는 옵셔널 Element 값을 반환합니다.

items가 비어있으면 nil을 반환, 아니면 배열의 마지막 값을 반환합니다.

 

확장에서 타입 파라미터 리스트를 따로 정의하지 않고 본문에 존재하는 Element 라는 타입 파라미터는 topItem 파라미터의 타입을 나타내기 위해서 사용됩니다.

 

topItem 계산 프로퍼티는 최상단 항목의 삭제 없이 접근하고 조회하기 위해 모든 Stack 인스턴스에서 사용될 수 있습니다.

'Swift > 꼬꼬무' 카테고리의 다른 글

Associated Types (연관된 타입)  (0) 2023.08.07
Generics - Type Constraints (타입 제약)  (0) 2023.07.26
Generics - Type Parameters  (0) 2023.07.26
Generics - Generic Functions  (0) 2023.07.18
Protocol Extensions (프로토콜 확장)  (0) 2023.07.05