티스토리 뷰

iOS

[Swift] Extension?

씌워터 2021. 4. 30. 00:10

 

Extension 이란?

Extension(익스텐션)은 구조체, 클래스, 열겨형 등의 타입에 새로운 기능을 추가할 수 있는 기능입니다. 이때 타입의 원본 코드를 알지 못해도, 타입이름만으로도 기능을 확장할 수 있습니다. 

-> 만약 Int 타입의 기능을 확장하고 싶다면? Int타입의 자세한 구현 코드를 알지 못해도, Int라는 타입이름을 알고 있으니 extension을 사용하면 기능을 확장할 수 있는 것이죠!

 

Swift에서 extension을 이용하면 다음과 같은 일들을 할 수 있습니다.

  • 계산된 인스턴스 프로퍼티와 계산된 타입 프로퍼티의 추가
  • 인스턴스 메서드와 타입 메서드의 추가
  • 새로운 이니셜라이저 제공
  • 서브스크립트 정의
  • 중첩 타입의 선언과 사용
  • 특정 프로토콜을 따르는 타입 만들기

 

상속 VS 익스텐션

상속과 익스텐션은 기능을 추가한다는 공통점이 있습니다. 

둘의 차이점은 과연 무엇일까요?

  상속 익스텐션
확장 수직확장 (부모클래스, 자식클래스) 수평적 확장
사용 클래스 타입 클래스, 구조체, 프로토콜, 제네릭 등 모든 타입
재정의 o x (불가능)

표에서 볼 수 있듯 상속은 부모클래스-자식클래스로 이뤄져 수직적인 확장이고, Extension을 이용한 확장은 수평적 확장이라고 할 수 있겠습니다. 그리고 상속은 오직 클래스 타입에서만 이용됩니다.

또한 상속에서는 재정의가 가능하지만, 익스텐션에서 기존의 기능을 다시 재정의 override 하는 것은 불가능합니다.

 

 

Extension 정의하기

extension 확장할 타입 이름 {
	// 추가할 새로운 기능 구현
}
  • extension 이라는 키워드를 이용하여 정의합니다.
  • 확장할 타입 이름만 알면 extension 기능을 사용할 수 있습니다.

 

Extension 사용예시

Int 타입에 새롭게 짝수와 홀수를 판별하는 기능을 추가해보도록 하겠습니다.

func printEvenOrOdd() {
	// extension 사용하기
    print(1.isEven) // false
    print(2.isEven) // true
    print(1.isOdd) // true
    print(2.isOdd) // false
}

// extension 정의
extension Int {
    var isEven: Bool {
        return self % 2 == 0 // true or false로 반환될 것
    }
    var isOdd: Bool {
        return self % 2 == 1 // true or false로 반환될 것
    }
}

isEven, isOdd라는 연산 프로퍼티를 추가했습니다.

이 Extension이 적용된 코드에서 만약 (Int형의무언가).isEven 을 하게되면 self가 바로 (Int형의무언가) 를 가리키게 되므로

(Int형의무언가)가 2로 나눴을때 나머지가 0일때 비교연산자(==)를 거쳐 true가 반환되게 되고, 0이 아니라면 false가 반환되게 됩니다.

.isOdd를 하게 되면 self에 해당하는 (Int형의무언가)를 2로 나눴을때 나머지가 1일때 true가 반환되고, 아니라면 false가 반환되게 됩니다.

 

 

아래와 같이 메서드확장도 할 수 있습니다.

func mul(){
    print(3.multiply(by: 2))    // 3 * 2 가 리턴되어 6으로 출력됨
    print(4.multiply(by: 5))    // 4 * 5 가 리턴되어 20이 출력됨
}

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

 

이니셜라이저 추가도 가능합니다.

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"
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함