* 정의
- 익스텐션이란 구조체, 클래스, 열거형, 프로토콜에 새로운 기능을 추가하는 문법이다.
익스텐션이 타입에 추가할 수 있는 기능은 아래와 같다.
계산 인스턴스 속성 / 계산 타입 속성
인스턴스 메소드 / 타입 메소드
아니셜라이져
서브스크립트
중첩타입
기존 타입에 멤버들을 추가한다니... 왠지 지금까지 공부했었던 클래스의 '상속' 과 비슷해보이는데?
하지만 둘은 엄연히 다르다. 일단 범용성 측면에서도 다르다. '상속'은 클래스에서만 사용 가능한 반면, '익스텐션'은 위에서도 말했듯이 구조체, 클래스, 열거형, 프로토콜처럼 여러 타입에서 사용이 가능하다.
또한 알아두어야 할 것은 익스텐션은 오버라이딩을 지원하지 않는다는 것이다. 오버라이딩은 '상속' 만의 특징 이다. 오버라이딩이라 하면 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)
Date 타입에 원하는 날짜를 생성할 수 있는 이니셜라이져를 extension(확장) 했다. 단, 주의할 점은 extension에 이니셜라이져를 구현할 때, 지정이니셜라이져를 구현하는게 불가능하다는 것이다. 오직 convenience initializer 만 구현할 수 있다. 그러나 Date 처럼 구조체(값타입) 기반으로 이루어진 타입은 상관없다. 꼭 기억해두도록 하자 !