클래스 기반 모델의 문제점
클래스 기반 모델은 보통 protocol(interface)를 확장하는 방식으로 함수를 만들어낸다. 하지만, 문제는 하나의 클래스는 하나의 protocol만을 확장하지 않는 경우가 많다는 것이다. 특히 iOS의 ViewController의 경우는 여러 기능이 들어가야 하기 때문에 여러 protocol을 상속받는다. 하지만 여러 프로토콜을 상속받게되면 하나의 클래스에 여러 함수를 구현해야 되기 때문에 클래스가 복잡해진다.
예를 들어 사람 클래스에 커피샵 직원 프로토콜과 Programming을 위한 프로토콜을 상속한다고 해보자. 그러면 다음과 같이 Person class가 매우 커진다.
class Person : CoffeeShopEmployee, Programming{
func makeCoffee() { }
func cleanShop() { }
func getOrder() { }
func callCustomer() { }
func writeCode() { }
func reIndentCode() { }
func renameVariable() { }
}
protocol CoffeeShopEmployee {
func makeCoffee()
func cleanShop()
func getOrder()
func callCustomer()
}
protocol Programming {
func writeCode()
func reIndentCode()
func renameVariable()
}
하지만, CoffeeShopEmployee와 Programming은 완전히 다른 프로토콜로 이 둘을 분리할 수 있다면 코드가 매우 깔끔해질 것이다. Swift에서는 이를 분리하기 위해 extension이라는 키워드를 제공한다.
extension을 이용해 타입 기능 확장하기
extension을 사용하면 타입의 기능을 분리 및 확장할 수 있다. 예를 들어 Person 타입에 대한 기능을 확장하고 싶은 경우 다음과 같이 Person 앞에 extension을 사용하면 된다. 그러면 CoffeeshopEmployee 프로토콜을 사용한 Person clas와 Programming을 사용한 코드를 분리할 수 있다.
class Person : CoffeeShopEmployee{
func makeCoffee() { }
func cleanShop() { }
func getOrder() { }
func callCustomer() { }
}
extension Person : Programming {
func writeCode() { }
func reIndentCode() { }
func renameVariable() { }
}
위의 코드를 더 깔끔히 분리하면 다음과 같이 분리할 수 있다.
class Person {}
extension Person : Programming {
func writeCode() {}
func reIndentCode() { }
func renameVariable() { }
}
extension Person : CoffeeShopEmployee{
func makeCoffee() { }
func cleanShop() { }
func getOrder() { }
func callCustomer() { }
}
다만 주의할 점은 이 기능은 확장일 뿐이어서 실제로는 모든 함수는 물론 변수 또한 공유된다는 점이다. 즉 다음과 같이 서로의 코드 또한 호출이 가능하다.
class Person {}
extension Person : Programming {
func writeCode() {
makeCoffee()
}
func reIndentCode() { }
func renameVariable() { }
}
extension Person : CoffeeShopEmployee{
func makeCoffee() {
reIndentCode()
}
func cleanShop() { }
func getOrder() { }
func callCustomer() { }
}
'IOS > Swift' 카테고리의 다른 글
[Swift] TableView 이용해 화면에 목록 표시하기 (0) | 2021.12.28 |
---|---|
[Swift] 위치 권한 요청 방법 및 요청 문구 변경 방법 알아보기 (0) | 2021.12.26 |
[Swift] Background Thread에서 Task 실행하기 (1) | 2021.12.26 |
[Swift] internal parameter name과 external parameter name (0) | 2021.12.25 |
[Swift] JSONDecoder 사용하여 JSON 데이터 파싱하기 (0) | 2021.12.25 |