프로토콜은 준수해준 곳, 채택해준 곳에서 실질적으로 구현한다.
선택적인 구현이 가능하다.
채택 개수에 제한이 없다.
어떤 프로토콜을 채택했냐에 따라 코드가 그려진다.
- 프로토콜 내에서 옵셔널 요소는?
@objc optional : 선택적 요청, Optional Requirement이라고 부른다.
프로토콜을 채택할 건데 안쓸 수 있는 아이들이 있기 때문에 optional 키워드를 붙이는 것이다.
옵셔널 요소를 포함하고 있다면 프로토콜 자체도 @objc(오브젝트 코드)를 붙여줘야 한다.
@objc
protocol ViewPresentableProtocol {
func configureView()
@objc optional func configureLabel()
@objc optional func configureTextField()
}
- 궁금했던 포인트인데, NSObjectProtocol.. NS -> NextStep의 약자인데 접두어이다. 오브젝트 - C에서 사용하고 있던 것이다.
- 프로토콜에서는 프로퍼티를 어떻게 써줄 수 있을까?
프로토콜 프로퍼티, 프로토콜 메서드
프로퍼티를 작성할 경우에도 실질적으로 선언하지는 않는다.
그렇지만 어떤 타입인지는 명시해줘야 한다. 그래야 오류가 해결된다.
그리고 어떤 종류의 프로퍼티인지 명시해야 한다. - 읽기 전용인지, 쓰기도 가능한지
프로토콜 프로퍼티 : 역할에 대한 것을 지정해줄 수 있다.
연산 프로퍼티로 쓰든, 저장 프로퍼티로 쓰든 신경쓰지 않는다.
프로토콜에서는 해당 프로퍼티를 실제 구현부에서 didSet으로 어떻게 변경 직후에 값을 변경해주든 뭘해주든 신경을 아예 안쓰겠다는 것이다. 뭘하든 아무 상관하지 않겠다!
그렇지만, var로 선언해야 한다.
왜냐하면 구현부에서 실질적으로 초기화해야 하기 때문이다.
let은 선언 시에 초기화를 해서 메모리에 올라간 상태이니까;
- 여기 보면 backgroundColor가 get만 할 수 있게 했는데 실제 구현부에서는 색상을 바꿀 수 있다 -> set이 된다 왤까?
만약 프로퍼티에 get을 명시했다면, get 기능만 최소한 구현되어 있으면 된다.!
그러니까 get 기능이 최소한으로 구현되고 추가적으로 필요하다면 set도 구현해도 괜찮다는 것이다!
- get으로 썼을 때만 가능한 것은 구현부에서 var가 아닌 let으로 써줄 수 있다는 점이다.
get set은 무조건 값 변경이 가능해야 하기 때문이다!!
그래서 아래처럼 get set 프로토콜 프로퍼티를 실제 구현부에서 let으로 변경하면 오류가 뜬다.
- 클래스와 다른 점은 단일 상속이 아니라는 점! 채택이 여러개 가능하다는 점!
- 프로토콜을 여러개 채택하면 성능적으로 문제가 없을까?
이에 대한 답인지는 잘 모르겠음.
스위프트는 우선 객체지향 언어이자 프로토콜 지향 언어고, 구조체가 중요한 언어라고 한다.
스위프트의 대부분 기본 타입은 구조체로 구현되어 있다.
클래스는 상속을 통해 구현되지만, 구조체는 상속이 불가능해 프로토콜을 채택해 요구사항들을 구현할 수 있다.
근데 그러면 구조체 내에서 무조건 프로토콜의 프로퍼티와 메소드를 전부 구현해야 하는데 이게 점점 방대해질 수 있다.
그래서 extension이 존재한다.
extension을 통해 초기 기능을 정의하면 해당 기능을 구조체 내에서 정의하지 않아도 오류가 발생하지 않고,
초기 기능과 다른 기능을 원할 때에는 구조체 내에서 기능을 재정의 해주면 된다.
-
-
참조 타입은 값타입과 다르게 값이 복사되는 게 아니라 그 값의 메모리를 참조해서
인스턴스를 통해 값을 주면 해당 참조된 원래의 값도 변한다.
그리고 구조체는 매번 새로운 변수로 값을 복사해서 멀티 스레드 환경에서 문제 소지가 적고,
클래스는 참조 타입이어서 인스턴스를 상수로 선언해도 내부 프로퍼티의 값을 변경할 수 있다.
- CaseIterable Protocol
열거형의 값들을 배열 컬렉션과 같이 순회할 수 있도록 기능이 있는 프로토콜이다.
- Hashable Protocol
Dictionary<Key, Value>는 중복해서 쓸 수 없다.
이게 어떻게 가능하냐면 Hashable이라는 고유한 값을 갖게 해주는 프로토콜 때문이다.
Array라는 구조체이기 때문에 상속이 안돼서 엄청 많은 프로토콜을 채택하고 있고
그 중 하나가 Collection이다.
Collection이 무엇이냐면 프로토콜의 종류 중 하나인데
집단 자료형에서 튜플을 제외하고 array, set, dictionary는 Collection을 채택하고 있어서 우리는
그것을 컬렉션 타입이라고 한다.
그리고 이 세가지는 Sequence라는 순회가 가능한 프로토콜을 채택하고 있어서 집단 자료형에서 순회하는 기능을 사용할 수 있는 것이다.
'⭐️ 개발 > iOS & Swift' 카테고리의 다른 글
[iOS] DataSource, Delegate | TextView Placeholder | WebKit (0) | 2022.07.29 |
---|---|
[iOS] PickerView (0) | 2022.07.28 |
[iOS] '처음으로' 돌아가는 코드 | SceneDelegate에서 분기처리해주는 코드 (0) | 2022.07.27 |
[Swift] Property Observer - didSet / willSet (0) | 2022.07.27 |
[Swift] 타입/인스턴스 - 저장/연산 프로퍼티 (0) | 2022.07.27 |