프로토콜, POP와 OOP, Delegate(retain), NotificationCenter
TIL
🌱 난 오늘 무엇을 공부했을까?
📌 프로토콜이란 무엇인가
- 특정 작업이나 기능에 적합한 메서드, 속성 및 기타 요구 사항을 간단하게 정리할 수 있는 타입
- 실제로 타입이나 메서드를 정의하지는 않고, 프로토콜을 채택하는 타입이 지켜야할 규칙을 가지고 있다.
- 상속이 불가능한 구조체 같은 경우 프로토콜을 통해 다형성을 주입할 수 있다.
- 상속은 여러개가 불가능 하지만, 프로토콜은 여러개 채택할 수 있다.
- 프로토콜에서는 프로퍼티가 저장프로퍼티인지 연산프로퍼티인지 명시하지 않고, 이름과 타입 그리고 gettable, settable한지 명시하고, var로 선언해야 한다.
- Extension을 사용해서 기본 구현을 할 수 있다.
- 기본 구현을 하면 프로토콜을 채택해도 메서드를 구현하지 않아도 사용할 수 있다.
📌 POP와 OOP의 차이점
- POP와 OOP의 가장 큰 차이점은 상속과 프로토콜이다.
- 구조체, 클래스, 열거형 등 구조화된 타입 중에 상속은 클래스 타입에서만 가능
- 기능의 모듈화가 더욱 명확해진다.
- 클래스는 다중상속이 불가능하기 때문에 여러가지 기능을 사용하기 위해서 다시 구현해줘야 했지만, 프로토콜은 다중채택이 가능하다.
📌 Delegate란 무엇인가, retain이 되는지 안되는지 그 이유
- 대리자 패턴이라는 개념으로 특정 객체가 내부에서 메서드를 호출할 때, 그 메서드의 실제 동작은 대리자 객체에서 실행되는 패턴.
- 위임된 책임을 캡슐화하는 프로토콜로 구현하고 대리자는 그 프로토콜을 채택하는 방법으로 위임해야 하는 행동을 전달한다.
- 대리자 객체와 요청하는 객체가 서로를 참조하기 때문에 Retain이 일어난다고 볼 수 있습니다.
📍 retain 해결방법
🔗 weak
- weak은 말 그대로 약한 참조이며, A와 B가 서로를 참조 할 때 A 인스턴스의 수명이 더 짧아 먼저 할당해제할 수 있을 때 B가 A를 weak 로 선언한다.
- 참조하는 인스턴스가 메모리에서 해제되면 자동으로 weak 참조한 인스턴스에 nil을 할당한다.
런타임에 값이 nil로 변경될 수 있기 때문에 weak 참조 인스턴스는 항상 Optional과 var로 선언해야 한다.
🔗 unowned
- 다른 인스턴스의 수명과 동일하거나, unowned로 선언된 프로퍼티의 수명이 더 긴 경우에만 사용
- let으로도 선언 가능
📌 NotificationCenter 동작 방식과 활용 방안
- NotificationCenter 싱글톤 객체를 통해 각 객체들이 알림을 보내고 받는 방식으로 알림을 보내는 객체와 받는 객체들은 서로에 대해 모르는 상태.
- 활용 방안은 특정 데이터를 다중으로 전달해야 하는 상황에서 사용할 수 있을것 같다.
- 하지만, 데이터의 전달을 어디로 보내고 어디서 받는지 직접 코드를 통해 확인해야 하기 때문에 컴파일시 추적이 어려움이 있을 수 있다.
- Delegate Pattern이 지정된 객체와만 상호작용할 수 있는 반면 NotificationCenter는 어플리케이션 어느 곳에서, 어느 객체와도 상호작용을 할 수있다.