기존의 객체지향 프로그래밍의 기조

→ 가장 기본이 되는 base class를 만듬, baseClass가 기본 기능들을 다 가짐

→ subClass들은 그 초기 base class에 상속

→ superClass를 상속한 subClass들이 그만의 implemantation을 오버라이딩을 통해 붙여나갈 수 있도록 한다.

⇒ 이렇게 되면 baseClass들이 기본 동작에 대한 정의를 가져야함, 뚱뚱한 baseClass가 탄생

⇒ 나에게 필요 없는 기능도 baseClass가 가지고 있다는 이유만으로 다 가지고 있어야 한다

프로토콜 중심 프로그래밍은?

→ 가장 기본이 되는 base protocol로서 껍데기를 가짐. 기본적으로 필요한 것들에 대한 scheme만 가짐

→ base protocol을 채택한 하위 protocol 생성, 해당 protocol만의 필요한 기능 정의

→ protocol의 기본 동작은 extension을 통해서 구현할 수 있음, 이를 protocol extension이라고 함.

→ Reference Type (class)를 사용하는 것이 아니라 Value Type (struct)를 사용하여 상속을 권유하고 있음.

<Protocol / Extension 예시>

// Vehicle protocol
protocol Vehicle {
    var hitPoints: Int {get set}
}

// Vehicle protocol의 default 정의
extension Vehicle {
    
    mutating func takeHit(amount: Int) {
        hitPoints -= amount
    }
    
    func hitPointsRemaining() -> Int {
        return hitPoints
    }
    func isAlive() -> Bool {
        return hitPoints > 0 ? true : false
    }
}

protocol LandVehicle : Vehicle {
    var landAttack: Bool {get}
    
    func doLandAttack()
}

protocol SeaVehicle : Vehicle {
    var seaAttack: Bool {get}
    
    func doSeaAttack()
}

// struct을 통한 구현 
struct Tank : LandVehicle {
    var hitPoints: Int = 68
    let landAttack: Bool = true
    
    func doLandAttack()  {
        print("Land Attack")
    }
}