본문 바로가기

Swift '문법'

protocol [프로토콜]

스위프트에서 **프로토콜(Protocol)**은 특정 기능이나 속성을 요구하는 청사진을 정의하는 개념입니다. 프로토콜을 채택하는 클래스, 구조체, 열거형은 이 프로토콜에서 요구하는 메서드, 프로퍼티, 기타 요구사항을 반드시 구현해야 합니다. 즉, 프로토콜은 특정 기능을 구현하기 위한 약속을 의미하며, 이를 통해 코드의 일관성과 재사용성을 높일 수 있습니다.

프로토콜 정의

프로토콜은 protocol 키워드를 사용하여 정의됩니다. 프로토콜 자체는 구현을 제공하지 않으며, 구현은 해당 프로토콜을 채택한 타입에서 이루어집니다.

protocol ProtocolName {
    // 요구 사항을 정의
}

프로토콜 요구 사항

프로토콜은 메서드, 프로퍼티, 서브스크립트 등을 요구할 수 있습니다.

프로퍼티 요구사항

프로토콜은 프로퍼티가 읽기 전용인지, 읽기/쓰기 가능한지 정의할 수 있습니다. 실제 구현에서는 계산 속성이나 저장 속성 모두 사용할 수 있습니다.

protocol SomeProtocol {
    var mustBeSettable: String { get set }  // 읽기 및 쓰기 가능
    var doesNotNeedToBeSettable: Int { get } // 읽기 전용
}

메서드 요구사항

프로토콜은 특정 메서드를 구현하도록 요구할 수 있습니다. 메서드는 매개변수와 반환 타입만 명시되며, 실제 구현은 프로토콜을 채택한 곳에서 이루어집니다.

protocol AnotherProtocol {
    func someMethod()  // 메서드 요구
}

예시

protocol Describable {
    var description: String { get }
    func describe()
}

프로토콜 채택

클래스, 구조체, 열거형이 프로토콜을 채택하려면 타입 정의 뒤에 콜론(:)을 사용하여 프로토콜 이름을 명시합니다.

struct Person: Describable {
    var name: String
    
    // 프로토콜 요구사항을 구현
    var description: String {
        return "Person named \(name)"
    }
    
    func describe() {
        print(description)
    }
}

클래스 전용 프로토콜

프로토콜을 클래스 타입에만 적용하고 싶을 경우, 프로토콜 정의 시 AnyObject를 상속받도록 지정합니다.

protocol ClassOnlyProtocol: AnyObject {
    func classOnlyMethod()
}

프로토콜 상속

프로토콜은 다른 프로토콜을 상속받을 수 있습니다. 상속받은 프로토콜은 추가적인 요구 사항을 정의할 수 있습니다.

protocol InheritingProtocol: Describable {
    func anotherMethod()
}

프로토콜과 구조체, 클래스의 차이점

  • 클래스는 상속이 가능하고, 참조 타입입니다.
  • 구조체는 상속이 불가능하고, 값 타입입니다.
  • 프로토콜은 특정 기능을 정의할 뿐이며, 구현을 제공하지 않습니다. 클래스나 구조체가 프로토콜을 채택하여 요구 사항을 구현합니다.

프로토콜 예시

protocol Vehicle {
    var speed: Double { get set }
    func startEngine()
}

class Car: Vehicle {
    var speed: Double = 0.0

    func startEngine() {
        print("Car engine started")
    }
}

let myCar = Car()
myCar.startEngine() // "Car engine started"

프로토콜의 장점

  1. 유연성: 서로 다른 타입 간에 공통적인 기능을 정의하고, 이를 채택하여 일관성 있게 사용할 수 있습니다.
  2. 추상화: 코드의 구체적인 구현보다는 기능적인 요구 사항을 정의하여 추상적인 프로그래밍이 가능합니다.
  3. 다형성: 동일한 프로토콜을 채택한 여러 타입을 같은 방식으로 처리할 수 있습니다.

결론

스위프트에서 프로토콜은 특정 기능을 구현하도록 강제하는 청사진으로, 코드 재사용성, 일관성, 다형성을 높이는 데 중요한 역할을 합니다. 프로토콜을 활용하면 유연하고 강력한 설계를 할 수 있습니다.

'Swift '문법'' 카테고리의 다른 글

filter  (0) 2024.09.27
map  (0) 2024.09.26
상수/변수  (0) 2024.08.26
저장 프로퍼티 (Stored Property),연산 프로퍼티 (Computed Property)  (0) 2024.08.23
Closure '클로저'  (0) 2024.08.20