[Swift] - 프로토콜

sai06266·2023년 9월 17일
0

Swift 문법

목록 보기
6/9

프로토콜이란?

클래스가 충족해야하는 최소한의 요구사항을 정의(구현X)하는 규칙들의 집합

클래스가 구조적으로 올바르게 되기 위하여 스위프트 클래스가 반드시 따라야할 특정 규칙은 기본적으로 없지만, 다른 클래스와 함께 작업을 할 때는 특정 조건을 맞춰야 한다.
특히 다양한 프레임워크와 함께 동작하는 클래스를 만들 때는 더욱 그러하다.
이때 클래스가 충족해야하는 최소한의 요구사항을 정의해둔 규칙들의 집합을 프로토콜이라 한다.
해당 클래스가 프로토콜을 따르지 않으면 에러가 발생한다.

  • 프로토콜은 protocol 키워드를 이용하여 선언된다.
protocol Sendable {
  var from: String? { get }
  var to: String { get }
  func send()
}

프로퍼티 요구사항

  • 프로토콜에서는 프로퍼티가 저장프로퍼티인지 연산프로퍼티인지 명시하지 않고, 이름과 타입 그리고 gettable, settable한지 명시한다.
  • 프로퍼티는 항상 var로 선언해야 한다.
protocol Student {
  var height: Double { get set }
  static var schoolNumber: Int { get set }
  var name: String { get }
}
class Jack: Student {
    var roundingHeight: Double = 0.0
    var height: Double {
        get {
            return roundingHeight
        }
        set {
            roundingHeight = 183.0
        }
    }
    var name: String = "Jack"
    static var schoolNumber: Int = 123456
}

let jack = Jack()
print(jack.height, jack.name, jack.schoolNumber)
// 0.0 Jack 123456

함수 요구사항

  • 프로토콜에서는 인스턴스 메소드와 타입 메소드를 정의할 수 있다.
  • 하지만 메소드 파라미터의 기본 값은 프로토콜 안에서 사용할 수 없다.
  • 메소드를 정의할 때 함수명과 반환값을 지정할 수 있다.
  • mutating 키워드를 사용해 인스턴스에서 변경 가능하다는 것을 표시할 수 있다.
protocol Person {
  static func breathing()
  func sleeping(time: Int) -> Bool
  mutating func running()
}
struct Jack: Person {
    var heartRate = 100
    static func breathing() {
        print("숨을 쉽니다")
    }
    
    func sleeping(time: Int) -> Bool {
        if time >= 23 {
            return true
        } else {
            return false
        }
    }
    mutating func running() {
        heartRate += 20
    }
}
print(Jack.breathing())
// 숨을 쉽니다.
var jack = Aiden()
print(jack.sleeping(time: 23))
// true
print(jack.heartRate)
// 100
jack.running()
print(jack.heartRate)
// 120

0개의 댓글