- 아래 여러 상황에서 각각의 상황에 맞는 방법을 클래스의 상속과 프로토콜 기본 구현 중 골라서 직접 코드로 구현해보세요. - 각각의 상황에서 해당 방식을 택한 이유는 무엇인가요? - 도형(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("불 스킬 사용") } } ```