[Swift] Extension


Extension


확장

상속과 확장의 비교

  • 상속 : 수직적 개념
    • 성격이 비슷한 타입을 새로 만들어, 데이터를 추가하고, 메서드를 변형시켜 사용하려는 것
  • 확장 : 수평적 개념
    • 현재 존재하는 타입에 메서드를 추가하여 사용하려는 것

확장 가능한 타입

  • 클래스, 구조체, 열거형, 프로토콜 타입에 확장이 가능
  • 새 메서드를 추가할 수 있지만 기존 메서드를 재정의 할 수는 없음
    (원칙적으로는 재정의가 불가능하나 방법이 있긴 함)
class Person {
    var name = "이름"
    
    func walk() {
        print("사람이 걷는다.")
    }
}

class Student: Person {
    var studentId = 1
    
    override func walk() {
        print("학생이 걷는다.")
    }
    
    func study() {
        print("학생이 공부한다.")
    }
}

extension Student {  // 스위프트에서는 원칙적으로 확장에서 구현한 메서드에 대한 재정의가 불가
    func play() {  // @objc func play()를 하면 아래에서 재정의 가능
        print("학생이 논다.")
    }
}

class Undergraduate: Student {
    var major = "전공"
    
    override func walk() {
        print("대학생이 걷는다.")
    }
    
    override func study() {
        print("대학생이 공부한다.")
    }
    
    func party() {
        print("대학생이 파티한다.")
    }

// 스위프트에서는 원칙적으로 확장에서 구현한 메서드에 대한 재정의가 불가
// 위에서 @objc 키워드를 붙여줬을 경우 재정의 가능
//    override func play() {
//        print("대학생이 논다.")  
//    }
}

기존 유형에 새 메서드를 추가하기 위해 확장을 정의하면 확장이 정의되기 전에 생성된 경우에도 기존 인스턴스에서 새 기능을 사용 가능

class SomeType {
    // SomeType ...
}

// 확장이 정의되기 전에 인스턴스 생성
var a = SomeType()
a.doSomething()  // Hello, Extension! 정상적으로 출력

extension SomeType {
    func doSomething() {
        print("Hello, Extension!")
    }
    
}

확장의 장점

  • 원본 소스 코드에 대한 엑세스 권한이 없는 유형을 확장하는 기능이 포함
    (Int, String, Double 등 애플이 미리 만들어 놓은 타입에 확장도 가능)
extension Int {
    var squared: Int {
        return self * self
    }
}

5.squared  // 25

확장 가능 멤버의 종류

클래스, 구조체(열거형)의 확장 가능 멤버

  • 확장에서는 저장 속성은 정의할 수 없고 메서드 형태만 정의 가능
    • (타입) 계산 속성, (인스턴스) 계산 속성
    • (타입) 메서드, (인스턴스) 메서드
      • 구조체(열거형)에서 자신의 속성을 변경하는 메서드는 mutating 키워드 필요
    • 새로운 생성자
      • 클래스의 경우 편의 생성자만 추가 가능
      • 지정 생성자 및 소멸자는 반드시 본체에서 구현
        (지정 생성자는 본체에서 인스턴스를 찍어내는 중요 역할을 하므로 구현 불가)
    • 서브 스크립트
    • 새로운 중첩 타입 정의 및 사용
    • 프로토콜 채택 및 프로토콜 관련 메서드

생성자의 확장

  • 클래스
    • 편의 생성자만 구현 가능
      (본체의 지정 생성자를 호출하는 방법으로만 구현 가능)
    • 지정생성자, 소멸자 추가 불가 (항상 본래의 클래스에서 정의해야 함)
  • 구조체(열거형)
    • 자유롭게 생성자 구현 가능 (상속이 없기 때문)
      • 본체에서 모든 저장속성에 기본값과 생성자를 구현하지 않은 경우, 본체에서 컴파일러가 기본 생성자와 멤버와이즈 생성자를 제공
      • 직접 생성자 구현 시 확장에서의 생성자 구현이 제공되지 않는 것이 원칙이지만 기본 생성자와 멤버와이즈 생성자도 계속 제공되고, 확장에서 호출도 가능

다양한 멤버의 확장

  • 서브 스크립트도 메서드의 일종이기 때문에 확장이 가능
  • 새로운 중첩타입도 확장이 가능
  • 프로토콜 채택 및 프로토콜 관련 메서드도 확장이 가능

참고

Ellen Swift Class






© 2021. by hminkim