May 20, 2021, TIL (Today I Learned) - P.O.P

Inwoo Hwang·2021년 8월 26일
0
post-thumbnail

수업 내용


Foundation Framework의 최상위 클래스는?

NSObject

  • 타입 이름
  • 객체로써 사용할 수 있는 타입의 모음으로 정의된다.

상속의 문제

  • 상위 클래스 기능 변경시 하위 클래스에 영향을 끼칠 수 있습니다.
  • 불필요한 요소를 자식 클래스가 물려받아야 하는 상황이 생길 수 있어요.

Protocol-Oriented Programing

상속 없이 준비된 기능 block을 가져오는 것이 P.O.P의 핵심이다.

Protocol

기능의 요구 사항, 협약

Extension

기존 타입에 기능을 덧붙이는 것

프로토콜도 어떤 타입이라 생각했을 때 프로토콜에게도 기능을 덧붙일 수 있다.

protocol Camper {
  func study()
  func sleep()
}
class Person {
  
}
class Dog {
  
}

extension: Person: Camper {
  func study() {
    print("오늘 빡공합니다.")
  }
  
  func sleep() {
    print("2시간이라도 자자...")
  }
}

extension: Dog: Camper {
  func study() {
    print("월월월")
  }
  func sleep() {
    print("zzZZ...")
  }
}

이렇게 할 수도 있지만 위와 같은 방법으로 요구사항만 프로토콜에 작성할 경우 똑같은 여러 클래스에 반복적으로 작성해주어야 하는 불편함이 있다.

이런 상황을 피하기 위해 extension을 활용한 프로토콜의 기본 구현을 사용할 수 있다.

프로토콜 기본 구현 (with Extension)

protocol Camper {
  func study()
  func sleep()
}

extension: Camper {
  func study() {
    "누구든 이 기능을 사용해 공부할 수 있어"
  }
  
  func sleep() {
    "누구든 이 기능을 사용해 잘 수 있어"
  }
}
class Person: Camper {
  
}
class Dog: Dog {
  func sleep() {
    "프로토콜 기능의 잠 말고 개 특유의 잠을 청하고 싶어"
  }
}

let steven: Person = Person()
steven.sleep() // 누구든 이 기능을 사용해 잘 수 있어

let coco: Dog = Dog()
coco.sleep() // 프로토콜 기능의 잠 말고 개 특유의 잠을 청하고 싶어
						 // 메서드의 오버라이드 기능과 비슷하다.

Camper의 역할을 요구하면서도 기능 자체를 가져가는 것이 extension을 활용한 프로토콜 기본 구현의 원리이다.

extension을 통해 프로토콜에게 요구사항 그리고 더 나아가 기능까지 구현하는 것이프로토콜 기본 구현이다.

프로토콜 기본 구현(with Where)

@thanks to Neph

protocol Animal {
  
}
extension Animal {
  func eat() {
    
  }
  
  func barking() where Self: Dog {
    print("오직 강아지만 짖을 수 있어요 멍멍")
  }
  
  func programming() where Self: Programmer {
    
  }
}

// 강아지 클래스
class Dog: Animal {

}

// 사람 클래스
class Person: Animal {
  
}

let coco: Dog = Dog()
coco.bark()

let james: Person = Person()
person.bark()// 조건이 안돼요!~!!
person.eat()// 사람은 먹을 수 있어요! 밥 먹자 밥

where을 활용하여 extension에 조건을 달 수 있다.

예를들면 동물이라는 객체지만 짖는 것은 Dog 타입만 할 수 있게 설정하고 싶으면 where 절을 사용하면 됩니다.

프로토콜 기본 구현 주의사항

저장 프로퍼티는 extension에 구현할 수 없습니다.

프로퍼티 옵저버는 extension에 구현할 수 없습니다.

profile
james, the enthusiastic developer

0개의 댓글