[Swift] 15. 익스텐션

Hoojeong Kim·2022년 3월 10일
0

Swift Base

목록 보기
17/22
post-thumbnail

익스텐션(Extension)

익스텐션은 스위프트의 강력한 기능 중 하나로 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있다. 기능을 추가하려는 타입을 구현한 소스 코드를 알지 못하거나 볼 수 없다고 해도, 타입만 안다면 그 타입의 기능을 확장할 수 있다.

익스텐션이 타입에 추가할 수 있는 기능은 다음과 같다.

  • 연산 타입/인스턴스 프로퍼티
  • 타입/인스턴스 메서드
  • 이니셜라이저
  • 서브스크립트
  • 중첩 타입
  • 특정 프로토콜을 준수할 수 있도록 기능 추가

익스텐션은 타입에 새로운 기능을 추가할 수는 있지만, 기존에 존재하는 기능을 재정의할 수는 없다.

상속 vs 익스텐션

클래스의 상속과 익스텐션을 비교해보자. 이 둘은 비슷해보이지만 실제로는 많이 다르다. 클래스의 상속은 클래스 타입에서만 가능하지만 익스텐션은 클래스를 포함해 구조체, 프로토콜 등에 적용할 수 있다. 이 밖의 다른 점들은 아래의 표를 참고하자.

상속익스텐션
확장수직확장수평확장
사용클래스 타입에서만 사용클래스, 구조체, 프로토콜, 제네릭 등 모든 타입에서 사용
재정의재정의 가능재정의 불가

익스텐션 정의

익스텐션은 extension 키워드를 사용해 정의한다.

extension 확장할 타입 이름 {
	기능 구현
}

익스텐션은 기존에 존재하는 타입이 추가로 다른 프로토콜을 채택할 수 있도록 확장할 수도 있다. 이런 경우에는 구조체나 클래스에서 사용하던 것과 동일하게 나타낸다.
extension 확장할 타입 이름: 프로토콜1, 프로토콜2 {
	기능 구현
}

연산 프로퍼티 추가

익스텐션을 통해서 타입에 연산 프로퍼티를 추가할 수 있다.


다음 코드는 익스텐션을 통해 Int형 연산이 짝수인지 홀수인지를 판별하여 Bool 타입으로 알려주는 연산 프로퍼티를 추가한다.
extension Int {
	var isEven: Bool {
    	return self % 2 == 0
    }
    
    var isOdd: Bool {
    	return self % 2 != 0
    }
}

추가한 연산 프로퍼티를 사용해보자.
var number = 1

print(number.isEven)
print(number.isOdd)
false
true

변수 number이 홀수이므로 각각 false와 true가 출력되었다.

참고로 익스텐션으로 연산 프로퍼티를 추가할 수는 있지만, 저장 프로퍼티는 추가할 수 없다. 또, 타입에 정의되어 있는 기존의 프로퍼티에 프로퍼티 옵저버를 추가할 수도 없다.

메서드 추가

익스텐션을 통해서 타입에 메서드를 추가할 수 있다.


다음 코드는 익스텐션을 통해 문자열은 정수로 바꿔주는 메서드를 추가한다.
extension String {
	func convertToInt() -> Int? {
    	return Int(self)
    }
}

추가한 메서드를 사용해보자.
var string = "0"

print(string.convertToInt())
0

변수 string이 문자에서 정수로 바뀐 것을 알 수 있다.

이 밖에도 서브스크립트나 이니셜라이저의 기능을 확장할 수 있다.

profile
나 애기 개발자 👶🏻

0개의 댓글