---
# System prepended metadata

title: "Protocol Oriented Programming - Mint\U0001F608, KyungMin\U0001F43C, Jusbug\U0001F577️, Whales\U0001F42C"
tags: [활동학습]

---

활동학습 내용

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

야곰, 포켓몬, 도형
4개 중 3개 선택하여 진행
### 클래스의 상속과 프로토콜 기본구현이 모두 가능한 상황이라고 가정한다면, 둘 중 하나의 방법으로 선택에 있어 고민해봐야 하는 지점은 무엇이 있을까요? 
- 자식이 부모클래스의 특성과 기능을 물려받아 확장하는 것이 필요하거나 다른 클래스 계층 구조와 호환성을 유지하려는 경우는 클래스가 적합합니다. 반면 프로토콜은 클래스와 달리 더욱 유연하고 확정성이 뛰어나기 때문에 단일 상속만 가능한 클래스가 아닌 기본에 구현한 특징과 기능을 다른 독립적인 기능으로 확장이 가능한 프로토콜을 사용하는 것이 적합합니다.
- 수평적인 관계인지, 수직적인 관계인지 

### 각각의 상황에서 해당 방식을 택한 이유는 무엇인가요?
- 동시에 채택해야하는, 겹치는 속성이 있어서 protocol로 진행하였다.

- 다중 상속의 필요성: Swift에서는 클래스는 단일 상속만을 지원 하기때문에 여러 클래스의 기능을 확장하고 싶은 경우, 프로토콜을 사용하여 여러 프로토콜의 기능을 조합할 수 있음

### 각 방식의 한계점에는 무엇무엇이 있을까요?

- 클래스 상속의 한계: 단일 상속, 강력한 결합
- 프로토콜 상속의 한계:


```swift
// 야곰 - 캠퍼, 크루, 리더, 매니저, 서포터, 리뷰어

protocol YagomAcademy { }

protocol Camper {
    func studySwift()
}

protocol Crew {
    func alert()
}

protocol Leader {
    func lead()
}

protocol Manager {
    func manage()
}

protocol Supporter: Crew {
    func support()
    func mentoring()
}

protocol Reviewer {
    func review()
}

struct Mint: Camper, YagomAcademy {
    func studySwift() {
        <#code#>
    }
}

struct Som: Camper, Supporter, YagomAcademy {
    func studySwift() {
        <#code#>
    }
}

struct Watermelon: Camper, Supporter, Crew, YagomAcademy {
    func support() { }
    
    func mentoring() { }
    
    func alert() { }
    
    func studySwift() { }
}

struct Summer: Camper, Manager, Crew, YagomAcademy {
    func manage() { }
    
    func alert() { }
    
    func studySwift() { }
}

struct Weather: Reviewer, YagomAcademy {
    func review() { }
}

struct Yagom: Leader, YagomAcademy {
    func lead() { }

```

```swift
// 포켓몬 - 물, 불, 바람, 풀, 노말

protocol WaterType {
    var 물: String { get }
}

protocol FireType {
    var 불: String { get }
}

protocol GrassType {
    var 풀: String { get }
}

protocol PoisonType {
    var 독: String { get }
}

protocol NormalType { }

protocol InsectType { }

protocol FlyType {
    var 날개: String { get }
}

struct 꼬부기: WaterType {
    let 물: String = "물"
    
    func 물대포() { }
}

struct 리자몽: FireType, FlyType {
    var 불: String = "불"
    var 날개: String = "큰 날개"
    
    func 회오리불꽃() { }
}

struct 메타몽: NormalType {
    func 변신() { }
}

struct 이상해씨: GrassType, PoisonType {
    var 풀: String
    var 독: String
    
    func 덩굴채찍() { }
}

struct 단데기: InsectType {
    func 단단해지기() { }
}
```


```swift
// 도형 - 삼각형, 사각형, 정사각형, 직사각형, 평행사변형 등등
protocol 삼각형 { }
protocol 사각형 { }

protocol 예각삼각형: 삼각형 { }
protocol 둔각삼각형: 삼각형 { }
protocol 직각삼각형: 삼각형 { }
protocol 이등변삼각형: 삼각형 { }
protocol 정삼각형: 예각삼각형, 이등변삼각형 { }

protocol 사다리꼴: 사각형 {
    var 사다리꼴의특징: String { get }
}

extension 사다리꼴 {
    var 사다리꼴의특징: String {
        return "한 쌍의 대변이 평행"
    }
    
}

protocol 평행사변형: 사다리꼴 {
    var 평행사변형의특징: String { get }
}

extension 평행사변형 {
    var 평행사변형의특징: String {
        return "두 쌍의 대변이 평행"
    }
    
}

protocol 직사각형: 평행사변형 {
    var 직사각형의특징: String { get }
}

extension 직사각형 {
    var 직사각형의특징: String {
        return "네 각의 크기가 같음"
    }
    
}

protocol 마름모: 평행사변형 {
    var 마름모의특징: String { get }
}

extension 마름모 {
    var 마름모의특징: String {
        return "네 변의 길이가 같음"
    }
    
}

protocol 정사각형: 직사각형, 마름모 { }

```