[Swift] Protocol (1)

조정미·2024년 6월 27일

자습 일지

목록 보기
5/7
post-thumbnail

개발자 소들이님 포스팅과 내배캠 강의 자료를 참고하여 공부를 위해 작성한 포스팅입니다.

프로토콜 (Protocol)

  • 특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항 등을 정의해놓은 [규약], 혹은 [약속]
  • class, structure, enum이 프로토콜을 채택하고 모든 요구사항을 충족하면 프로토콜을 준수했다고 한다
  • 프로토콜은 설계된 조건만 정의를 하고 제시를 할 뿐 스스로 기능을 구현하진 않음 (공식 문서에서 청사진이라 말하는 이유!)

예시

앱 개발과 출시라는 일련의 과정을 위해 필요한 필수 인원을 구한다고 생각하면~ 기획자, 디자이너, 개발자, 마케터 이렇게 기본적으로 네 명이 필수적일 것이다. 그리고 이 사람들은 모이면 그냥 가만히 있는 것이 아니라 업무를 진행하게 될 것인데 이게 바로 이들에게 주어진 요구사항인 것이다.

우리는 지금 앱 개발 및 출시 Project라는 것에 대한 가이드를 만글어낸 것이다. 이게 바로 프로토콜이다.

기획자가 누구고, 디자이너의 경력은 몇이며 어떻게 작업을 해야 하고 등... 이런 세세한 부분을 실제로 정해주고 이를 시작하는 것이 아니라 Project에는 이런 프로퍼티와 메서드가 꼭 필요하다고 이 기능에 대한 필수 요구사항을 선언해둔 것! 이게 바로 Protocol이다.

그럼 앞으로 A 앱 개발이든 B 앱 개발이든 이렇게 정의된 Project라는 프로토콜을 통하여(채택하여) 해당 인원과 업무 진행은 필수로 지켜져야 하는 것이 되는 거다!


프로토콜 정의 방법

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

protocol Project {
	var productManager :String {get set}
    var designer :String {get set}
    var developer :String {get set}
    var marketer :String {get set}
    
    func work()
}

프로토콜 채택하는 방법

Projec라는 일종의 약속을 만들고 새로운 프로젝트를 시작한다
-> 이때 클래스, 구조체, 열거형이 이를 채택해서 사용할 수 있다!

struct AProject :Project {}

그런데 이렇게 선언만 하면 오류가 뜨는데, 그 이유는 Project라는 protocol을 채택하기로 해놓고 왜 따르지 않느냐는 것이다

class AProject :Project {
	var productManager :String = "홍길동"
    var designer :String = "김영희"
    var developer :String = "박철수"
    var marketer :String = "오수희"
    
    func work() {
    	print("A app 개발 진행 중!")
    }
}

이렇게 Project 프로토콜에 선언만 된 것들을 채택한 AProject class 안에서 실제로 구현을 해주는 작업이 꼭 필요하다

즉, 프로토콜을 메서드와 프로퍼티에 대한 껍데기고 실제 구현은 채택한 곳에서 이루어지게 된다!


옵셔널 선언도 가능하다

위에 Project 프로토콜 안에 선언된 메서드와 프로퍼티는 모두 필수적(required)인 것이라 채택 곳에서 구현하지 않을 경우 에러가 발생하게 된다

그러나 예를 들자면 이 Project에 신입 사원도 안에 넣고 싶은데 필수 인력은 아닌지라 각각의 프로젝트마다 있을 수도 있고 없을 수도 있는 인원인데 이럴 때 optional로 선언이 가능하다

@objc protocol Project {
	var productManager :String {get set}
    var designer :String {get set}
    var developer :String {get set}
    var marketer :String {get set}
    @objc optinal var newRecruits :String {get set}
    
    func work()
}

newRecruits라는 프로퍼티 앞에 @objc optinal를 붙여주면 required가 아닌 optinal로 바뀌면서 해당 프로퍼티만 채택해주는 곳에서 선언하지 않아도 에러가 발생하지 않는다! (이때 옵셔널에 @objc를 붙이기 때문에 당연히 클래스에도 이것이 붙어야 한다!!)

@objc라는 문법을 붙일 때 주의할 점은 이것이 붙었을 때 Objective-C에서도 사용될 수 있다는 의미가 되는데 이곳에서의 프로토콜은 오로지 class에서만 채택할 수 있기 때문에 다른 구조체를 사용하면 에러가 발생한다.

또한 Optional인 만큼 채택하는 곳에서 선언을 했을 수도 있고 안 했을 수도 있기 때문에 옵셔널이 붙은 타입으로 접근을 해야 한다

0개의 댓글