🔥 제네릭 타입 확장하기

313자
4분

제네릭 타입을 확장할 때는 확장 정의의 일부로 타입 매개변수 목록을 제공하지 않습니다. 대신에 원래 타입 정의의 타입 매개변수 목록을 확장 본문 내에서 사용할 수 있으며, 원래 타입 매개변수 이름을 사용하여 원래 정의의 타입 매개변수를 참조합니다.

다음 예제는 제네릭 Stack 타입을 확장하여 topItem이라는 읽기 전용 계산 속성을 추가합니다. 이 속성은 스택에서 팝하지 않고 스택의 최상위 항목을 반환하죠.

extension Stack {
    var topItem: Element? {
        return items.isEmpty ? nil : items[items.count - 1]
    }
}
swift

topItem 속성은 Element 타입의 옵셔널 값을 반환합니다. 스택이 비어 있으면 topItemnil을 반환하고, 스택이 비어 있지 않으면 topItemitems 배열의 마지막 항목을 반환합니다.

이 확장은 타입 매개변수 목록을 정의하지 않는다는 점에 주목해 주세요. 대신 Stack 타입의 기존 타입 매개변수 이름인 Element가 확장 내에서 사용되어 topItem 계산 속성의 옵셔널 타입을 나타냅니다.

이제 topItem 계산 속성을 사용하여 모든 Stack 인스턴스에 액세스하고 항목을 제거하지 않고도 최상위 항목을 쿼리할 수 있습니다.

if let topItem = stackOfStrings.topItem {
    print("The top item on the stack is \(topItem).")
}
// "The top item on the stack is tres."를 출력합니다.
swift

이 코드를 자세히 살펴보면:

  1. if let 구문을 사용하여 stackOfStrings.topItem의 값을 안전하게 언래핑합니다.
    • 스택이 비어 있으면 topItemnil이 되므로 if 블록 내부 코드는 실행되지 않습니다.
    • 스택에 항목이 있으면 topItem은 최상위 항목의 값을 갖게 되고, if 블록 내부 코드가 실행됩니다.
  2. print() 함수를 사용하여 최상위 항목의 값을 출력합니다.
    • 문자열 보간법을 활용해 topItem 값을 문자열에 삽입합니다.

이처럼 제네릭 타입을 확장하면 해당 타입의 기능을 확장하면서도 타입 안전성을 유지할 수 있습니다. 확장 내에서는 원래 타입의 제네릭 매개변수를 그대로 사용할 수 있어 코드의 간결성과 가독성도 높일 수 있죠.

제네릭 타입의 확장에는 확장된 타입의 인스턴스가 새로운 기능을 얻기 위해 만족해야 하는 요구 사항을 포함할 수도 있습니다. 이에 대해서는 제네릭 where 절을 사용한 확장에서 더 자세히 다룰 예정이니 참고 바랍니다.

이렇게 제네릭 타입 확장 기능을 활용하면 코드의 재사용성을 높이고 반복을 줄일 수 있습니다. 제네릭의 강력함과 유연성을 십분 활용하여 더욱 효율적이고 표현력 있는 코드를 작성해 보시기 바랍니다!