[야곰] Swift 개념정리 - Extensions

Judy·2022년 3월 20일
0

Swift 공부

목록 보기
9/11

Extension


1. 정의


익스텐션은 스위프트에거 강력한 기능 중 하나로 구조체, 클래스, 열거형, 프로토콜 타입에 기능을 추가할 수 있는 기능이다.

타입을 수정하지 않아도, 타입의 구현된 내용을 몰라도 타입을 알고만 있다면 타입에 기능을 확장할 수 있는 것이다.

extension 확장할 타입 이름: 프로토콜1, 프로토콜2...{
	// 추가할 기능 구현
}

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

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

2. 익스텐션 구현


1) 연산 프로퍼티 추가

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

print(1.isOdd)	//True
print(2.isEven)	//True
print(3.isEven	//False

Int의 구현 소스코드를 몰라도 프로퍼티를 추가할 수 있다.

2) 메서드 추가

extension Int {
	func multiply(by: n: Int) {
    	return self * n
    }
}

print(2.multiply(by: 3)	// 6

메서드 역시 추가 가능하며 같은 타입에 익스텐션을 하더라도 반드시 같은 코드 블럭으로 할 필요는 없다.

3) 이니셜라이저 추가

extension String {
	init(int: Int) {
    	self = "\(int)"
    }
    
    init(double: Double) {
    	self = "\(double)"
    }
}

let stringFromInt: String = String(int: 100)	// "100"
let stringFromDouble: String = String(double: 100.0)	// "100.0"

인스턴스 초기화 시 다양한 데이터를 전달 받을 수 있도록 여러 종류의 이니셜라이즈를 추가하는 것이 가능하다.

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

3. 상속 vs 익스텐션


클래스 상속과 익스텐션은 비슷해 보이지만 많이 다르다.

상속

  • 가능 타입 : 클래스
  • 수직 확장 = 하나의 타입을 물려받아 추가 기능을 구현
  • 재정의 가능

익스텐션

  • 가능 타입 : 구조체, 클래스, 프로토콜 등
  • 수평 확장 = 기존 타입에 기능을 추가
  • 재정의 불가능





Swift - Extentions

profile
iOS Developer

0개의 댓글