IMCAT.DEV
로그인 가입
Swift 입문 객체지향

Swift 프로토콜(Protocol) 개념

Swift 프로토콜(Protocol) 개념 — 초급

프로토콜(Protocol) 개념

1. 도입 (왜 배워야 하는가)

Swift에서 프로토콜은 객체 지향 프로그래밍의 중요한 구성 요소입니다. 프로토콜을 정의함으로써, 여러 클래스나 구조체가 공통적으로 따라야 할 규칙을 설정할 수 있습니다. 이는 코드의 재사용성을 높이고, 다양한 객체 간의 일관성을 유지하는 데 큰 도움이 됩니다.

프로토콜을 모르면 다음과 같은 문제가 발생할 수 있습니다:

  • 코드 중복이 발생하여 유지보수가 어려워집니다.
  • 객체 간의 관계를 명확히 할 수 없어, 협업 시 혼란이 생길 수 있습니다.
  • 의도한 기능이 제대로 작동하지 않을 위험이 있습니다.
  • 2. 핵심 개념 설명

    프로토콜은 특정 메서드, 프로퍼티, 그리고 기타 요구 사항을 정의하는 청사진입니다. 예를 들어, "운전 가능한" 차량을 생각해보세요. 모든 차량은 '운전'이라는 공통된 기능을 가져야 하며, 이를 프로토콜로 정의할 수 있습니다.

    용어설명
    프로토콜메서드, 프로퍼티 등의 규칙을 정의하는 청사진
    채택클래스, 구조체가 프로토콜을 구현하는 것
    확장기존 프로토콜에 새로운 기능을 추가하는 것

    3. 기본 코드 예제

    아래는 프로토콜을 정의하고 이를 채택하는 간단한 예제입니다.

    // 프로토콜 정의
    protocol Drivable {
        var speed: Int { get set }
        func drive()
    }
    
    // 프로토콜 채택
    class Car: Drivable {
        var speed: Int = 0
    
        func drive() {
            print("차가 시속 \(speed)로 주행 중입니다.")
        }
    }
    
    // Car 객체 생성 및 사용
    let myCar = Car()
    myCar.speed = 60
    myCar.drive()

    실행 결과

    차가 시속 60로 주행 중입니다.

    코드 한 줄씩 동작 설명

    1. protocol Drivable: Drivable이라는 프로토콜을 정의합니다.
    2. var speed: Int { get set }: 속도 속성을 정의합니다. 읽기/쓰기 가능해야 합니다.
    3. func drive(): 차량이 주행하는 메서드를 정의합니다.
    4. class Car: Drivable: Car 클래스가 Drivable 프로토콜을 채택합니다.
    5. var speed: Int = 0: 기본 속도를 설정합니다.
    6. func drive() {...}: 메서드를 구현하여 차량의 속도를 출력합니다.
    7. let myCar = Car(): Car 객체를 생성합니다.
    8. myCar.speed = 60: 속도를 60으로 설정합니다.
    9. myCar.drive(): drive() 메서드를 호출하여 차량의 주행 상태를 출력합니다.
    10. 4. 실전 활용 예제

      예제 1: 쇼핑몰에서 장바구니를 구현할 때

      장바구니에 담긴 상품들이 공통적으로 가져야 할 속성이나 메서드를 프로토콜로 정의할 수 있습니다.

      protocol Purchasable {
          var price: Double { get }
          func purchase()
      }
      
      class Product: Purchasable {
          var price: Double
          var name: String
      
          init(name: String, price: Double) {
              self.name = name
              self.price = price
          }
      
          func purchase() {
              print("\(name) 상품을 구매했습니다. 가격: \(price)원")
          }
      }
      
      let item = Product(name: "사과", price: 1000)
      item.purchase()

      예제 2: 게임 캐릭터를 구현할 때

      게임에서 모든 캐릭터가 따라야 할 행동을 프로토콜로 정의할 수 있습니다.

      protocol Character {
          var name: String { get }
          func attack()
      }
      
      class Warrior: Character {
          var name: String
      
          init(name: String) {
              self.name = name
          }
      
          func attack() {
              print("\(name)이 공격했습니다!")
          }
      }
      
      let hero = Warrior(name: "전사")
      hero.attack()

      5. 흔한 실수와 주의사항

    11. 프로토콜을 정의하지 않고 구현
    12. - 잘못된 코드:

         class Car {
             var speed: Int = 0
             func drive() {
                 print("차가 주행 중입니다.")
             }
         }

      - 올바른 코드:

         protocol Drivable {
             var speed: Int { get set }
             func drive()
         }
    13. 프로토콜의 요구사항을 구현하지 않음
    14. - 잘못된 코드:

         class Car: Drivable {
             var speed: Int = 0
             // drive() 메서드를 구현하지 않음
         }

      - 올바른 코드:

         class Car: Drivable {
             var speed: Int = 0
             func drive() {
                 print("차가 주행 중입니다.")
             }
         }

      6. 정리

    15. 프로토콜은 코드의 일관성과 재사용성을 높이는 데 필수적입니다.
    16. 프로토콜을 통해 객체 간의 관계를 명확히 할 수 있습니다.
    17. 프로토콜은 메서드와 프로퍼티를 명세하며, 이를 구현하는 객체는 해당 규칙을 따라야 합니다.
    18. 다음에 학습하면 좋은 주제: 프로토콜 익스텐션(Protocol Extension), 클로저(Closure), 제네릭(Generics).