25. Extension

Cavok·2020년 10월 29일
0

* 정의

- 익스텐션이란 구조체, 클래스, 열거형, 프로토콜에 새로운 기능을 추가하는 문법이다.

익스텐션이 타입에 추가할 수 있는 기능은 아래와 같다.

  • 계산 인스턴스 속성 / 계산 타입 속성
  • 인스턴스 메소드 / 타입 메소드
  • 아니셜라이져
  • 서브스크립트
  • 중첩타입

기존 타입에 멤버들을 추가한다니... 왠지 지금까지 공부했었던 클래스의 '상속' 과 비슷해보이는데?

하지만 둘은 엄연히 다르다. 일단 범용성 측면에서도 다르다. '상속'은 클래스에서만 사용 가능한 반면, '익스텐션'은 위에서도 말했듯이 구조체, 클래스, 열거형, 프로토콜처럼 여러 타입에서 사용이 가능하다.
또한 알아두어야 할 것은 익스텐션은 오버라이딩을 지원하지 않는다는 것이다. 오버라이딩은 '상속' 만의 특징 이다. 오버라이딩이라 하면 Super-Class, Sub-Calss 가 존재하는 계층 구조 안에서 상속을 전제로 이루어진다. 하지만 익스텐션은 확장이라는 단어의 뜻처럼 상속이 이루어지는 수직 관계가 아닌, 동일한 계층 관계에서 범위(기능) 을 수평적으로 확장 한다.

자! 그러면 이 '익스텐션' 을 어떻게 사용하는지 한번 볼까?

1.프로퍼티

extension String {
    var ToArray: [String] {
        return ["\(self)"]
    }
}

print("배열로 변환".ToArray)
String 타입을 StringArray 타입으로 바꿔주도록 기능을 extension(확장) 했다. 이제 ToString만 사용하면 문자열을 얼만든지 배열로 바꿔 줄 수 있다.

2. 메소드

extension String {
    func toInt() -> Int {
        guard let StringToInt = Int(self) else {
            return 0
        }
        return StringToInt
    }
}

var str = "123"
str.toInt()
String타입을 Int타입으로 바꿔주는 toInt기능을 확장했다. 이제 문자열에 toInt 메소드를 사용하면 얼마든지 Int 타입으로 바꿔 줄 수 있다.

3.이니셜라이져

extension Date {
    init?(_ year: Int, _ month: Int, _ day: Int) {
        let cal = Calendar.current
        var comp = DateComponents()
        comp.year = year
        comp.month = month
        comp.day = day
        guard let date = cal.date(from: comp) else {
            return nil
        }
        self = date
    }
}
Date(2020, 10, 29) // "Oct 29, 2020 at 12:00 AM"
Date 타입에 원하는 날짜를 생성할 수 있는 이니셜라이져를 extension(확장) 했다. 단, 주의할 점은 extension에 이니셜라이져를 구현할 때, 지정이니셜라이져를 구현하는게 불가능하다는 것이다. 오직 convenience initializer 만 구현할 수 있다. 그러나 Date 처럼 구조체(값타입) 기반으로 이루어진 타입은 상관없다. 꼭 기억해두도록 하자 !

0개의 댓글

관련 채용 정보