https://docs.swift.org/swift-book/documentation/the-swift-programming-language/opaquetypes/#Differences-Between-Opaque-Types-and-Protocol-Types
Shape (예시 타입) 을 사용하는 모듈 밖 코드는 상세 구현을 고려하게 해서는 안된다. (알필요가 없다)the reverse of a generic type.func max<T>(_ x: T, _ y: T) -> T where T: Comparable { ... }
caller 가 전달한 x 와 y 의 값이 T 의 concrete type 을 결정한다.
concrete type? → type(of:)
caller 는 Comparable 을 채택한 타입들만 사용할 수 있다. (constraint)
The implementation of max(_:_:) uses only functionality that all Comparable types share.