프로토콜 Protocol

Lena·2022년 1월 18일
0

Swift

목록 보기
8/8

프로토콜

  • 특정 기능이나 속성에 대한 설계도 (청사진)
  • 직접 구현하는 것이 아니라 정의만 해준다.
  • 구현해야 할 메소드의 명세가 작성되어 있다 -> 프로토콜만 봐도 무엇을 어떻게 호출해야 하는지 알 수 있다.
  • 구체적인 내용이 없는 프로터티나 메소드의 단순한 선언 형태로 구성된다.

명세

프로토콜에 선언된 프로퍼티나 메소드의 형식

구현

이 명세에 맞춰 실질적인 내용을 작성하는 것
프로토콜을 상속받는 구조체나 클래스에서 구현한다.

상속과 프로토콜의 차이

상속은 종적인 개념이라면 프로토콜은 횡적인 개념이다.
(대상 클래스 전체를 책임지는 것이 아니고, 단지 몇 가지 기능의 형식만 담당하기 때문)

  • 클래스로 상속하는 경우
  class Bird {

      var isFemale = true

      func layEgg(){
          if isFemale {
              print("새는 둥지에 알을 낳는다!")
          }
      }

      func fly(){
          print("새가 하늘에서 날개를 퍼덕이며 날아간다!")
      }
  }

  class Eagle: Bird {
      func soar() {
          print("독수리는 바람을 타고 솟아오른다!")
      }
  }

  class Penguin: Bird {
      func swim(){
          print("펭귄은 물장구 치며 수영한다!")
      }
  }

  class Airplaine: Bird {
      func override fly(){
          print("비행기는 엔진으로 하늘을 난다!") 

상속을 받게 되는 경우 하늘을 나는 펭귄, 수영하는 독수리, 알을 낳는 비행기가 탄생하게 된다...

  • 프로토콜의 경우
  protocol CanFly {
      func fly() // 구현을 하지 않는다 (중괄호 들어오면 안됨)
  }

  class Bird {
      var isFemale = true

      func layEgg(){
          if isFemale {
              print("새는 둥지에 알을 낳는다!")
          }
      }
  }

  class Eagle: Bird, CanFly {
      func fly() { // fly()구현을 프로토콜에서 하지않고 여기서 해준다
          print("독수리는 날개짓을 하며 하늘을 난다.")
      }

      func soar() {
          print("독수리는 바람을 타고 솟아오른다!")
      }
  }

  class Penguin: Bird {
      func swim(){
          // 이제 Bird Class에 fly()함수가 없고,
          // CanFly 프로토콜을 상속받지 않았으므로 하늘을 나는 펭귄은 더 이상 존재하지 않을 수 있다!!
          print("펭귄은 물장구 치며 수영한다!")
      }
  }

  struct Airplane: CanFly {
      func fly() {
          print("비행기는 엔진을 이용해 하늘을 난다!")
      }
      //  이제 비행기도 더 이상 알을 낳지 않고 날기만 한다!
  }

Defining the Protocol

protocol MyProtocol {
	// Define requirements
}

Adopting the Protocol

struct MyStruct: MyProtocol {}
class MyClass: MyProtocol {}

Adopting Multiple Protocols

struct MyStructure: FistProtocol, AnotherProtocol {
	// 구조체 정의
}

In Addition to a Superclass

class MyClass: SuperClass, FirstProtocol, AnotherProtocol  {
	// 부모클래스 먼저 쓰고 이후에 프로토콜 쓰기 
}

0개의 댓글