[iOS]왜 protocol을 사용해야 하는가?

신용철·2020년 9월 17일
0

iOS_Swift

목록 보기
3/6

1. 반복되는 coding 작업을 피하기 위한 다형성의 needs

  • 우리는 때때로 서로 다른 두 객체를 공통된 무엇인가(Type)으로 grouping을 하고 싶을 때가 있습니다. 혹은 공통된 속성을 지닌 두 개 이상의 객체들을 효율적으로 코딩하기 위해 공통된 속성들을 별도로 분리해 놓고 객체들이 이를 상속받아 같은 속성들을 여러번 코딩하는 것을 방지하고 싶을 때도 있습니다. 이 경우에 1차적으로 공통 속성을 정의하는 super class를 만들어 상속하는 방법을 생각할 수 있습니다. 하지만 이 방법은 매우 제한적입니다.

2. 상속의 한계

  • class 객체는 기본적으로 하나의 super class만을 상속 받을 수 있습니다. 따라서 연결하고자 하는 객체가 이미 서로 다른 super class를 상속받았다면 두 객체를 상속으로 연결하는 방법은 더이상 사용할 수 없습니다.

  • 다음으로 상속은 class 객체에만 적용 가능한 다형성 기법입니다. struct나 enum 객체는 상속을 사용할 수 없습니다.

  • 자전거와 자동차를 예로 들어보겠습니다. 자전거와 자동차는 교통수단이라는 공통점을 가지고 있습니다. 하지만 이 두 교통수단을 하나의 super class로 묶기에는 목적에 따라 다르겠지만 공통점이 매우 적습니다. 또한 자전거와 자동차가 이미 각각 super class를 상속했을 가능성도 있습니다. 이런 경우에 두 객체를 어떻게 서로 연결지을 수 있을까요?

    protocol Transportation { 
        func ride()
    }
    
    class Car: HyundaiMotors, Transportation{
        func ride() {
           
           }
    }
    
    class Bicycle: Samchuly, Transportation {
        func ride() {
           
           }
    }
    
  • 위의 예에서 자전거는 부모클래스로 삼천리를, 자동차는 부모클래스로 현대자동차를 상속하고 있습니다. 따라서 class상속을 통해 두 객체를 연결 짓는 것은 더이상 할 수 없습니다. 하지만 protocol을 사용하면 두 객체를 같은 Type으로 만들 수 있습니다.

  • 만약 자동차와 자전거가 class가 아닌 struct나 enum이라면 오로지 protocol을 통해서만 두 객체를 하나의 타입으로 만들 수 있습니다.

3. Type으로서의 활용

  • 우리는 protocol을 변수의 type이나 함수의 parameter type으로 사용할수 있습니다.
    protocol Transportation: class { 
       func ride()
    }
    class Car {
      var somethingToride: Transportation?
      
      func goHome(how: Transportation){
                  how.ride()
        }
    }
  • Tip: protocol을 변수의 타입으로 사용하려면 프로토콜 선언시 ': class'를 붙여주어야 합니다.
  • 위 Car의 somethingToride변수와 goHome메서드의 parameter에는 Transportation이라는 protocol을 채택하여 인스턴스화한 객체들만이 들어올 수 있습니다. 이 처럼 protocol을 Type으로 활용할 수 있습니다.
profile
iOS developer

0개의 댓글