iOS) Extension 이란?

1 minute read

익스텐션이란?

익스텐션(Extension)은 스위프트의 강력한 기능 중 하나로 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있습니다.

👉 기능을 추가하려는 타입을 구현한 소스코드를 알지 못하거나 볼 수 없더라도, 타입만 안다면 기능을 확장할 수 있습니다.

익스텐션 VS 상속

상속은 클래스 타입에서만 가능.

익스텐션은 구조체, 클래스, 열거형, 프로토콜 타입에서 가능.

상속은 특정 타입을 물려받아 새로운 타입을 정의하고 추가기능을 구현하는 수직 확장

익스텐션은 기존의 타입에 기능을 추가하는 수평 확장

원래 타입을 정의한 소스코드에 기능을 추가하는 방법도 있겠지만, 외부 라이브러리나 프레임워크를 가져다 사용했다면 원본 코드를 수정하지 못한다. 이때 사용 가능.

익스텐션이 타입에 추가할 수 있는 기능은 다음과 같습니다.

  • 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
  • 타입 메서드 / 인스턴스 메서드
  • 이니셜라이저
  • 서브스크립트
  • 중첩 타입
  • 특정 프로토콜을 준수

👉 익스텐션은 타입에 새로운 기능을 추가할 수는 있지만, 기존에 존재하는 기능을 재정의(Override)할 수는 없습니다.

연산 프로퍼티

익스텐션으로 연산프로퍼티를 추가할 수 있습니다.

👉 하지만, 저장 프로퍼티는 추가할 수 없습니다. 또, 타입에 정의되어 있는 기존의 프로퍼티에 프로퍼티 감시자를 추가할 수도 없습니다.

  • 연산 프로퍼티

  • 저장 프로퍼티

  • 프로퍼티 감시자

타입에 정의되어 있는 기존의 프로퍼티에 프로퍼티 감시자를 추가할 수도 없습니다.(재정의 불가)

이와 같은 경우 상속을 통해서 프로퍼티 감시자를 추가할 수 있습니다.

메서드

익스텐션을 통해 타입에 메서드를 추가할 수 있습니다.

여러 기능을 여러 익스텐션 블록으로 나눠서 구현해도 전혀 문제가 없습니다.

이니셜라이저

타입의 정의 부분에 이니셜라이저를 추가하지 않더라도 익스텐션을 통해 이니셜라이저를 추가할 수 있습니다.

👉 하지만, 지정 이니셜라이저는 추가할 수 없습니다. 지정 이니셜라이저와 디이니셜라이저는 반드시 클래스 타입의 구현부에 위치해야 합니다.

  • 편의 이니셜라이저

클래스만 지정/편의 이니셜라이저를 나눈다.(상속과 관련이 있다.)

즉, 클래스의 경우는 익스텐션에서 편의 이니셜라이저만 선언이 가능하다.

서브스크립트

익스텐션을 통해 타입에 서브스크립트를 추가할 수 있습니다.

중첩 타입

익스텐션을 통해 타입에 중첩 데이터 타입(Nested Types)를 추가할 수 있습니다.

👉 중첩타입이란? 타입 내부에 타입을 정의하고 구현할 수 있다. 이처럼 타입 내부에 새로운 타입을 선언해준 것을 중첩 타입(Nested Types)이라고 부릅니다.

익스텐션을 통한 프로토콜의 실제 구현

익스텐션은 프로토콜과 함께 사용하면 강력한 기능을 합니다.

프로토콜을 정의할 때는 프로토콜의 요구사항을 구현할 수 없습니다.

👉 하지만, 익스텐션을 통해서 프로토콜의 실제를 구현할 수 있습니다. 이것을 프로토콜 초기구현(Protocol Default Implementations)라고 합니다.

변경해서 구현하고 싶다면 주석처리를 해제해서 사용해주시면 됩니다.

Categories:

Updated: