Protocol

조재민·2023년 8월 23일
0

Protocol

Protocol 이란?


  • 어떤 기능에 적합한 특정 메서드, 프로퍼티 및 기타 요구사항의 청사진
  • 클래스, 구조체, 열거형에 의해 채택됨
  • 프로토콜에 정의된 요구사항의 실제 구현을 제공

☛ 프로토콜은 "약속" 이다.

예를 들어 프로토콜을 밴드라고 예를 들어보자.
밴드를 만들기 위해서는 여러 악기들이 필요하다. 기타, 드럼, 베이스, 키보드, 보컬 등등이 필요하다. 그 외의 악기들이 더 있을 수도 있겠지만 보통 밴드라 함은 기타, 드럼, 베이스, 보컬이 필수적이다.

밴드를 결성하면 목표가 있을 것이다. 저 5악기를 통해 어떤 곡을 연주하는 것이 밴드의 목표다.

밴드(프로토콜)를 구성하기 위해서는 필수 악기들(프로퍼티)과 연주(메서드)로 이루어져야 하는 것이다.
즉, 프로토콜이란 보컬이 누구고, 무슨 악기를 연주하고, 어떤 곡을 연주하고 그런 것이 아닌 이런 악기들이 필요해, 이런 곡을 연주해야해 라고 해당 기능에 필요한 요구 사항을 선언해두는 것이 Protocol 이다.

<예시 코드>

protocol Band: AnyObject {
    var drum: String { get set }
    var vocal: String { get set }
    var piano: String { get set }
    var guitar: String { get set }
    var base: String { get set }
    
    func play()
}

위에서 설명한 것처럼 밴드라는 이름의 프로토콜을 정의할 수 있다.
프로퍼티를 선언하여 값을 직접 정의하고 메서드를 직접 구현하는 것이 아님
☞프로토콜을 따르려면 이러한 것들이 필요하다 라는 약속을 정의하는 것

채택 방법

// protocol 선언
protocol Band: AnyObject {
    var drum: String { get set }
    var vocal: String { get set }
    var piano: String { get set }
    var guitar: String { get set }
    var base: String { get set }
    
    func play()
}

class ABand: Band { //프로토콜 채택 
		var drum: String = "A"
        var vocal: String = "B"
        var piano: String = "C"
        var guitar: String = "D"
        var base: String = "E"
        
        func play() {
        	print("Heize 첫눈에 연주 중")
        }
}

➢ Band 프로토콜에서 선언되었던 녀석들을 채택한 곳인 ABand라는 구조체 안에서 실제로 구현해주어야 함

프로토콜 -> 프로퍼티/메서드에 대한 껍데기만 제공, 실제 구현은 채택한 곳에서 함

프로토콜에 선언되지 않은 프로퍼티를 구현하고 싶을 때

  • optional 로 선언
protocol Band: AnyObject {
    var drum: String { get set }
    var vocal: String { get set }
    var piano: String { get set }
    var guitar: String { get set }
    var base: String { get set }
    
    func play()
}

class ABand: Band {
    var drum: String = "A"
    
    var vocal: String = "B"
    
    var piano: String = "C"
    
    var guitar: String = "D"
    
    var base: String = "E"
    
    var violin: String?
    
    func play() {
    }
    
    
}

프로토콜 / 프로퍼티,메서드 선언

프로토콜에서 프로퍼티 선언하기

class ABand: Band {
    var piano: String = "sodeul"    // piano 프로퍼티를 저장 프로퍼티로 정의
}
 
class BBand: Band {
    var piano: String {             // piano 프로퍼티를 연산 프로퍼티로 정의
        return "sodeul"
    }
}
 
  • 프로토콜에서 선언되는 프로퍼티는 항상 var로 선언되어야 함
protocol Band {
	var piano: String { get set }
}

➣ 연산 프로퍼티는 당연히 var 로 선언
➣ 저장 프로퍼티 경우, 타입 뒤에 달려있는 { get set } 에 따라 다름

{ get }

실제 채택하는 곳에서 저장 프로퍼티로 구현할 경우 let, var 둘다 선언 가능

protocol Band {
    var piano: String { get }
   
}

<예시 코드>

class ABand: Band {
    let piano: String = "sodeul"          
}
 
class BBand: Band {
    var piano: String = "sodeul"          
}

but

연산 프로퍼티로 구현할 경우 getter만 만들어서 get-only로, 또는 getter setter 모두 만들어서 둘다 사용

class ABand: Band {
    var random: String = ""
    var piano: String {
        get {
            return "sodeul"
        }
    }
}
 
class BBand: Band {
    var random: String = ""
    var piano: String {
        get {
            return "sodeul"
        }
        set {
            self.random = newValue
        }
    }
}

{ get set }

  • 저장 프로퍼티인 경우 → 무조건 var로 선언
  • 연산 프로퍼티인 경우 → getter & setter 로 선언

<저장 프로퍼티 경우>

protocol Band {
    var piano: String { get set }
}

class BBand: Band {
    var random: String = ""
    var piano: String {
        get {
            return "sodeul"
        }
        set {
            self.random = newValue
        }
    }
}

프로토콜에서 메서드 선언하기

protocol Band {
    func play()
}

함수의 헤더 부분만 위처럼 작성하고

class ABand: Band {
    func play() {
        print("ABand!")
    }
}

바디부분은 해당 프로토콜을 채택하는 곳에서 직접 구현

profile
“누군가는 너를 사랑하고 있다.”

0개의 댓글

관련 채용 정보