Swift는 개발자들에게 광범위하고 강력한 설계 공간을 제공.
Swift는 다양한 일급 타입(first-class types)과 코드 재사용 및 동적 처리를 위한 다양한 메커니즘을 갖추고 있음.
이 모든 언어 기능은 흥미롭고 새로운 방식으로 결합될 수 있음. 그렇다면 이 설계 공간을 좁히고 적합한 도구를 선택하려면 어떻게 해야 할까? 가장 먼저 Swift의 다양한 추상화 메커니즘이 모델링에 미치는 영향을 고려해야 함.
값(value) 또는 참조(reference) 의미론 중 어떤 것이 더 적합한지, 이 추상화가 얼마나 동적이어야 하는지 등을 평가해야 함. 오늘 성능을 활용하여 이 설계 공간을 좁히는 방법을 소개.
경험상 성능에 대한 고려는 종종 더 관용적인(idiomatic) 솔루션을 찾는 데 도움을 주었음. 그래서 오늘은 성능에 중점을 두어 논의.
모델링에 대해서도 약간 언급하겠지만, 작년에 훌륭한 발표가 있었고, 올해도 Swift에서 프로그램을 모델링하는 강력한 기법에 대해 다룬 훌륭한 발표가 예정되어 있음. 오늘 발표를 최대한 잘 이해하려면 이러한 발표 중 하나를 꼭 시청하길 권장.
[WWDC15] Protocol-Oriented Programming in Swift(삭제), [WWDC15] Building Better Apps with Value Types in Swift(삭제), [WWDC16] Protocol and Value Oriented Programming in UIKit

이제 성능을 활용하여 설계 공간을 좁히고자 함. Swift의 추상화 메커니즘이 성능에 미치는 영향을 이해하는 가장 좋은 방법은 해당 메커니즘의 기본 구현을 이해하는 것. 오늘은 바로 이 부분을 중점적으로 다루겠음.
먼저 추상화 메커니즘을 평가할 때 고려해야 할 다양한 성능 차원을 식별하는 것으로 시작.
그런 다음, 구조체와 클래스를 사용하는 코드를 추적하여 관련 오버헤드를 이해하고, 이 지식을 어떻게 활용하여 Swift 코드를 정리하고 속도를 높일 수 있는지 살펴보겠음.

발표 후반부에서는 프로토콜 지향 프로그래밍의 성능을 평가할 것.
프로토콜과 제네릭과 같은 고급 Swift 기능의 구현을 살펴보고, 이러한 기능이 모델링과 성능에 미치는 영향을 더 잘 이해할 수 있도록 할 것.
간단한 참고 사항으로, Swift가 컴파일하고 실행하는 메모리 표현 및 생성된 코드 표현을 살펴볼 것. 이들은 불가피하게 단순화된 형태이지만, 단순함과 정확성 사이에서 적절한 균형을 찾았다고 생각. 이는 코드를 논리적으로 이해하는 데 매우 유용한 정신적 모델이 될 것.

이제 성능의 다양한 차원을 식별하는 것부터 시작하겠음.
추상화를 만들고 추상화 메커니즘을 선택할 때, “내 인스턴스가 스택(stack)에서 할당될 것인가 아니면 힙(heap)에서 할당될 것인가? 이 인스턴스를 전달할 때 얼마나 많은 참조 카운팅 오버헤드가 발생할 것인가? 이 인스턴스에서 메서드를 호출할 때 정적으로(dispatch) 호출될 것인가, 아니면 동적으로 호출될 것인가?“라는 질문을 던져야 함.

Swift 코드를 빠르게 작성하려면 우리가 활용하지 않는 동적 특성과 런타임 비용을 피해야 함.
또한 더 나은 성능을 위해 이러한 차원 간의 트레이드오프를 어떻게 하고 언제 해야 하는지를 배워야 함.
이제 이 차원들을 하나씩 살펴보면서 할당(allocation)부터 시작하겠음.