스위프트에서 **프로토콜(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"
프로토콜의 장점
- 유연성: 서로 다른 타입 간에 공통적인 기능을 정의하고, 이를 채택하여 일관성 있게 사용할 수 있습니다.
- 추상화: 코드의 구체적인 구현보다는 기능적인 요구 사항을 정의하여 추상적인 프로그래밍이 가능합니다.
- 다형성: 동일한 프로토콜을 채택한 여러 타입을 같은 방식으로 처리할 수 있습니다.
결론
스위프트에서 프로토콜은 특정 기능을 구현하도록 강제하는 청사진으로, 코드 재사용성, 일관성, 다형성을 높이는 데 중요한 역할을 합니다. 프로토콜을 활용하면 유연하고 강력한 설계를 할 수 있습니다.
'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 |