ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [iOS] - protocol이란?
    iOS/iOS 2024. 8. 31. 16:30
    728x90
    반응형

     

    오늘은 protocol에 대한 내용을 포스팅 해보려고 한다.

     

    protocol

     

    프로토콜이란 특정 작업이나 기능에 맞는 메서드, 속성 및 기타 요구 사항의 청사진을 의미

     

    - swift는 프로토콜 지향 프로그래밍으로 객체 지향 프로그래밍에서의 상속보다 더 유연하고 확장 가능한 방식으로 코드를 구조화하는 것을 목표로 한다.

    - 프로토콜은 구조체 ,열거형 ,클래스 등에서 채택되어 사용될 수 있다.

     

     

    정의로는 항상 선뜻 이해하기가 어렵다.

    예시를 한번 들어보자.

     

    만약 철수,영희라는 사람에 대한 클래스를 정의한다고 하자.

    class 철수{}
    class 영희{}

     

    둘은 인간이라는 공통된 범주를 가지고 있고, 인간이 가지고 있는 인간의 특성에 대한 청사진을 만드려고 한다.

    한번 프로토콜로 만들어보자.

    protocol Person{
        var name:String{ get set }
        var age:Int{ get set }
        func eat()
        func sleep()
        func work()
    }

    이렇게 인간은 이름과 나이를 가지고 있고, 먹고 자며 일을 한다.(지옥)

     

    철수와 영희는 모두 이에 해당하는 인간이기 때문에 각각의 프로토콜을 채탱해준다. 그러면,

    class 철수:Person{
        var name: String
        var age: Int
        
        init(name: String, age: Int) {
            self.name = name
            self.age = age
        }
        func eat() {
            //action
        }
        func sleep() {
            //action
        }
        func work() {
            //action
        }
    }
    class 영희:Person{
        var name: String
        var age: Int
        
        init(name: String, age: Int) {
            self.name = name
            self.age = age
        }
        func eat() {
            //action
        }
        func sleep() {
            //action
        }
        func work() {
            //action
        }
    }

    이렇게 사용할 수 있다.

     

    프로토콜 내부에 선언된 자원들은 채택하는 쪽에서 사용을 하지 않더라고 무조건 선언을 해줘야한다.

    예시를 위해 '영희' 클래스에 work() 함수를 제외해보겠다. 

    그러면 이런 에러가 뜨게 된다.

     

    근데 영희는 일을 하지 않아서 work()를 굳이 안 사용하고 싶을 수도 있다.

    그럴 때는 work()를 옵셔널로 선언해주면 된다.

     

    @objc protocol Person{
        var name:String{ get set }
        var age:Int{ get set }
        func eat()
        func sleep()
        @objc optional func work()
    }

     

    optional 키워드는 objective-c에서 제공하는 키워드 이기 때문에 프로토콜 앞과 옵셔널로 선언하고 싶은 메서드 앞에 추가해준다.

    그러면 프로토콜을 채택하는 클래스에서 work()를 선언하지 않아도 위와 같은 에러는 뜨지 않는다.

    다만 objective-c의 프로토콜은 클래스에서만 채택할 수 있기 때문에 구조체나 열거형에서 채택하려할 경우 에러가 나서 주의할 필요가 있다.

     

    프로토콜 사용 방법과 주의사항만 간략히 포스팅 해봤다. 

    다음에는 프로토콜을 사용하는 이유에 대한 포스팅을 진행하겠다.

     

Designed by Tistory.