TIL

[Sesac IOS] 19일차 TIL

19일차 수업을 듣고 새롭게 알게된 내용을 정리한 글입니다.


Learned

  • 프로토콜(Protocol)과 델리게이트(Delegate) 패턴
    • 델리게이트란 "위임하다" 라는 뜻으로,  한 객체에서 처리해야할 작업(이벤트 처리, 데이터 표시 등)을 다른 객체에게 위임해서 효율적으로 처리하는 디자인 패턴
    • 대리자로 지정된 객체는 작업이 생길때마다 내부의 콜백 메서드를 호출해서 작업을 처리한다.
    • 프로토콜은 이 델리게이트 패턴을 구현하는데 이용된다.
    • 그 예로 UITableView는 대리자를 지정해서 화면에 데이터를 표시하고 특정 동작을 처리해야하는데,
      이때 UITableViewDelegateUITableViewDataSource 프로토콜이 이용된다.
    • 프로토콜은 "규약"이라는 뜻으로, 구조체, 클래스, 열거형, 익스텐션에 사용할 수 있고
      내부에 특정 메서드와 프로퍼티 구현을 강제해서 일관된 구조를 유지하고 이해하는데 도움을 준다.
    • 프로토콜 내부에는 구현해야할 멤버들이 선언된 형태로 명세돼있고
      이 프로토콜을 준수(conform)하는 타입에서 멤버의 구체적인 코드를 작성한다.
콜백(callback)이란?
비동기적으로 수행되는 작업이 끝날때 클로저 안에서 호출되는 함수

 

  • 프로토콜과 상속의 차이점
    • 상속은 1개 클래스만 가능하지만 프로토콜은 개수 제한이 없다.
    • 상속은 부모 클래스의 모든 프로퍼티와 메서드를 책임지지만 프로토콜은 특정 기능을 위한 일부만을 책임진다.
    • 프로토콜은 자신을 conform하는 타입에게 특정 메서드와 프로퍼티 구현을 요청하며 이를 반드시 구현해야 한다.
  • 프로토콜 메서드 : 메서드의 이름, 매개변수 이름, 리턴 타입을 명시할 수 있고 매개변수 기본값은 사용 불가
  • 프로토콜 프로퍼티
    • 프로퍼티의 이름과 읽기∙쓰기 가능(gettable, settable) 여부를 명시한다.
    • 명시된 조건만 충족하면 저장 또는 연산 프로퍼티로 구현할 수 있다.
      따라서 프로토콜 프로퍼티는 항상 var로 명시돼야 한다.
프로토콜 프로퍼티에 명시한 get, set은 최소 조건이기 때문에 프로토콜 get만 명시(읽기 전용)됐더라도 실제 구현에서 필요에 따라 읽기와 쓰기가 모두 가능한 프로퍼티로 구현할 수 있다.

 

  • 옵셔널 프로토콜
    • 프로토콜을 따르는 타입에서 특정 프로토콜 멤버를 선택적으로 구현할 수 있게 하는 기능
    • 프로토콜에서 optional 키워드를 사용해 선택적 요청(Optional Requirement)을 할 수 있다.
@objc
protocol MediaPlayer {
    
    static var identifier: String { get }
    
    var media: Media { get set }
    
    func play()
    
    func stop()
    
    @objc optional func capture(frame: Int) -> UIImage
    
}
선택적 요청은 Object-C를 참조하기 때문에 프로토콜과 요청하는 멤버 앞에 @objc 키워드를 붙인다.
또한 Object-C에는 클래스밖에 없기 때문에 이 프로토콜은 클래스 타입에서만 conform할 수 있다.

 

  • 상위 클래스에서 상속받은 프로퍼티를 하위 클래스에서 모두 사용할 수 있는 것은 아니다.
    그 예시로 UIResponder의 inputView와 UIView의 contentMode가 있다.
UIResponder의 inputView 프로퍼티는 주로 UITextField와 UITextView에서 사용되고,
UIView의 contentMode는 이미지를 다루는 뷰에서 사용된다.

 

 

Learning

  • NS는 Nextstep(스티브 잡스가 설립한 회사에서 개발한 운영체제)의 약자
  • Hashable 프로토콜 공부하고 정리하기

이상입니다.

'TIL' 카테고리의 다른 글

[Sesac IOS] 21일차 TIL  (0) 2022.08.01
[Sesac IOS] 20일차 TIL  (0) 2022.07.29
[Sesac IOS] 18일차 TIL  (0) 2022.07.27
[Sesac IOS] 17일차 TIL  (0) 2022.07.26
[Sesac IOS] 15일차 TIL  (0) 2022.07.22