프로토콜!!
참.. 알면 알수록 어렵다!
객체 지향 프로그래밍의 다형성, SOLID 법칙
WWDC 2015 - 프로토콜 지향 프로그래밍
Swift 5.7 Opaque Type(some, any)
Generic
적용할 수 있는 것들도 많고 생각해야 할 것도 참 많네요. 😋
근데 일단 활용할 수 있는 것들은 잠시 놔두고
기초인 프로토콜이 무엇인지 뭘 할 수 있는지 알아보려고 합니다!!
ㄱㄱ
목차
- 프로토콜 정의
- 언제 프로토콜 사용하는지
- 프로토콜에서 요구사항의 청사진이 될 수 있는 것들
1. 프로토콜 정의
프로토콜은 특정 작업이나 기능에 적합한 메서드, 속성 및 기타 요구 사항의 청사진을 정의합니다. 그런 다음 해당 요구 사항의 실제 구현을 제공하기 위해 클래스, 구조 또는 열거형에서 프로토콜을 채택 할 수 있습니다. 프로토콜의 요구 사항을 충족하는 모든 유형은 해당 프로토콜을 준수 한다고 합니다.
- Apple 문서 번역
청사진?? 뭔말인가 했는데 진짜 그냥 청색사진(blueprint)이었네요. ㅋㅋ
청사진이란?
19세기에 복잡한 설계도면 사본을 만들려고 하면 그 당시 복사기는 없었기 때문에 힘들었습니다. 그래서 19세기 영국의 J. F. W. 허셜이라는 사람이 청사진이라는 방법을 고안해냅니다. (반투명한 용지에 도면을 그리고 수산화철(Ⅲ)시트르산 수용액으로 처리된 인화지에 겹쳐 놓은 뒤 일정시간 빛에 노출시켜 적혈염 수용액으로 씻으면 인화지에 원래 그렸던 도면이 복사되는 방법)
그러한 방법으로 나온 결과물인 복사된 설계도가 청사진(blueprint)입니다.
'무언가의 설계나 뼈대 = 청사진'
결론 : 프토토콜은 메서드, 속성 및 기타 요구 사항의 뼈대이다.
2. 언제 프로토콜을 사용하는지?
프로토콜은 언제 어떻게 사용하는지 알아보기 위해 예시를 하나 준비했습니다.
class Hummans {
func run()
}
class Maraton {
func start(with participants: Hummans) {
participants.run()
}
}
마라톤이라는 클래스에서 사람들이 참여자로 시작할 수 있습니다.
그런데 마라톤 참여자는 사람뿐 아니라 달릴 수 있는 모든 것들이 참여가 가능하다고 하네요!?
이럴 때 프로토콜을 사용하면 좋습니다!
protocol Runnable {
func run()
}
class Hummans: Runnable {
func run() {
// 구체적인 구현
}
}
class Dogs: Runnable {
func run() {
// 구체적인 구현
}
}
class Cats: Runnable {
func run() {
// 구체적인 구현
}
}
class Maraton {
func start(with participants: Runnable) {
participants.run()
}
}
위에서 강아지랑 고양이를 추가했는데 사실 달릴 수 있는 모든 것은 종류가 더 많잖아요. 이렇게 확장 가능성이 높을 때
프로토콜을 쓰면 어떤 클래스를 만들던 확장성이 있는 구조가 됩니다.
물론 구조가 복잡해지기 때문에 확장 가능성이 있는지 없는지 고민해보셔야 합니다.
확장 가능성이 있을 때 확장성 있는 구조로 만드는 것이 좋은거지 가능성도 없는데 그렇게 만들면 괜히 코드만 복잡해지는 거니까요.
3. 프로토콜에서 요구사항의 청사진이 될 수 있는 것들
- 메서드, 타입 메서드
- 프로퍼티, 타입 프로퍼티
- 이니셜라이저
- 서브스크립트
- Associated Types
protocol SomeProtocol {
// 프로퍼티, 타입 프로퍼티
var dice: Dice { get }
// 메서드, 타입 메서드
static func someTypeMethod()
func random() -> Double
mutating func toggle()
// 이니셜라이저
init(someParameter: Int)
// 서브스크립트
subscript(index: Int) -> String { get set }
// Associated Type
associatedtype ItemType
}
또한 프로토콜은 상속과 조합 옵셔널 요구사항, 연관 타입 제약 조건 등 다양하게 사용할 수 있는데 이것들은 너무 길어질 것 같아서 다음 글에서 작성하겠습니다!
'IOS Swift' 카테고리의 다른 글
빌드 환경에 따라 분기처리하기(feat: xcconfig) (0) | 2024.02.05 |
---|---|
iOS Deep Link, Push Notification 시뮬레이터에서 테스트 하기 (2) | 2024.02.02 |
[iOS] imageView 이미지 크기대로 동적 사이즈 변경 (0) | 2023.10.06 |
[iOS 13+] SwiftUI 공식문서로 공부하기 (0) | 2023.08.06 |
IBDesignable, IBInspectable 알아보기 (2) | 2023.07.16 |