[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
키워드 필요
- 구조체(열거형)에서 자신의 속성을 변경하는 메서드는
- 새로운 생성자
- 클래스의 경우 편의 생성자만 추가 가능
- 지정 생성자 및 소멸자는 반드시 본체에서 구현
(지정 생성자는 본체에서 인스턴스를 찍어내는 중요 역할을 하므로 구현 불가)
- 서브 스크립트
- 새로운 중첩 타입 정의 및 사용
- 프로토콜 채택 및 프로토콜 관련 메서드
생성자의 확장
- 클래스
- 편의 생성자만 구현 가능
(본체의 지정 생성자를 호출하는 방법으로만 구현 가능) - 지정생성자, 소멸자 추가 불가 (항상 본래의 클래스에서 정의해야 함)
- 편의 생성자만 구현 가능
- 구조체(열거형)
- 자유롭게 생성자 구현 가능 (상속이 없기 때문)
- 본체에서 모든 저장속성에 기본값과 생성자를 구현하지 않은 경우, 본체에서 컴파일러가 기본 생성자와 멤버와이즈 생성자를 제공
- 직접 생성자 구현 시 확장에서의 생성자 구현이 제공되지 않는 것이 원칙이지만 기본 생성자와 멤버와이즈 생성자도 계속 제공되고, 확장에서 호출도 가능
- 자유롭게 생성자 구현 가능 (상속이 없기 때문)
다양한 멤버의 확장
- 서브 스크립트도 메서드의 일종이기 때문에 확장이 가능
- 새로운 중첩타입도 확장이 가능
- 프로토콜 채택 및 프로토콜 관련 메서드도 확장이 가능