티스토리 뷰

Swift

[Swift] 익스텐션

Hani_Levenshtein 2021. 1. 17. 00:35

OOP에서 상속은 객체들 간의 관계를 만들어주는 편리한 방법이지만 클래스가 아닌 타입에서는 불가능합니다.

스위프트에서는 클래스 뿐아니라 다른 타입에서도 새로운 기능을 추가해줄 수 있는 익스텐션이라는 장치를 제공합니다.


Extension

익스텐션은 기존 클래스, 구조, 열거형을 포함한 모든 타입에 새로운 기능을 추가할 수 있도록 만들어 줍니다.

연산 프로퍼티, 메서드, 이니셜라이저, 서브스크립트, 중첩 데이터 타입 등을 추가할 수 있습니다. 

안에 있는 내용을 알고 있지 않아도 해당 타입이 무엇인지만 알고있다면 기능을 확장할 수 있습니다.

마치 클래스의 상속과 비슷해보이나, 익스텐션에서는 추가는 가능해도 재정의는 불가능하다는 차이가 존재합니다.

 

특히 외부 라이브러리나 프레임워크처럼 소스를 수정할 수 없는 타입에 기능을 추가할 때 익스텐션을 사용합니다.

 

익스텐션은 프로토콜과 같이 자주 사용되어 객체 지향 프로그래밍을 너머 프로토콜 지향 프로그래밍(Protocol-Oriented Programming, POP)으로 개념을 확장시켜줍니다.


익스텐션 구현

struct volume{ 
    var x:Int?
    var y:Int?
    var z:Int?
    init(X=Int, Y=Int, Z=Int){ // 지정 이니셜라이저
    	x=X
        y=Y
        z=Z
    }
}

extension volume{ // volume이라는 이름을 가진 타입의 기능을 확장
    var isEven: Bool { return self.x % 2 == 0 } // 연산 인스턴스 프로퍼티
    static var isOdd: Bool { return self.x % 2 == 1 } //연산 타입 프로퍼티
    
    func square: Int { return self.x*self.y } // 인스턴스 메서드
    static func cube: Int { return self.x*self.y*self.z } // 타입 메서드
    
    init(X=Int, Y=Int){ // 편의 이니셜라이저
    	x=X
        y=Y
    }
}


익스텐션을 통해 기존에 구현하지 않았던 기능들을 추가할 수 있습니다.

 

extension B: ProtocolX, ProtocolY, ProtocolZ {
    /* 프로토콜 요구사항 구현 */
}

익스텐션은 기존에 존재하는 타입이 추가적으로 다른 프로토콜을 채택할 수 있도록 확장할 수도 있습니다.

이 밖에도 서브스크립트, 중첩 타입 등을 추가할 수 있지만 저장 프로퍼티나 프로퍼티 감시자는 추가할 수 없습니다.

'Swift' 카테고리의 다른 글

[스위프트] guard let / if let  (0) 2021.03.21
[Swift] Color Literal / Custom Color  (0) 2021.03.15
[Swift] 인스턴스  (0) 2021.01.16
[Swift] 프로퍼티의 종류  (0) 2021.01.13
[Swift] 메서드  (0) 2021.01.13
댓글