0Pricing
Swift Academy · 강의

any P(존재 타입): 절충점과 동적 디스패치

프로토콜을 준수하는 서로 다른 타입의 값 을 프로토콜 뒤에 저장하거나 전달하려면 any P 를 사용합니다. 동적 디스패치, 박싱, 연관 타입 / Self 요구 사항의 한계를 이해합니다.

any P(존재 타입): 절충점과 동적 디스패치은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 3개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

존재 타입이란 무엇인가요

존재 타입(any P)은 P를 준수하는 어떤 값이든 담을 수 있습니다. 이를 통해 일부 제약과 함께 이기종 저장 및 동적 dispatch가 가능합니다.

  • mixed 컬렉션에 적합합니다
  • 프로토콜 위트니스 테이블을 통한 동적 dispatch를 지원합니다
  • 연관 타입/Self 사용에 제약이 있습니다

이기종 컬렉션

any Shape을 사용하면 서로 다른 준수 타입을 함께 저장하고 동적 dispatch를 통해 프로토콜 메서드를 호출할 수 있습니다.

protocol Shape { func area() -> Double }

struct Circle: Shape { let r: Double; func area() -> Double { .pi * r * r } }
struct Square: Shape { let s: Double; func area() -> Double { s * s } }

// Heterogeneous array using ANY Shape
let shapes: [any Shape] = [Circle(r: 1), Square(s: 2), Circle(r: 0.5)]
let total = shapes.reduce(0) { $0 + $1.area() }   // dynamic dispatch
print(String(format: "%.2f", total))

인터페이스 경계

존재 타입은 프로토콜 인터페이스만 노출합니다. 구체 타입에만 있는 메서드를 사용하려면 다운캐스팅이 필요하며, 이는 선택 사항이고 런타임에 확인됩니다.

extension Circle { func diameter() -> Double { 2 * r } }

let mixed: [any Shape] = [Circle(r: 1), Square(s: 3)]
print(mixed[0].area())            // OK: in protocol
// print(mixed[0].diameter())     // ❌ Not visible via any Shape (commented)
// You'd need a type check / downcast:
if let c = mixed[0] as? Circle { print(c.diameter()) }

연관 타입의 주의점

존재 타입은 알려지지 않은 연관 타입이나 Self를 참조하는 요구 사항을 직접 담을 수 없습니다. 타입 소거를 사용하거나 래퍼를 통해 연관 타입을 고정하세요.

// Protocols with associated types/Self constraints can be hard to use as existentials.
protocol Parser {
    associatedtype Output
    func parse(_ s: String) -> Output
}

// let p: any Parser = ...     // ❌ Not directly usable: Output is unknown
// Workarounds: type erasure or constrain Output to a specific type in wrappers.

매개변수 스타일 선택

존재 타입: 이기종이며 유연합니다. 제네릭: 동종이며 컴파일 시점에 더 빠르고 검증됩니다. 필요에 따라 선택하세요.

// Existential: accepts any mix of Shapes (dynamic dispatch)
func totalAreaExistential(_ xs: [any Shape]) -> Double {
    xs.reduce(0) { $0 + $1.area() }
}

// Generic (homogeneous): static dispatch; one concrete Shape type per call
func totalAreaGeneric<S: Sequence, T: Shape>(_ xs: S) -> Double
where S.Element == T {
    xs.reduce(0) { $0 + $1.area() }
}

print(totalAreaExistential([Circle(r:1), Square(s:2)]))  // mixed OK
print(totalAreaGeneric([Circle(r:1), Circle(r:2)]))      // homogeneous only
// totalAreaGeneric([Circle(r:1), Square(s:2)])          // ❌ different types

any P를 사용할 때

지침:

  • 이기종 저장과 런타임 다형성에는 any P를 사용하세요.
  • 요소가 동종이라면 성능과 정적 보장을 위해 제네릭을 우선하세요.
  • 연관 타입/Self가 있는 프로토콜에는 타입을 소거하거나 래핑하지 않는 한 존재 타입을 사용하지 마세요.

존재 타입의 이점

빠른 확인: any P로 무엇을 할 수 있나요?

복습

복습: any P는 프로토콜을 준수하는 값을 담는 존재 컨테이너입니다. 동적 dispatch를 통한 이기종 다형성을 지원하지만, 구체 타입 전용 API를 숨기며 연관 타입/Self를 다루는 데 어려움이 있습니다.

자주 묻는 질문

“any P(존재 타입): 절충점과 동적 디스패치” 강의는 무료인가요?

네 — “any P(존재 타입): 절충점과 동적 디스패치” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

“any P(존재 타입): 절충점과 동적 디스패치”에서 뭘 배우나요?

프로토콜을 준수하는 서로 다른 타입의 값 을 프로토콜 뒤에 저장하거나 전달하려면 any P 를 사용합니다. 동적 디스패치, 박싱, 연관 타입 / Self 요구 사항의 한계를 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 2번째 강의입니다.

“any P(존재 타입): 절충점과 동적 디스패치” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. some P(불투명한 결과 타입): 구체 타입 숨기기
  2. any P(존재 타입): 절충점과 동적 디스패치
  3. some, any, 제네릭 중 선택하기
← Swift Academy(으)로 돌아가기