[Swift] 확장 (Extensions)
Extensions 는 이미 선언된 클래스, 구조체, 열거형 혹은 프로토콜 타입에 새로운 기능을 추가할 수 있다는 것을 의미합니다. Extensions 를 이용하면 다음과 같은 일을 수행할 수 있습니다.
- Computed Property 추가
- 메소드 정의
- 새로운 initializer
- Subscript 정의
- Nested Type 정의
- 기존 타입이 Protocol 을 채택하도록 함
Extension 구문
extensions
키워드를 이용하여 선언할 수 있습니다.
Extension 은 하나 이상의 Protocol 을 채택하여 기존 타입을 확장할 수 있습니다.
연산 프로퍼티 (Computed Properties)
확장을 이용하여 기존 타입에 연산 프로퍼티를 추가할 수 있습니다.
위 코드는 Double
타입에 특정 단위로 길이를 변환해주는 연산 프로퍼티를 5개 추가합니다.
여기서 Double
의 self
값은 미터단위로 표현됩니다. 그렇기 때문에 각각의 연산 프로퍼티에 알맞은 값을 곱하고 나눠주어 나타내고자 하는 단위를 표현하고 있습니다.
여기서 나타낸 연산 프로퍼티들은 read-only 이기 때문에 get
키워드 없이 표현됩니다. 리턴값은 Double
타입의 값입니다.
생성자 (Initializers)
확장을 이용해 기존 타입에 새로운 생성자 구문을 추가할 수 있습니다. 이를 통해 타입을 확장하여 커스텀 타입을 생성자의 파라미터로 받거나 원래 없던 생성자를 제공할 수 있습니다.
Class 에도 새로운 Convenience 생성자 구문을 추가할 수 있지만, 새로운 Designated 생성자나 소멸자는 추가할 수 없습니다. 이러한 생성자나 소멸자는 항상 기존 Class 에서 구현되어야 합니다.
만약 모든 저장 프로퍼티에 기본값을 할당하고 생성자가 정의되어있지 않은 value 타입에 생성자를 추가한다면, 확장된 타입의 생성자에서 default 생성자와 memberwise 생성자를 호출할 수 있게 됩니다.
또한 다른 모듈에서 선언된 구조체에 생성자를 추가하기 위해 Extension 을 사용한다면 새로운 생성자는 정의한 모듈에서 생성자를 호출하기 전까지 self
에 접근할 수 없습니다.
Rect
구조체는 모든 프로퍼티에 대해 기본값을 할당하고, 자동으로 기본 생성자와 멤버별 생성자를 받습니다. 그러므로 이 생성자는 새로운 Rect
인스턴스를 생성하기 위해 사용될 수 있습니다.
중심점과 크기를 가지는 생성자를 만들기 위해 Rect
구조체를 확장할 수 있습니다.
새로운 생정자는 제공된 center
좌표와 size
를 기반으로 원점을 계산합니다. 생성자는 적절한 프로퍼티에 새로운 원점과 크기값을 저장하는 구조체의 자동 멤버별 생성자 init(origin:size:)
를 호출합니다.
메소드
기본 타입을 확장하여 인스턴스 메소드와 타입 메소드를 추가할 수 있습니다.
Int
타입을 확장하여 repetitions
라는 새로운 인스턴스 메소드를 추가했습니다. 특정 작업을 여러번 수행하기 위해 정수를 이용해 repetitions
메소드를 호출할 수 있습니다.
인스턴스 메소드 변경
확장으로 인해 추가된 인스턴스 메소드는 인스턴스 자체로 수정 또는 변경이 가능합니다. self
또는 프로퍼티를 수정하는 구조체와 열거형 메소드는 기존 메소드 변경과 같이 mutating
키워드를 사용해야 합니다.
서브스크립트
확장을 이용해 기존 타입에 새로운 서브스크립트를 추가할 수 있습니다.
중첩된 타입 (Nested Types)
확장을 이용해 기존 클래스, 구조체, 열거형에 새로운 중첩 타입을 추가할 수 있습니다.
Kind
는 숫자가 음수인지, 양수인지, 혹은 0
인지 표현합니다. 위 코드에서 Kind
케이스를 리턴하는 kind
라는 새로운 연산 프로퍼티를 Int
타입에 추가합니다. 이는 모든 Int
값에서 사용이 가능합니다.
위의 printIntegerKinds
메소드는 Int
값의 배열을 받아 각 아이템에 대해 연산 프로퍼티 kind
를 따져 적절한 문자를 출력합니다.
참고 링크
https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html
https://bbiguduk.gitbook.io/swift/language-guide-1/extensions
'iOS 개발 > Swift' 카테고리의 다른 글
[Swift] 타입 캐스팅 (Type Casting) (0) | 2022.05.19 |
---|---|
[Swift] 프로토콜 (Protocols) (0) | 2022.05.13 |
[Swift] ARC (2/2) (0) | 2022.04.29 |
[Swift] ARC (1/2) (0) | 2022.04.29 |
[Swift] 클로저 (Closures) (0) | 2022.04.22 |