[Swift] 익스텐션 (extension)

김상우·2021년 10월 28일
0

reference : https://blog.yagom.net/529 야곰넷, 스위프트 공식 문서, https://velog.io/@zooneon

익스텐션 (extension)

  • 익스텐션은 스위프트의 강력한 기능 중 하나.
    특히 프로토콜과 함께 사용하면 굉장히 강력한 기능을 선사한다.
    -> 프로토콜 지향 프로그래밍
  • 익스텐션은 구조체, 클래스, 열거형, 프로토콜 타입에 기능을 추가할 수 있는 기능
  • 기본 타입의 기능을 확장할 수도 있다.

  • 스위프트 익스텐션이 타입에 추가할 수 있는 기능들
  1. 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
  2. 메서드
  3. 이니셜라이저
  4. 서브 스크립트
  • extension 에서 연산 프로퍼티는 사용 가능하지만, 저장 프로퍼티는 사용 불가능하다.

클래스 상속 vs 익스텐션

  • 클래스의 상속은 클래스 타입끼리만 가능하지만 익스텐션은 클래스, 구조체, 열거형, 기본 타입등 적용 가능한 범위가 더 넓다.
  • 클래스의 상속은 super class / sub class 의 계급이 나뉜 수직 구조 이지만 익스텐션은 기존의 기능을 확장하는 수평구조 를 이룬다.
  • 클래스의 상속은 특정 타입을 물려받아 새로운 타입을 새로 정의 하는 것이지만 익스텐션은 타입을 새로 정의하는 것이 아니라 기존 타입의 확장이다.
  • 상속을 받으면 기존 기능을 재정의 할 수 있지만, 익스텐션으로는 기존 기능을 재정의 할 수는 없다.

Swift 익스텐션 문법

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

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

1. 연산 프로퍼티

  • Int 타입에 isEven 이라는 boolean 연산 프로퍼티 추가
// 1. 연산 프로퍼티 익스텐션
extension Int {
    var isEven: Bool {
        return self % 2 == 0
    }
}

26.isEven   // true
29.isEven   // false

2. 메서드

  • String 타입에 show() 라는 메서드 추가
// 2. 메서드 익스텐션
extension String {
    func show() {
        print(self)
    }
}

"Hello".show()	// "Hello

3. 이니셜라이저

  • String 타입에 Int 형 자료를 이니셜라이저 하면 문자열 타입으로 바꿔주는 기능 추가
  • class Person 타입에 편의 이니셜라이저 추가
// 3. 이니셜라이저
extension String {
    init(number: Int) {
        self = "\(number)"
    }
}

let six: String = String(6)
six     // "6"

// 클래스 타입은 편의 이니셜라이저만 익스텐션 할 수 있다.
class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

extension Person {
    convenience init() {
        self.init(name: "Default")
    }
}

let someone: Person = Person()
someone.name    // -> Default

4. 서브스크립트

  • 서브 스크립트 (subscript)
    클래스, 구조체, 열거형에서 시퀀스의 멤버 요소에 접근하기 위한 바로가기 첨자로, 단일 타입에 여러 서브스크립트를 정의할 수 있다.
    예를들어 array[3] 의 대괄호, dictionary[key] 의 대괄호.
// 4. 서브 스크립트
// 타입에 서브 스크립트 익스텐션 하기
extension String {
    subscript(value: String) -> String {
        return self + value
    }
    
    subscript(repeatCount: Int) -> String {
        var str: String = ""
        for _ in 1...repeatCount {
            str += self
        }
        return str
    }
}

print("abc"["def"])     //abcdef
print("abc"[3])         //abcabcabc
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글