study record

[Swift] 익스텐션 본문

Swift/스위프트 프로그래밍

[Swift] 익스텐션

asong 2022. 1. 12. 10:19

*이 글은 책 “스위프트 프로그래밍”을 학습하고 작성한 글입니다.

 

익스텐션이란

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

스위프트의 익스텐션이 타입에 추가할 수 있는 기능

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

익스텐션은 타입에 새로운 기능을 추가할 수는 있지만 기존에 존재하는 기능을 재정의할 수는 없다. 클래스의 상속은 클래스 타입에서만 가능하지만 익스텐션은 구조체, 클래스, 프로토콜 등에 적용이 가능하다. 또한 클래스의 상속은 특정 타입을 물려받아 하나의 새로운 타입을 정의하고 추가 기능을 구현하는 수직 확장이지만 익스텐션은 기존의 타입에 기능을 추가하는 수평 확장이다. 상속을 받으면 기존 기능을 재정의할 수 있지만 익스텐션은 재정의할 수 없다.

익스텐션을 사용하는 대신 원래 타입을 정의한 소스에 기능을 추가하는 방법도 있겠지만, 외부 라이브러리나 프레임워크를 가져다 사용했다면 원본 소스를 수정하지 못 한다. 이처럼 외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 때 익스텐션을 사용한다.

 

익스텐션 문법

익스텐션은 extension 이라는 키워드를 사용하여 선언한다.

extension 확장할 타입 이름 {
	// 타입에 추가될 새로운 기능 구현
}

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

extension 확장할 타입 이름: 프로토콜1, 프로토콜2 {
	//프로토콜 요구사항 구현
}

 

익스텐션으로 추가할 수 있는 기능

연산 프로퍼티

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

extension Int {
	var isEven: Bool {
		return self % 2 ==0
	}

	var isOdd: Bool {
		return self % 2 == 1
	}
}

 

익스텐션으로 Int 타입에 두 개의 연산 프로퍼티를 추가했다.

익스텐션으로 연산 프로퍼티를 추가할 수는 있지만 저장 프로퍼티는 추가할 수 없다.

 

메서드

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

관련 기능별로 하나의 익스텐션 블록에 묶어주는 것도 좋다.

 

이니셜라이저

인스턴스를 초기화할 때 인스턴스 초기화에 필요한 다양한 데이터를 전달받을 수 있도록 여러 종류의 이니셜라이저를 만들 수 있다. 타입의 정의 부분에 이니셜라이저를 추가하지 않더라도 익스텐션을 통해 이니셜라이저를 추가할 수 있다.

익스텐션으로 클래스 타입에 편의 이니셜라이저는 추가할 수 있지만 지정 이니셜라이저는 추가할 수 없다. 지정 이니셜라이저와 디이니셜라이저는 반드시 클래스 타입의 구현부에 위치해야 한다. 값 타입은 상관 없다.

extension String {
	init(intTypeNumber: Int) {
		self = "\(intTypeNumber)"
	}
}

 

익스텐션으로 값 타입에 이니셜라이저를 추가했을 때, 해당 값 타입이 다음의 조건들을 모두 성립한다면 익스텐션으로 사용자 정의 이니셜라이저를 추가한 이후에도 해당 타입의 기본 이니셜라이저와 멤버와이즈 이니셜라이저를 호출할 수 있다.

  • 모든 저장 프로퍼티에 기본값이 있다.
  • 타입에 기본 이니셜라이저와 멤버와이즈 이니셜라이저 외에 추가 사용자 정의 이니셜라이저가 없다.

서브스크립트

익스텐션을 통해 타입에 서브스크립트를 추가할 수 있다.

extension String {
	subscript(appendBalue: String) -> String {
		return self + apendValue
	}
}

중첩 데이터 타입

익스텐션을 통해 타입에 중첩 데이터 타입을 추가할 수 있다.

extension Int {
	enum Kind {
		case negative, zero, positive
	}
	
	var kind: Kind {
		switch self {
			case 0:
				return .zero
			case let x where x > 0
				return .positive
			default:
				return .negative
			}
	}
}

익스텐션을 통해 Int 타입에 Kind 열거형 타입과 연산 프로퍼티를 추가했다.

'Swift > 스위프트 프로그래밍' 카테고리의 다른 글

[Swift] 프로토콜 지향 프로그래밍  (0) 2022.01.18
[Swift] 제네릭  (0) 2022.01.14
[Swift] 프로토콜  (0) 2022.01.11
[Swift] 타입 캐스팅  (0) 2022.01.06
[Swift] 상속  (0) 2021.12.27