프로토콜 Protocol
특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항 등을 정의해둔 규약/약속
설계 조건만 제시하고 내부에서 기능을 구현하는 코드는 적지 않습니다!
protocol 프로토콜이름 {
// 프로토콜 정의
}
// 상속받는 클래스의 프로토콜 채택
class 클래스이름: 슈퍼클래스, 프로토콜1, 프로토콜2 {
// 클래스 정의
}
특징
- 상속과 비슷하지만 class 뿐만 아니라, struct와 enum에서도 사용할 수 있다
- 이름과 타입, gettable, settable을 명시한다
- 다중 상속이 가능하여 확장성이 좋다
- 타입으로 사용할 수 있다
associatedtype
프로토콜에서 실제 타입을 명시하지 않고
해당 프로토콜을 채택하는 타입에서 실제 타입을 결정하게 한다
typealias
간략한 별칭을 생성해서 사용할 수 있음
protocol Container {
associatedtype Item // 연관 타입
var count: Int { get }
mutating func append(_ item: Item)
func item(at index: Int) -> Item
}
struct IntContainer: Container {
typealias Item = Int // 연관 타입을 Int로 typealias하여 구현
var items = [Item]()
var count: Int {
return items.count
}
mutating func append(_ item: Item) {
items.append(item)
}
func item(at index: Int) -> Item {
return items[index]
}
}
var intBox = IntContainer()
intBox.append(5)
intBox.append(10)
print(intBox.item(at: 0)) // 출력: 5
/*
위의 예시에서 Container 프로토콜은 Item이라는 연관 타입을 가지고 있습니다.
이 연관 타입은 Container 프로토콜을 채택하는 구체적인 타입에서 실제 타입으로 정의됩니다.
IntContainer 구조체에서 Item을 Int로 typealias하여 실제 타입을 정의하고,
이를 사용하여 배열에 Int 값을 저장하고 반환하는 메서드를 구현합니다.
*/
확장 Extension
기존 타입의 소스코드에 접근하지 않고 새 기능을 추가하거나 확장해서 사용 가능
- structure, class, enum, protocol 타입에 새 기능을 추가할 수 있다
- 기존에 존재하는 기능을 재정의할 수는 없다
extension 확장할 타입 이름 {
//타입에 추가될 새로운 기능 구현
}
extension 확장할 타입 이름: 프로토콜1, 프로토콜2, 프로토콜3 {
//프로토콜 요구사항 구현
}
Extension으로 구현 가능한 것
- 새로운 계산된 속성(Computed Property) 추가
- 새로운 인스턴스/타입 메서드 추가
- 새로운 초기화(Initializer) 추가
- 프로토콜 채택(Protocol Conformance)
- 서브스크립트 추가(Subscripting)
- 중첩 타입(Nested Type) 추가
Extension으로 구현 불가능한 것
- 저장 프로퍼티(Stored Property) 추가
- 기존 기능의 재정의(Override)
- 초기화 메서드(Initializer)의 재정의
- 기존 타입의 저장된 프로퍼티에 기본값 설정
'iOS > Swift' 카테고리의 다른 글
[Swift] UITableView, reloadData(), deleteData() / Swipe Delete (0) | 2023.12.14 |
---|---|
[Swift] iOS AutoLayout (0) | 2023.12.12 |
[Swift] 예외처리(Error, throw, throw, do-catch, try) (0) | 2023.12.07 |
[Swift] 고차함수(3/3) filter(_:) (0) | 2023.11.23 |
[Swift] 고차함수(2/3) reduce(_:_:) (0) | 2023.11.23 |