🔥 제네릭 타입 확장하기
제네릭 타입을 확장할 때는 확장 정의의 일부로 타입 매개변수 목록을 제공하지 않습니다. 대신에 원래 타입 정의의 타입 매개변수 목록을 확장 본문 내에서 사용할 수 있으며, 원래 타입 매개변수 이름을 사용하여 원래 정의의 타입 매개변수를 참조합니다.
다음 예제는 제네릭 Stack
타입을 확장하여 topItem
이라는 읽기 전용 계산 속성을 추가합니다. 이 속성은 스택에서 팝하지 않고 스택의 최상위 항목을 반환하죠.
extension Stack { var topItem: Element? { return items.isEmpty ? nil : items[items.count - 1] } }
swift
topItem
속성은 Element
타입의 옵셔널 값을 반환합니다. 스택이 비어 있으면 topItem
은 nil
을 반환하고, 스택이 비어 있지 않으면 topItem
은 items
배열의 마지막 항목을 반환합니다.
이 확장은 타입 매개변수 목록을 정의하지 않는다는 점에 주목해 주세요. 대신 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
이 코드를 자세히 살펴보면:
if let
구문을 사용하여stackOfStrings.topItem
의 값을 안전하게 언래핑합니다.- 스택이 비어 있으면
topItem
은nil
이 되므로if
블록 내부 코드는 실행되지 않습니다. - 스택에 항목이 있으면
topItem
은 최상위 항목의 값을 갖게 되고,if
블록 내부 코드가 실행됩니다.
- 스택이 비어 있으면
print()
함수를 사용하여 최상위 항목의 값을 출력합니다.- 문자열 보간법을 활용해
topItem
값을 문자열에 삽입합니다.
- 문자열 보간법을 활용해
이처럼 제네릭 타입을 확장하면 해당 타입의 기능을 확장하면서도 타입 안전성을 유지할 수 있습니다. 확장 내에서는 원래 타입의 제네릭 매개변수를 그대로 사용할 수 있어 코드의 간결성과 가독성도 높일 수 있죠.
제네릭 타입의 확장에는 확장된 타입의 인스턴스가 새로운 기능을 얻기 위해 만족해야 하는 요구 사항을 포함할 수도 있습니다. 이에 대해서는 제네릭 where 절을 사용한 확장에서 더 자세히 다룰 예정이니 참고 바랍니다.
이렇게 제네릭 타입 확장 기능을 활용하면 코드의 재사용성을 높이고 반복을 줄일 수 있습니다. 제네릭의 강력함과 유연성을 십분 활용하여 더욱 효율적이고 표현력 있는 코드를 작성해 보시기 바랍니다!