라티의 작은 일기장

[8일차] 프로토콜 본문

Swift

[8일차] 프로토콜

코드라티 2023. 2. 27. 16:55

오늘은 연구실에서 공부 시작...!

오늘은 프로토콜에 대해서 공부해보려 한다. 사실 우리는 프로토콜이라는 단어가 생소하지는 않을 것이다. 톰 X루즈 형님 출연작의 제목에서도 등장하고, 첩보 영화나 드라마 등의 미디어에서도 프로토콜이라는 단어를 한 번쯤은 들어봤을 것이다.

프로토콜의 사전적 의미는 "규약"이다. 어떤 상황일 때 어떻게 어떻게 행동해라~ 라고 하는 행동 강령의 모음이라고 할 수 있다.

Swift에서도 프로토콜은 있는데, 지금부터 Swift의 프로토콜은 어떤 의미를 갖고 있는지 알아보려 한다.

 

프로토콜?

Swift에서 프로토콜은 특정 역할을 수행하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진(Blueprint)이라고 한다.

역시 원래의 의미와 크게 벗어나지 않는다. 특정 역할을 위한 프로토콜을 정의하고, 어떤 타입이 그 프로토콜이 요구하는 바를 모두 따른다면, 그 타입은 해당 프로토콜을 준수한다고 볼 수 있는 것이다.

프로토콜의 기본형을 알아보자.

protocol 이름 {
	프로토콜의 요구사항
}

간단하다. 그렇다면 특정 타입이 프로토콜을 준수하도록 하려면 어떻게 해야할까?

protocol SomeProtocol {
    
}

struct SomeStructure: SomeProtocol {
    
}

이것도 간단하게 구조체, 클래스, 열거형의 이름 뒤에 프로토콜을 마치 타입처럼 지정하는 식으로 프로토콜을 준수하도록 할 수 있다.

프로토콜 이름 뒤에 다른 프로토콜의 이름을 콤마로 구분해 나열하는 식으로 여러 개의 프로토콜을 지정할 수도 있다.

 

앞서 프로토콜은 특정 역할을 수행하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진이라고 하였는데, 그럼 지금부터 프로토콜 내에 그것들을 어떤 식으로 정의할 수 있는지 알아보자.

 

protocol FirstProtocol {
    var name: Int { get set }
    var age: Int { get }
}

 

프로토콜 내에 프로퍼티는 저장, 타입 프로퍼티로 구분되고, 프로퍼티를 지정할 때의 타입은 변수인 var로 지정해야 한다.

변수의 이름 뒤에 자료형을 지정하고, 중괄호 내에 get / set을 작성하여 읽기 및 쓰기 권한을 설정하는 것으로 저장 프로퍼티를 지정할 수 있다. 타입 프로퍼티는 저장 프로퍼티와 같은 형식으로 지정한 후 맨 앞에 static 키워드만 붙여주면 된다.

protocol AnotherProtocol {
    static var someTypeProperty: Int { get set }
}

자 그럼 프로퍼티를 정의한 프로퍼티를 실제 구조체에 적용시켜보자.

프로토콜에 정의된 fullName 프로퍼티가, 프로토콜을 준수하는 Person 구조체에 정의되어있지 않아서 컴파일러는 에러를 띄운다.

빠진 프로퍼티를 잘 정의해주면 프로토콜 준수 요건이 충족되어 이렇게 에러가 사라지는 것을 볼 수 있다.

 

프로토콜은 프로퍼티 이외에 메소드를 요구할 수도 있다. 이 때 요구할 수 있는 메소드는 인스턴스형, 타입형이 있다.

protocol SecondProtocol {
    func typeMethod()
}

메소드를 정의할 때에는 중괄호도 필요 없고, 넘겨받는 파라미터에 대한 것도 지정할 수 없다.

위에서 활용했던 FullyNames 프로토콜에 새롭게 printFullName() 메소드를 정의하였더니, 다시금 해당 프로토콜을 준수하는 구조체에 에러를 띄우는 것을 볼 수 있다. 프로토콜을 준수하도록 구조체에 메소드를 정의해주자.

역시 에러가 잘 사라지는 것을 확인할 수 있다.

 

마지막으로 프로토콜은 생성자 함수도 그것을 준수하는 타입에 요구할 수 있다.

프로토콜에 정의하는 생성자 함수는 파라미터를 지정할 수도 있고, 하지 않아도 된다.

protocol ThirdProtocol {
    init()
}

protocol FourthProtocol {
    init(someParameter: Int)
}

이렇게 두 형식이 모두 가능한데, 그렇다면 이것을 준수하는 클래스를 한번 정의해보자.

ThirdProtocol을 준수하는 SomeClass를 정의해보았다.

프로토콜에서 요구하는 생성자 함수를 타입에서 정의할 때에는 생성자 함수 앞에 required 키워드를 붙여줘야한다.

이것은 클래스에서만 해당이 되고, 구조체에서는 붙이지 않아도 된다.

또한 해당 생성자 함수가 상속을 받을 수 없는 final 키워드가 적용되어있다면, 그 역시 붙이지 않아도 된다.

 

 

패스트캠퍼스 바로가기 : http://bit.ly/3Y34pE0

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

> 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

'Swift' 카테고리의 다른 글

[10일차] try-catch  (0) 2023.03.01
[9일차] 익스텐션, 열거형, 옵셔널 체이닝  (0) 2023.02.28
[7일차] assert와 guard  (0) 2023.02.26
[6일차] 상속  (0) 2023.02.25
[5일차] 프로퍼티  (0) 2023.02.24