ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] - protocol을 사용하는 이유
    iOS/iOS 2024. 8. 31. 17:34
    728x90
    반응형

     

    저번 포스팅에 이어서 protocol에 대한 내용을 포스팅 해보려고 한다.

     

    protocol를 사용하는 이유

     

    swift는 다중 상속을 지원하지 않는다.

     

    일단 상속이라는 개념이 클래스 외에는 지원하지 않는다.

    클래스는 한 클래스당 하나의 부모클래스만을 가질 수 있는데, 프로토콜을 다중 채택이 가능하기 때문에 다중 상속을 대체할 수 있다.

     

    한가지 예시로 SceneDelegate파일을 파보자

    이 클래스는 UIkit 프로젝트를 생성하면 기본적으로 생성되는 클래스다.

    보면 SceneDelegate는 UIResponser, UIWindowSceneDelegate 두가지를 가지고 있다.

    여기서 UIResponder는 이벤트에 응답하고 처리하기 위한 추상 인터페이스 클래스이다.

     

    우리는 이로써 두가지를 알 수 있다.

     

    1. SceneDelegate는 UIResponser라는 클래스를 상속받고 있다.

    2. UIWindowSceneDelegate는 클래스가 아니다.

     

    UIWindowSceneDelegate가 클래스가 아닌 이유는 위에서 언급 했듯이 클래스를 단일 상속만 허용하기 때문이다.

    그리고 UIWindowSceneDelegate의 선언 쪽을 보면

    프로토콜이 맞다.

     

    swift에선 delegete pattern과 우리가 구조체,열거형에서 사용하는 View, Codable은 모두 프로토콜에 속한다.

     

    유연한 다형성 제공

    유연한 다형성이라는 말은 각기 다른 데이터 타입에서 채택할 수 있다는 뜻이다.

    예를 들어 Encoding, Decoding을 하기 위한 데이터 타입을 정의한다고 했을 때 구조체와 클래스 모두 하나의 프로토콜을 채택하여 사용할 수 있다. 

    struct A:Codable{
        let title:String
    }
    class B:Codable{
        let title:String
    }
    
    var a:A?
    var b:B?
    
    func print(){
        print(a?.title ?? "")
        print(b?.title ?? "")
    }

     

    다만 이런 인스턴스를 생성할 때는 구조체를 사용하는 편이다. 클래스를 사용해야만 하는 이유가 아닌 이상은 애플에서도 권장하고 있는 부분이다. 

     

     

    이외에도 여러 이유가 존재하지만, 개인적으로 중요하다고 생각하는 두가지를 준비해봤다.

    참고로 모든 프로토콜이 이렇게 클래스와 구조체에서 모두 채택될 수 있는 것도 아니다. 용도에 맞게 잘 확인하며 쓰도록 하자.

Designed by Tistory.