---
# System prepended metadata

title: POP
tags: [복 & 면]

---

# POP 
- 코드의 재사용성, 확장성, 유연성 및 유지보수 가능! 사기급 프로토콜!

```swift
protocol 탈것 {
    func start()
    func stop()
}

struct 차: 탈것 {
    func start() {
        print("시작")
    }
    func stop() {
        print("그만")
    }
}
```
- 먼저 탈것에 대한 청사진을 정의한다, 구현의 세부사항은 제공하지않는다. 이러한 부분에 대해서는 익스텐션을 통해 진행하거나 채택된 객체에서 구현을 진행해야한다. 채택된 객체는 프로토콜을 준수하는 객체가 되어야 한다.

#### 확장 및 기본 구현
- 포로토콜 확장을 사용하면 프로토콜 메서드에 대한 기본 구현을 제공 할 수있습니다. 예를 들어 탈것에 대한 프로토콜을 확장하여 start() 메서드에 대한 기본 구현을 포함할 수 있습니다.

```swift
extension 탈것 {
    func start() {
        print("가즈아~")
    }
}

struct 차: 탈것 {
    func stop() {
        print("그만")
    }
}  
//start 메서드는 기본구현이 되어있기때문에 오버라이딩해서 쓰거나 필요할때 사용하면된다. 따로 start에 대해서 구현하지 않아도 탈것 프로토콜의 기본 구현이 적용되기때문
```

#### 프로토콜 구성
- 프로토콜을 더 작고 관리 가능한 여러 개로 나눌 수 있다. 인터페이스 분리의 법칙에서 생각하듯이?? 아무튼 프로토콜 구성을 사용하여 여러 프로토콜을 결합하여 유연하고 모듈화된 코드를 만들 수 있습니다.
두개의 프로토콜을 결합하여 하나의 객체에 사용하기
```swift
protocol 운전기능 {
    func drive()
}

protocol 주차기능 {
    func parking()
}

typealias 자동차 = 운전기능 & 주차기능

struct 현대차: 자동차 {
    func drive() {
        print("운전 진행")
    }
    
    func parking() {
        print("주차 진행")
    }
}
```
지금 현대차는 운전기능, 주차기능 두 프로토콜 기능을 모두 포함하고 있습니다. 이런 방식으로 포로토콜 구성을 사용하여 제공하는것을 독립적?으로 사용하고 유연하게 쓸 수 있습니다. 프로토콜을 쓰게 되면 가불기 코드 재사용성과 유지 보수성을 향상시킨다.

#### 프로토콜의 상속?
- 하나의 프로토콜이 다른 프로토콜로부터 속성이나 메서드를 상속받을 수 있게 해줍니다. 이를 통해 특정 프로토콜을 구체화하거나 확장할 수 있습니다.
-  예를 들어 
```swift
protocol 충전기능: 탈것 {
    var recharge()
}

struct 전기차: 충전기능 {
    func recharge() {
        print("충전!")
    }
    
    func stop() {
        print("그만")
    }
    
    start() 는 익스텐션으로 구현했기에 기본구현됨.
}
```
전기차는 전기탈것 프로토콜을 준수하여 탈것에 대한 기능 을 상속받으면서 추가로 전기탈것에 대한 기능을 포함하게 됩니다. (이렇게 쪼개면서 하는게 인터페이스 분리가 아닐까 싶습니다. 아 물론 지금은 프로토콜의 상속이 진행되어있지만 분리하여 구현했을때도 적용사항일꺼같네요.)
(프로토콜을 분리하고 상속함으로써, 인터페이스분리 원칙을 효과적으로 적용시킨다!)
이러한 방식으로 프로토콜 확장과 상속은 스위프트의 POP(프로토콜 지향 프로그래밍)의 코드 재사용성과 유연성을 증가시키는 중요한 도구 입니다.


이제 여기서 더깊이 가야한다면 의존성 역전 법칙인데.. 음... 산이 크네..