[Swift 문법] - Protocol, Extension

sun02·2021년 7월 18일
0

100 days of Swift 

목록 보기
10/40

1. Prootcols

프로토콜은 어떤 메서드와 프로퍼티을 꼭 가지고 있어야하는지 설명하는 방식이다.
그런 뒤에 해당 프로토콜을 사용하는 유형을 Swift에 알려준다. – 프로터콜을 채택하거나 준수하는 것으로 알려진 과정

예를 들어, 우리는 id 프로퍼티로 받아들이는 함수를 만들 수 있지만 정확히 어떤 데이터 타입이 사용되는지 크게 상관하지 않는다.

protocol Identifiable {
    Var id: String { get set}
}
  • Identifiable 프로토콜이다.
  • 이 프로토콜을 준수하는 모든 타입이 읽거나(“get”) 쓸 수 있는(“Set”) id 문자열을 가지도록 요구한다.

우리는 이 프로토콜의 인스턴스를 만들 수는 없다 – 프로토콜은 우리가 만들고 바로 사용하는 것이라기보다 우리가 원하는 것의 묘사이다.

struct User: Identifiable {
    var id: String
}
  • 다음과 같이 Identifiable 프로토콜을 준수하는 구조체를 만들 수 있다.
func displayID(thing: Identifiable) {
    print(“My ID is \(thing.id)”)
}
  • Identifiable 객체를 받아들이는 displayID() 함수를 작성할 수 있다.

2. Protocol inheritance

하나의 프로토콜은 다른 프로세스에서 상속받을 수 있고 이것이 프로토콜 상속이다.
클래스와 달리, 사용자 정의를 추가하기 전에 한 번에 여러 프로토콜을 상속받을 수 있다.

우리는 세 개의 프로토콜을 정의할 것이다

protocol Payable {
    func calculateWages() -> Int 
}

protocol NeedsTraining {
    func study()
}

Protocol HasVacation {
    func takeVacation(days: Int)
}
  • Payable은 이것을 준수하는 타입들이 calculateWages() 메서드를 실행하길 요구한다.
  • NeedsTraining은 이것을 준수하는 타입들이 study() 매서드를 실행하길 요구한다.
  • HasVacation은 이것을 준수하는 타입들이 takeVacation() 메서드를 실행하길 요구한다.
Protocol Employee: Payable, NeedsTraining, HasVacation { 

}
  • 위의 모든 프로토콜을 가져오는 Employee 프로토콜을 만들 수 이다.

이제 새로운 타입이 세 가지 개별 프로토콜이 아니라 단일 프로토콜(Employee)만 준수하도록 하면 된다.

3. Extensions

Extension 은 원래 존재하던 타입에 메서드를 추가하여 원래 설계되지 않은 작업을 수행하도록 한다.

extension Int {
    func squared() -> Int {
        return self * self
    }
}
  • 다음과 같이 Int 타입에 익스텐션을 추가해서 현재 숫자의 제곱 값을 반환하는 squared() 메서드를 가지도록 할 수 있다.
let number =. 8
number.squared()
  • 정수를 만들어 squared() 메서드가 있는지 확인해 보자

익스텐션에 저장 프로퍼티는 추가할 수 없기 때문에 계산 프로퍼티를 사용해야한다.

extension Int {
    var isEven: Bool {
        return self % 2 == 0
    }
}
  • 다음과 같이 짝수를 포함하는 경우 참을 반환하는 isEven 계산 프로퍼티를 추가할 수 있다.

4. Protocol extensions

프로토콜은 어떤 메서드를 가지고 있어야하는지 알려주지만 그 안의 코드는 제공하지 않는다.
익스텐션은 메서드 안에 코드를 작성할 수 있게 하지만 한 가지 데이터 유형에만 영향을 미친다 – 한 번에 여러 유형에다 메서드를 추가할 수는 없다.

프로토콜 익스텐션은 이러한 문제점들을 모두 해결한다
: 이들은 Int와 같은 특정 유형을 확장하는 대신 전체 프로토콜을 확장하여 모든 준수 유형들이 변경 사항을 알 수 있게 한다는 점을 제외하고는 일반 익스텐션과 같다.

let pythons = [“Eric”, “Graham”, “John”, “Michael”, “Terry”, “Terry”]
let beatles = Set([“John”, “Paul”, “George”, “Ringo”])
  • 예를 들어, 여기 이름들을 포함하고 있는 배열과 집합이 있다.
extension Collection {
    func summarize() {
        print(“There are \(count) of us:”)
    
        for name in self {
            print(name) 
        }
    }
}
  • Swift의 배열과 집합은 모두 Collection이라는 프로토콜을 준수하기 때문에 Collection에 해당 콜렉션을 깔끔하게 출력하는 summarize() 메서드를 추가하는 익스텐션을 작성한다.
pythons.summarize()
beatles.summarize()
  • 배열과 집합은 이제 summarize 메서드를 가지기 때문에 다음과 같이 작성할 수 있다.

5. Protocol-oriented programming

프로토콜 확장은 자체 프로토콜 메서드에 대한 디폴트 실행을 제공한다.
이것은 타입이 프로토콜을 더 쉽게 준수할 수 있게 하고 “protocol-oriented programming” 이라는 기술 – 프로토콜 과 프로토콜 확장을 중심으로 코드를 만드는 것 - 을 허용한다.

protocol identifiable {
    var id: String { get set {
    func identify()
}
  • 자신을 준수하는 타입이 id 프로퍼티와 identify() 메서드를 갖게 하는 Identifiable 프로토콜이다.
extension Identifiable {
    func identify() {
        print(“My ID is \(id).”)
    }
}
  • 준수하는 모든 타입들이 고유한 identify() 메서드를 작성하도록 할 수 있지만 프로토콜 확장을 통해 다음과 같이 디폴트값을 제공할 수 있다.
struct User: Identifiable {
    var id: String
}

let twostraws = User(id: “twostraws”)
twostraws.identify()
  • 이제 Identifiable을 준수하는 타입을 만들면 그 타입은 identify()를 자동으로 가진다.

6. Protocols and extensions summary

  1. 프로토콜은 이를 준수하는 타입이 어떤 메서드와 프로토콜을 가지고 있어야하는지 보여주지만 그 메서드의 구현을 제공하지는 않는다.
  2. 클래스 처럼 프로토콜을 다른 프로토콜 위에 만들 수 있다.
  3. Extension은 Int 와 같이 특정한 타입에 메서드나 계산 프로퍼티를 추가할 수 있다.
  4. 프로토콜 extension프로토콜에 메서드나 계산 프로퍼티를 추가할 수 있게 한다.
  5. Protocol-oriented 프로그래밍은 너의 앱 구조를 일련의 프로토콜로 설계한 다음 프로토콜 익스텐션을 사용하여 디폴트 메서드 구현을 제공하는 방식이다.
  • Stored Property (저장 프로퍼티) : 클래스나 구조체의 인스턴스의 일부로 저장 되는 상수나 변수
  • Computed Property(연산 프로퍼티) : 값을 저장하지 않고 특정한 연산을 통해 그때 그때 값을 리턴하는 프로퍼티

출처

0개의 댓글