[Swift]익스텐션과 프로토콜

iOSoo·2021년 9월 26일
0
post-thumbnail
post-custom-banner

[익스텐션(Extensions)]

1) 정의

익스텐션이란 이미 존재하는 클래스나 구조체, 열거형 등의 객체에 새로운 기능을 추가하여 확장 해주는 구문

2) 구현 가능한 것들

  • 새로운 연산 프로퍼티를 추가할 수 있다.
  • 새로운 메소드를 정의할 수 있다.
  • 새로운 초기화 구문을 추가할 수 있다.
  • 기존 객체를 수정하지 않고 프로토콜을 구현할 수 있다.

3) 사용방법

아래의 코드와 같이 extension 키워드 다음에는 확장하고자 하는 기존 객체의 이름을 작성하고, 중괄호 블럭을 작성한다.
해당 중괄호 블럭 내부에는 추가할 기능에 대한 구현 코드를 작성한다.

extension <확장할 기존 객체 이름> {
// 추가할 기능에 대한 구현 코드 작성
}

[익스텐션(Extensions)과 연산 프로퍼티]

익스텐션을 이용하면 기존 객체에 프로퍼티를 추가할 수 있다. 단, 추가할 수 있는 것은 연산 프로퍼티로 제한된다.
대신에 인스턴스 프로퍼티든 타입 프로퍼티든 연산 프로퍼티라면 추가할 수 있다. 아래 코드는 모두 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 입니다.

[익스텐션(Extensions)과 메소드]

익스텐션을 이용하면 기존 객체에 새로운 인스턴스 메소드나 타입 메소드를 정의할 수 있다.
매개변수 타입을 다르게 하면 서로 다른 메소드가 되는 메소드를 오버로딩 특성을 이용해서 새로운 메소드를 정의할 수 있고, 매개 변
수명을 변경하여 새로운 메소드를 작성할 수 있다.

그러나, 기존 객체에서 사용된 같은 메소드는 익스텐션에서 재정의하는 것은 안된다.

추후 추가 예정...

Overloading: 메소드 함수명은 같은데 전달받는 파라미터 인자 값에 의해 호출되는 메소드가 다르게 하는 것
-> 오버로딩을 사용한다면 메소드 명이 같아도 전달되는 매개변수의 개수에 따라 정의된 메소드가 호출된다.

[익스텐션(Extensions)을 활용한 코드 정리]

기존 소스 코드를 건드리지 않고도 원하는 내용을 확장할 수 있다는 특징 때문에 익스텐션을 주로 라이브러리에 정의된 클래스의 기능을 추가할 때나 오버라이드할 때 사용된다.
스위프트로 작성된 각종 코드를 살펴보면 익스텐션의 특이한 사용법이 발견되는 경우가 있다. 이게 바로 커스텀 클래스를 작성할 때 익스텐션을 활용하는 것인데, class 키워드를 사용하여 커스텀 class의 기본 코드만 정의하고 이어서 다시 익스텐션을 사용하여 나머지 코드를 보완하는 경우가 적지 않다.

추후 추가 예정...

Override: 덮는 것
-> 부모 클래스의 메소드를 사용할 수 있어도 자식 클래스에서 변경해야 할 상황이 발생한다면 오버라이드를 통해 자식 클래스에서만 새로운 기능으로 재정의할 수 있다.

[프로토콜(Protocol)]

1) 정의

프로토콜이란 클래스나 구조체가 어떤 기준을 만족하거나 또는특수한 목적을 달성하기 위해 구현해야하는 메소드와 프로퍼티 목록이다.
프로토콜에는 구현해야 할 메소드의 명세가 작성되어 있어서 프로토콜만 봐도 무엇을 어떻게 호출해야 하는지 알 수 있다.
요약하자면, 특정 기능이나 속성에 대한 설계도

명세: 프로토콜에 선언된 프로퍼티나 메소드의 형식

2) 사용방법

아래의 코드와 같이 protocol 키워드 다음 프로토콜의 이름을 작성하고 중괄호 안에 구현해야 할 프로퍼티 명세를 작성한다.

protocol <프로토콜 이름> {
	<구현해야  프로퍼티의 명세1>
    	<구현해야  프로퍼티의 명세2>
    	<구현해야  프로퍼티의 명세3>
    	<구현해야  프로퍼티의 명세4>
    	<구현해야  프로퍼티의 명세5>
}

3) 구현가능한 구현체

  1. 구조체
  2. 클래스
  3. 열거형
  4. 익스텐션
profile
애플을 좋아하는 비전공생
post-custom-banner

0개의 댓글