아삭아삭 iOS 개발

[Swift 독학] 패스트캠퍼스 챌린지 30일차_익스텐션 본문

Swift

[Swift 독학] 패스트캠퍼스 챌린지 30일차_익스텐션

바닐라머스크 2022. 2. 22. 22:42

 

오늘은 스위프트의 강력한 기능 중 하나인 확장(익스텐션, extension)에 대해 알아보겠습니다.

재정의를 하지 않고도 기존 타입에 새로운 기능을 추가할 수 있어 매우 유용한 기능인 확장의 특징추가 가능한 기능들은 아래와 같습니다.

 

반응형

 

■ 확장 (익스텐션, extensions)

  • 기존의 클래스, 구조체, 열거형, 프로토콜 타입에 새로운 기능을 추가하는 기능
    ※ 단, 기존에 존재하던 기능을 재정의(=오버라이드) 할 수는 없음
  • 익스텐션 키워드를 사용하여 적용
  • 타입만 알고도 그 타입의 기능 확장 가능
    ※ 단, 기능을 추가하려는 타입의 구현된 소스 코드를 모르거나 알 수 없어도 가능
  • 익스텐션은 구조체, 클래스, 프로토콜 등에 적용 가능
    ※ 반면 클래스의 상속은 클래스 타입에서만 가능
  • 외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 경우에 사용
     ex) 외부 라이브러리나 프레임워크를 가져다 썼을 때는 원본 소스를 수정하지 못함
  • 익스텐션을 통해 연산 프로퍼티/메서드/이니셜라이저/서브스크립트/중첩 데이터 타입 등 추가 가능
  • 프로토콜과 함께 사용할 경우 강력한 기능을 제공함
extension 확장할 타입 {
// 타입에 추가될 새로운 기능 구현 //
}

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

 

 

■ 익스텐션이 타입에 추가할 있는 기능

  • 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
    ※ 단, 저장 프로퍼티는 추가할 수 없음, 타입에 정의되어 있는 기존 프로퍼티의 감시자를 추가할 수 없음
extension Int {
    var isPositive: Bool {
        return self > 0
    }

    var isNegative: Bool {
        return self < 0
    }
}

var covidTestResult = -2
covidTestResult.isPositive
// false
covidTestResult.isNegative
// true

var colleagueResult: Int = 5
print(colleagueResult.isPositive)
// true

 

 

  • 타입 메서드 / 인스턴스 메서드
// Int타입에 인스턴스 메서드인 cubemultipleN(by: ) 메서드를 추가
extension Int {
    func cubemultipleN(by n: Int) -> Int {
        return self * self * self * n
    }
}

print(2.cubemultipleN(by: 1))
// 8
print(3.cubemultipleN(by: 2))
// 54

var apartmentarea = 5
print(apartmentarea.cubemultipleN(by: 2))

 

  • 이니셜라이저(초기화 구문)
    - 타입의 정의부에 초기화 구문을 추가하지 않더라도 익스텐션을 통해 이니셜라이저 추가 가능
    - 익스텐션으로 클래스 타입에 현의 이니셜라이저 추가 가능
      ※ 단, 지정 이니셜라이저는 추가 불가
      ※ 지정 이니셜라이저와 디이니셜라이저는 반드시 클래스 타입의 구현부에 위치해야 함
    - 값 타입은 무관
extension String {
    init(double: Double) {
        self = "\(double)"
    }

    init(bool: Bool) {
        self = "\(bool)"
    }
}

let stringFromDouble: String = String(double: 99.9999)
// "99.999"
let stringFromBool: String = String(bool: true)
// "true"

 

  • 서브스크립트
  • 중첩 타입
  • 특정 프로토콜을 준수할 수 있도록 기능 추가

 

■ 클래스의 상속 vs. 익스텐션

  클래스의 상속 익스텐션
적용범위 클래스 타입 구조체/클래스/열거형/프로토콜/제네릭 타입
확장의 성격 수직 확장
: 특정 타입을 물려받아 하나의 새로운 타입을 정의하고 추가 기능을 구현
수평 확장
: 기존의 타입에 기능을 추가하는 수평 확장
재정의 가능여부 기존 기능 재정의 가능 기존 기능 재정의 불가

 

 

 

 

 

본 게시물은 개인 공부 기록용이므로 내용에 오류가 있을 수 있습니다.

 fast campus강의  참조자료

[1] https://blog.yagom.net/563/

[2] https://bbiguduk.gitbook.io/swift/language-guide-1/extensions

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.