Swift에서 프로토콜은 다른 타입들이 구현해야 하는 메서드, 프로퍼티, 이니셜라이저들의 청사진을 정의하는데 사용됩니다. 프로토콜은 타입의 일종이기 때문에, 변수, 상수, 함수의 인자 타입, 함수의 반환 타입 등으로 사용될 수 있습니다. 이번 블로그 포스트에서는 Swift의 프로토콜 데이터 타입 및 관련된 기능들에 대해 알아보겠습니다.
프로토콜 변수
프로토콜을 변수 또는 상수로 선언할 수 있습니다. 이렇게 선언된 변수나 상수는 해당 프로토콜을 준수하는 어떤 타입이라도 할당할 수 있습니다. 아래의 예제는 Printable
이라는 프로토콜을 정의하고, Person
클래스가 이를 준수하는 예시입니다.
protocol Printable {
func printInfo()
}
class Person: Printable {
func printInfo() {
print("Name: John Doe")
print("Age: 30")
}
}
class Animal: Printable {
func printInfo() {
print("Name: Dog")
print("Breed: Labrador Retriever")
}
}
let printable1: Printable = Person()
let printable2: Printable = Animal()
위의 예제에서 printable1
은 Person
인스턴스를 할당받고, printable2
는 Animal
인스턴스를 할당받습니다. Printable
프로토콜을 준수하는 어떤 타입이라도 이 변수들에 할당할 수 있습니다.
프로토콜 컬렉션
프로토콜을 배열 또는 딕셔너리 타입으로 사용할 수도 있습니다. 이 경우에는 해당 프로토콜을 준수하는 여러 개의 인스턴스들을 함께 저장하거나 처리하는데 사용됩니다. 아래의 예제는 Equatable
프로토콜을 정의하고, 이를 준수하는 Point
구조체를 사용하는 예시입니다.
protocol Equatable {
static func ==(lhs: Self, rhs: Self) -> Bool
}
struct Point: Equatable {
let x: Int
let y: Int
static func ==(lhs: Point, rhs: Point) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
let points: [Equatable] = [Point(x: 1, y: 2), Point(x: 3, y: 4), Point(x: 5, y: 6)]
위의 예제에서 points
배열은 Equatable
프로토콜을 준수하는 여러 개의 Point
인스턴스들을 저장하고 있습니다. 이를 통해 배열 내의 인스턴스들을 비교하거나 처리할 수 있습니다.
프로토콜 상속
Swift에서 프로토콜은 다른 프로토콜을 상속할 수 있습니다. 이를 통해 여러 프로토콜을 하나의 프로토콜로 묶어 사용할 수 있습니다. 아래의 예제는 Drawable
프로토콜과 Resizable
프로토콜을 정의하고, 이들을 상속하는 Shape
프로토콜을 사용하는 예시입니다.
protocol Drawable {
func draw()
}
protocol Resizable {
func resize()
}
protocol Shape: Drawable, Resizable {
var color: String { get set }
}
class Square: Shape {
var color: String = "Red"
func draw() {
print("Drawing a square")
}
func resize() {
print("Resizing the square")
}
}
let square: Shape = Square()
위의 예제에서 Shape
프로토콜은 Drawable
프로토콜과 Resizable
프로토콜을 상속하고 있습니다. Square
클래스는 Shape
프로토콜을 준수하며, 이를 통해 Shape
타입의 변수에 해당 인스턴스를 할당할 수 있습니다.
결론
Swift에서 프로토콜은 데이터 타입으로 사용될 수 있으며, 변수, 상수, 컬렉션 타입에 할당하여 사용할 수 있습니다. 프로토콜 상속을 통해 여러 프로토콜을 한번에 사용할 수도 있습니다. 프로토콜을 사용하면 코드의 재사용성을 높여 유연하고 확장 가능한 구조를 만들 수 있습니다.