---
# System prepended metadata

title: Untitled

---

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

- 각각의 상황에서 해당 방식을 택한 이유는 무엇인가요?
    - 도형(Protocol)
        - 질문 사항에서 "도형을 타입으로 표현하고 싶을 때"라는 말이 있는데 타입은 클래스, 구조체, 열거형이므로 클래스끼리 상속이 가능한 클래스 형태보다 Protocol이 맞다고 생각되었습니다.
    - 포켓몬
        - 포켓몬의 경우 공통된 속성, 메서드만 지니기에 상속만으로 구현이 가능하다고 생각되었습니다.
- 각 방식의 한계점에는 무엇무엇이 있을까요?
    - 상속 : 클래스에서밖에 사용할 수 없다
    - 프로토콜 기본 구현 : 확장을 이용하여 기본 구현까지 작성해주게 되어 코드가 길어진다

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

    - 코드의 재사용성
    - 코드의 가독성과 유지 보수성 

    클래스의 상속은 코드의 재사용성을 높일 수 있어서 중복된 코드를 줄일 수 있다. 하지만 클래스간의 관계가 복잡해지면 코드의 이해가 어려울 수 있어서 가독성 및 유지보수의 단점이있다. 프로토콜의 경우 다형성을 구현 할 수 있어서 유연성이 높아지지만 코드의 중복이 발생할 수 있다. 


```swift
protocol 도형 {
    var 점의개수: Int { get }
    var 도형이름: String { get }
}

extension 도형 {
    var 도형이름: String {
        return "\(점의개수)각형"
    }
}

struct 삼각형: 도형 {
    var 점의개수 = 3
}

struct 사각형: 도형 {
    var 점의개수 = 4
}

struct 오각형: 도형 {
    var 점의개수 = 5
}

class 포켓몬 {
    let 속성: String
    
    init(속성: String) {
        self.속성 = 속성
    }
    
    func 스킬() {
        print("스킬 사용")
    }
}

class 피카츄: 포켓몬 {
    override func 스킬() {
        print("번개 스킬 사용")
    }
}

class 파이리: 포켓몬 {
    override func 스킬() {
        print("불 스킬 사용")
    }
}

```