class 객체는 기본적으로 하나의 super class만을 상속 받을 수 있습니다. 따라서 연결하고자 하는 객체가 이미 서로 다른 super class를 상속받았다면 두 객체를 상속으로 연결하는 방법은 더이상 사용할 수 없습니다.
다음으로 상속은 class 객체에만 적용 가능한 다형성 기법입니다. struct나 enum 객체는 상속을 사용할 수 없습니다.
자전거와 자동차를 예로 들어보겠습니다. 자전거와 자동차는 교통수단이라는 공통점을 가지고 있습니다. 하지만 이 두 교통수단을 하나의 super class로 묶기에는 목적에 따라 다르겠지만 공통점이 매우 적습니다. 또한 자전거와 자동차가 이미 각각 super class를 상속했을 가능성도 있습니다. 이런 경우에 두 객체를 어떻게 서로 연결지을 수 있을까요?
protocol Transportation {
func ride()
}
class Car: HyundaiMotors, Transportation{
func ride() {
}
}
class Bicycle: Samchuly, Transportation {
func ride() {
}
}
위의 예에서 자전거는 부모클래스로 삼천리를, 자동차는 부모클래스로 현대자동차를 상속하고 있습니다. 따라서 class상속을 통해 두 객체를 연결 짓는 것은 더이상 할 수 없습니다. 하지만 protocol을 사용하면 두 객체를 같은 Type으로 만들 수 있습니다.
만약 자동차와 자전거가 class가 아닌 struct나 enum이라면 오로지 protocol을 통해서만 두 객체를 하나의 타입으로 만들 수 있습니다.
protocol Transportation: class {
func ride()
}
class Car {
var somethingToride: Transportation?
func goHome(how: Transportation){
how.ride()
}
}