익스텐션이란 이미 존재하는 클래스나 구조체, 열거형 등의 객체에 새로운 기능을 추가하여 확장 해주는 구문
아래의 코드와 같이 extension 키워드 다음에는 확장하고자 하는 기존 객체의 이름을 작성하고, 중괄호 블럭을 작성한다.
해당 중괄호 블럭 내부에는 추가할 기능에 대한 구현 코드를 작성한다.
extension <확장할 기존 객체 이름> {
// 추가할 기능에 대한 구현 코드 작성
}
익스텐션을 이용하면 기존 객체에 프로퍼티를 추가할 수 있다. 단, 추가할 수 있는 것은 연산 프로퍼티로 제한된다.
대신에 인스턴스 프로퍼티든 타입 프로퍼티든 연산 프로퍼티라면 추가할 수 있다. 아래 코드는 모두 4개의 연산 프로퍼티를 추가하고 있는데, 이들 각각은 Double타입으로 정의된 값을 처리해주는 역할이다.
extension Double {
var nm: Double { return self * 1000.0 }
var m: Double { return self * 100.0 }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1000.0 }
var description: String {
return "\(self)km는 \(self.km)m, \(self)cm는 \(self.cm)m, \(self)mm는 \(self.mm)m입니다.
}
}
위처럼 자료형의 기능을 확장해 놓으면 아래와 같이 각각의 단위별로 값을 더해야할 때 매우 편리 하다.
let distance = 42.0.km + 195.m
print("마라톤의 총 거리는 \(distance)m 입니다.")
//마라톤의 총 거리는 42195.0m 입니다.
익스텐션을 이용하면 기존 객체에 새로운 인스턴스 메소드나 타입 메소드를 정의할 수 있다.
매개변수 타입을 다르게 하면 서로 다른 메소드가 되는 메소드를 오버로딩 특성을 이용해서 새로운 메소드를 정의할 수 있고, 매개 변
수명을 변경하여 새로운 메소드를 작성할 수 있다.
그러나, 기존 객체에서 사용된 같은 메소드는 익스텐션에서 재정의하는 것은 안된다.
추후 추가 예정...
Overloading: 메소드 함수명은 같은데 전달받는 파라미터 인자 값에 의해 호출되는 메소드가 다르게 하는 것
-> 오버로딩을 사용한다면 메소드 명이 같아도 전달되는 매개변수의 개수에 따라 정의된 메소드가 호출된다.
기존 소스 코드를 건드리지 않고도 원하는 내용을 확장할 수 있다는 특징 때문에 익스텐션을 주로 라이브러리에 정의된 클래스의 기능을 추가할 때나 오버라이드할 때 사용된다.
스위프트로 작성된 각종 코드를 살펴보면 익스텐션의 특이한 사용법이 발견되는 경우가 있다. 이게 바로 커스텀 클래스를 작성할 때 익스텐션을 활용하는 것인데, class 키워드를 사용하여 커스텀 class의 기본 코드만 정의하고 이어서 다시 익스텐션을 사용하여 나머지 코드를 보완하는 경우가 적지 않다.
추후 추가 예정...
Override: 덮는 것
-> 부모 클래스의 메소드를 사용할 수 있어도 자식 클래스에서 변경해야 할 상황이 발생한다면 오버라이드를 통해 자식 클래스에서만 새로운 기능으로 재정의할 수 있다.
프로토콜이란 클래스나 구조체가 어떤 기준을 만족하거나 또는특수한 목적을 달성하기 위해 구현해야하는 메소드와 프로퍼티 목록이다.
프로토콜에는 구현해야 할 메소드의 명세가 작성되어 있어서 프로토콜만 봐도 무엇을 어떻게 호출해야 하는지 알 수 있다.
요약하자면, 특정 기능이나 속성에 대한 설계도
명세: 프로토콜에 선언된 프로퍼티나 메소드의 형식
아래의 코드와 같이 protocol 키워드 다음 프로토콜의 이름을 작성하고 중괄호 안에 구현해야 할 프로퍼티 명세를 작성한다.
protocol <프로토콜 이름> {
<구현해야 할 프로퍼티의 명세1>
<구현해야 할 프로퍼티의 명세2>
<구현해야 할 프로퍼티의 명세3>
<구현해야 할 프로퍼티의 명세4>
<구현해야 할 프로퍼티의 명세5>
}