본문 바로가기
🍎iOS프로그래밍/오늘의 공부

Swift의 프로토콜(Protocol) / iOS프로그래밍

by 둥둥동동# 2021. 10. 16.
728x90

 

프로토콜(Protocol)

 

프로토콜이란

프로토콜 정의

프로토콜 채택

프로토콜 상속

 

프로토콜(Protocol)이란

 

자바,C#의 인터페이스같은 역할을 합니다

프로퍼티, 메서드들의 구현없이 선언들로만 구성되어 프로토콜을 채택하는 클래스에게 구현을 강제하는 역할을 합니다

구조체, 클래스, 열거형이 프로토콜을 채택할 수 있고 요구사항을 구현하게되면 프로토콜을 준수(conform)한다고 표현

 

protocol 프르토콜이름 {
  	프로토콜 정의
}

 

 

프로토콜 정의(Declare)

 

프로토콜을 정의하는 방법음 다음과 같습니다

protocol SomeProtocol{
    var num1: Int {get}
    static var num2: Int {get set}
    func SomeFunc() -> String
}
cs

 

프로퍼티는 두가지 종류로 선언 가능합니다

  • 읽기전용 {get}
  • 읽기쓰기 {get set}

여기서 get과 set은 getter와 setter를 의미합니다 

프로퍼티의 {get set}은 쓰기가 가능해야하므로 let으로 선언이 불가능 합니다

{get set}은 읽기, 쓰기 모두 가능합니다

SomeFunc()메서드는 구현하지 않고 선언만 했습니다

아래에서 이 프로토콜을 채택해보겠습니다

 

 

프로토콜 채택(Adopt)

 

class myClass:SomeProtocol{
    var num1: Int = 2
    static var num2: Int = 3
    func SomeFunc() -> String{
        return "프로토콜 준수"
    }
}
cs

Someprotocol을 채택한 myClass를 만들었습니다

프로토콜의 채택은 클래스의 상속처럼 작성할 수 있습니다

만약 여러개의 프로토콜을 구현한다면 아래와 같이 작성할 수 있습니다

class myClass:Protocol_1, Protocol_2{
 
}
cs

, 로 프로토콜을 구분시켜 줍니다

 

 

여기서 만약 상속까지 받는다면?

class myClass:SuperClass, Protocol, Protocol2{
 
}
cs

상속받을 클래스를 맨 앞에 두어 프로토콜과 구분시킵니다

그렇다면 문제점이 하나 발생하는데 클래스를 상속 받는 것인지, 프로토콜을 채택한 것이지 구별이 가지 않습니다

해결법은 딱히 없지만 프로토콜의 이름을 통해 프로토콜임을 유추할 수 있습니다

프로토콜은 통상적으로 -able, -delegate 같은 이름을 많이 사용합니다

 

 

프로토콜의 상속(Inheritance)

 

프로토콜은 프로토콜을 상속받아 더많은 조건을 추가할 수 있습니다

 

protocol Runable{
    func Run()
}
 
protocol Walkable{
    func walk()
}
 
protocol Jumpable:Runable,Walkable{
    func jump()
}
 
class Human:Jumpable {
    func Run(){
        print("뛴다")
    }
    
    func walk(){
        print("걷는다")
    }
    
    func jump(){
        print("점프")
    }
}
cs

Runable, walkable을 상속받은 Jumable을 채택하면 Runable, Walkable 또한 구현해야 합니다

 

 

 

 

추후 업데이트 - init, required, optional

 

참고자료

 

iOS프로그래밍기초(21-2학기)한성현교수님 강의 내용

 

728x90

댓글