---
# System prepended metadata

title: Untitled

---

## 아래 여러 상황에서 각각의 상황에 맞는 방법을 클래스의 상속과 프로토콜 기본 구현 중 골라서 직접 코드로 구현해보세요.

- 상황 1 : 야곰 아카데미 구성원 각각의 역할을 표현하고 싶을 때 (ex : 캠퍼, 크루, 리더, 매니저, 서포터, 리뷰어 등)
- 상황 2 : 각종 도형(삼각형, 사각형, 정사각형, 직사각형, 평행사변형 등등)을 타입으로 표현하고 싶을 때
- 상황 3 : 탈것(자동차, 승용차, 버스, 트럭, 기차, 보트, 비행기, 오토바이, 자전거, 퀵보드 등등)을 표현하고 싶을 때
- 상황 4 : 포켓몬(피카츄, 라이츄, 파이리, 꼬부기, 또가스, 또도가스, 잉어킹, 갸라도스 등등)을 표현하고 싶을 때


- 4개 중 3개 선택하여 진행
- 각각의 상황에서 해당 방식을 택한 이유는 무엇인가요?
- 각 방식의 한계점에는 무엇무엇이 있을까요?
- 클래스의 상속과 프로토콜 기본구현이 모두 가능한 상황이라고 가정한다면, 둘 중 하나의 방법으로 선택에 있어 고민해봐야 하는 지점은 무엇이 있을까요?



- 상황 1 : 야곰 아카데미 구성원 각각의 역할을 표현하고 싶을 때 (ex : 캠퍼, 크루, 리더, 매니저, 서포터, 리뷰어 등)

공통된게 없다. 각자의 역할만 있다.
그래서 상속 보다는 프로토콜 기본 구현이 맞는 것 같다




```swift!
protocol Person {
    var name: String { get set }
    var age: Int { get set }
}

protocol canHelp {
    func help()
}

protocol Camper: Person {
    func ask()
}


protocol Crew: Person, canHelp { }

protocol Supporter: Person, Camper, canHelp {
    func mentor()
}
```

- 상황 3 : 탈것(자동차, 승용차, 버스, 트럭, 기차, 보트, 비행기, 오토바이, 자전거, 퀵보드 등등)을 표현하고 싶을 때

```swift!
// Driveable
protocol Driveable {
    func drive()
}

extension Driveable {
    func drive() {
        print("I can drive")
    }
}

// Flyable
protocol Flyable {
    func fly()
}

extension Flyable {
    func fly() {
        print("I can fly")
    }
}
// Attachments
protocol Thrusters { }
protocol Wheels {
    var wheelsCount: Int { get }
}
protocol Wings { }
protocol Engine { }


protocol TruckWheels: Wheels {
}

extension TruckWheels {
    var wheelsCount: Int {
        return 8
    }
}

// 이동수단
protocol Car: Driveable, Wheels, Engine { }
protocol Truck: Driveable, TruckWheels, Engine { }
protocol AirPlane: Flyable, Wings, Wheels, Engine { }
protocol Boat: Driveable, Engine, Thrusters { }

struct MyPlane: AirPlane {
    var wheelsCount: Int
}

struct MyCar: Car {
    var wheelsCount: Int
}

struct MyTruck: Truck { 
    // wheelsCount는 TruckWheels 프로토콜에서 Extension을 통해 기본 구현함.
}

let myPlane = MyPlane(wheelsCount: 2)
myPlane.fly() // returns I'm flying

let myCar = MyCar(wheelsCount: 4)
myCar.drive() // return I'm driving


let myTruck = MyTruck()
myTruck.wheelsCount // return 8

```

- 상황 2 : 각종 도형(삼각형, 사각형, 정사각형, 직사각형, 평행사변형 등등)을 타입으로 표현하고 싶을 때
```swift!
class 도형 {
    var 변의갯수: Int?
    
    init(갯수: Int? = nil) {
        self.변의갯수 = 갯수
    }
}

class 삼각형: 도형 {
    override init(갯수: Int? = nil) {
        super.init()
        self.변의갯수 = 3
    }
}

class 사각형: 도형 {
    
}

class 직사각형: 사각형 {
    
}

class 정사각형: 직사각형 {
    
}

class 평행사변형: 사각형 {
    
}

let 나의삼각형: 삼각형 = 삼각형()
나의삼각형.변의갯수

```

75분 활동, 16:15에 만나요!