기존의 객체지향 프로그래밍의 기조
→ 가장 기본이 되는 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")
}
}