Swift에서 프로토콜 타입의 값을 저장하기 위해 사용하는 보이지 않는 내부 메모리 구조(상자)
동적 디스패처가 프로토콜을 준수하는 객체의 함수의 호출 메모리 주소를 알기 위해서는 Witness Table이라는 함수 주소가 적혀 있는 테이블을 참조
이 때, 실제 객체, Witness Table, 메타 데이터를 가지는 Container를 의미
어떤 구체적인 타입이 존재는 하나, 컴파일 시점에는 그게 뭔지 모름을 의미함.
프로토콜을 준수하는 변수가 A-A일지, A-B일지 모름.

실제 값이 저장되는 공간
저장하려는 값이 적으면 이 버퍼에 직접 저장
값이 이보다 크면, 힙(Heap) 메모리에 값을 할당하고 그 주소를 가리키는 포인터를 저장
클래스 인스턴스(참조 타입)의 경우 항상 포인터를 저장

저장된 값의 구체적인 타입 정보(Bird, Drone 등)를 가리키는 포인터
이 메타데이터를 통해 해당 타입의 크기, 정렬 방식 등을 알 수 있고, 값을 복사하거나 제거하는 등의 작업을 수행

이 컨테이너가 어떤 프로토콜을 위해 만들어졌는지, 그 프로토콜의 요구사항을 어떻게 이행하는지에 대한 정보가 담긴 Witness Table을 가리키는 포인터
프로토콜의 메서드를 호출할 때, 이 포인터를 따라가서 실제 실행할 함수의 주소를 찾음.
프로토콜 타입의 변수는 클래스, 구조체처럼 서로 다른 종류와 크기를 가진 값을 모두 담을 수 있어야 함.
Existential Container는 이처럼 다양한 타입의 값들을 일관된 메모리 레이아웃으로 추상화하여, 컴파일러와 런타임이 타입에 상관없이 동일한 방식으로 값을 다룰 수 있게 해주는 방법