PWT (Protocol Witness Table)

Tabber·2026년 2월 1일

Swift

목록 보기
11/15
post-thumbnail

한줄요약

PWT는 프로토콜을 사용할 때 이 프로토콜이 어떤 주소를 바라봐야 하는지를 적어놓은 주소록이다. 이는 다형성 때문에 컴파일러 입장에서는 어떤 것이 올지 알 수 없다. 이에 컴파일러에게 PWT는 명확한 주소록을 제공해준다.

PWT (Protocol Witness Table) 이해하기

방금 위에서 말해준 sil_witness_table 의 정체, PWT에 대해 공부해보아요.

왜 테이블이 필요해?

Swift에서 함수를 실행할 때, “어느 코드를 실행할지” 결정하는 방식은 두 가지에요.

  • Static Dispatch : 컴파일할 때 이미 실행할 함수 주소를 아는 경우 (구조체 함수 등). 빠르다는 특징이 있어요.
  • Dynamic Dispatch : 실행해봐야 어떤 함수를 쓸지 아는 경우 (상속된 클래스, 프로토콜 등)

문제는 프로토콜이에요.

protocol Speaker { func speak() }
struct Dog: Speaker { func speak() { print("Woof") } }

func makeItSpeak(heros: Speaker) {
    heros.speak() // 여기서 dog의 speak를 부를지, 다른 동물의 speak를 부를지 어떻게 알까?
}

Speaker 라는 프로토콜 타입은 크기도 제각각인 여러 타입(Dog, Cat 등)을 담을 수 있어야 해요. 이때 사용하는 것이 Existential Container 와 PWT 에요.

PWT의 구조

PWT는 특정 타입이 특정 프로토콜을 어떻게 구현했는지 기록한 “함수 주소록” 이에요.

  • VTable (Virtual Method Table) : 클래스의 상속 관계를 위한 주소록
  • PWT (Protocol Witness Table) : 타입이 프로토콜을 만족하는지 확인하기 위한 주소록

동작 과정

  1. makeItSpeak(heros: Speaker) 가 호출되면, Swift는 heros 가 담긴 컨테이너에서 PWT를 찾아요.
  2. 해당 PWT에는 speak() 함수가 실제 Dog의 것인지 Cat의 것인지에 대한 메모리 주소가 적혀있어요.
  3. 그 주소를 타고 가서 함수를 실행해요.

아까 봤던 SIL 코드의 마지막 기억 나세요?

sil_witness_table ViewType: Hashable module ViewType {
  base_protocol Equatable: ViewType: Equatable module ViewType
  method #Hashable.hashValue!getter: <Self where Self : Hashable> (Self) -> () -> Int : @$s8ViewTypeAAOSHAASH9hashValueSivgTW	// protocol witness for Hashable.hashValue.getter in conformance ViewType
  method #Hashable.hash: <Self where Self : Hashable> (Self) -> (inout Hasher) -> () : @$s8ViewTypeAAOSHAASH4hash4intoys6HasherVz_tFTW	// protocol witness for Hashable.hash(into:) in conformance ViewType
  method #Hashable._rawHashValue: <Self where Self : Hashable> (Self) -> (Int) -> Int : @$s8ViewTypeAAOSHAASH13_rawHashValue4seedS2i_tFTW	// protocol witness for Hashable._rawHashValue(seed:) in conformance ViewType
}

sil_witness_table ViewType: Equatable 이 바로 “ViewType이 Equatable로서 행동할 때 사용할 주소록은 이거야!” 라고 선언해 둔 것이에요.

profile
iOS 정복중인 Tabber 입니다.

0개의 댓글