DevCho
Developer Blog
DevCho
반응형
전체 방문자
오늘
어제
  • 분류 전체보기 (48)
    • IOS (31)
      • Xcode (7)
      • Assets (1)
      • Swift (20)
      • UI (1)
      • SwiftUI (1)
      • Build (1)
    • Flutter (4)
      • Install (4)
      • Dart (0)
    • Rust (0)
    • 유용한 사이트 소개 (1)
    • 개발자의 아이템 (1)
    • Terminal (1)
    • Mac (2)
    • Git (1)
    • 회고 (1)
    • Java (2)
      • Java 기본 사용법 (2)
      • Collections (0)
    • 개발자의 글쓰기 (0)
    • 디자인 패턴 (1)
    • JavaScript (2)
    • Kotlin (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • flutter install
  • Swift
  • MAC
  • xcode13
  • 제어문
  • flutter dart
  • func
  • nil
  • optional
  • 스위프트
  • swift random
  • dart
  • 플러터 설치
  • flutter 설치
  • IOS
  • random number
  • struct
  • Java
  • SwiftUI
  • flutter
  • CLASS
  • chocolatey
  • Terminal
  • Xcode Theme
  • dart 설치
  • chocolatey install
  • chocolatey 설치
  • Storyboard
  • xcode
  • Dark mode

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
DevCho

Developer Blog

IOS/Swift

[Swift] extension 키워드 이용해 타입 기능 확장하기

2021. 12. 26. 05:02
반응형

클래스 기반 모델의 문제점

클래스 기반 모델은 보통 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
    'IOS/Swift' 카테고리의 다른 글
    • [Swift] TableView 이용해 화면에 목록 표시하기
    • [Swift] 위치 권한 요청 방법 및 요청 문구 변경 방법 알아보기
    • [Swift] Background Thread에서 Task 실행하기
    • [Swift] internal parameter name과 external parameter name
    DevCho
    DevCho
    개발자의 개발 공간

    티스토리툴바