0Pricing
Swift Academy · 강의

프로토콜 조합

&로 여러 프로토콜 요구 사항을 결합합니다.

프로토콜 조합은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

프로토콜 결합하기

때로는 값이 여러 프로토콜을 동시에 충족해야 합니다. Swift에서는 & 연산자로 프로토콜을 조합할 수 있습니다. SomeProtocol & AnotherProtocol과 같이 작성합니다.

protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }

조합된 매개변수

Named & Aged 유형의 매개변수는 두 프로토콜을 모두 준수하는 모든 값을 받습니다.

protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }

struct Person: Named, Aged {
    let name: String
    let age: Int
}

func intro(_ x: Named & Aged) {
    print(x.name + " is " + String(x.age))
}
intro(Person(name: "Sam", age: 28))

상속을 사용하지 않는 이유

조합을 사용하면 새로운 통합 프로토콜을 만들지 않고 호출 지점에서 두 프로토콜을 모두 요구할 수 있습니다. 따라서 프로토콜을 작고 재사용하기 쉽게 유지할 수 있습니다.

protocol Drawable { func draw() -> String }
protocol Resizable { func resize(_ f: Double) -> String }

struct Icon: Drawable, Resizable {
    func draw() -> String { "drawing" }
    func resize(_ f: Double) -> String { "x" + String(f) }
}

func render(_ v: Drawable & Resizable) {
    print(v.draw(), v.resize(2))
}
render(Icon())

세 개 이상 결합하기

추가 & 연산자를 사용해 필요한 만큼 많은 프로토콜을 연결할 수 있습니다.

protocol A { func a() -> String }
protocol B { func b() -> String }
protocol C { func c() -> String }

struct X: A, B, C {
    func a() -> String { "a" }
    func b() -> String { "b" }
    func c() -> String { "c" }
}

func use(_ v: A & B & C) { print(v.a(), v.b(), v.c()) }
use(X())

클래스와 조합하기

클래스 유형을 프로토콜과 결합할 수 있습니다. SomeClass & SomeProtocol은 값이 해당 클래스 또는 하위 클래스이면서 프로토콜도 준수해야 함을 의미합니다.

class Vehicle { var speed = 0 }
protocol Electric { var battery: Int { get } }

class Tesla: Vehicle, Electric { var battery = 100 }

func check(_ v: Vehicle & Electric) {
    print(v.speed, v.battery)
}
check(Tesla())

조합 반환하기

함수는 조합된 유형을 반환하여 결과가 나열된 모든 프로토콜을 준수한다고 호출자에게 약속할 수 있습니다.

protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged { let name: String; let age: Int }

func makePerson() -> Named & Aged {
    Person(name: "Eve", age: 22)
}
let p = makePerson()
print(p.name, p.age)

조합을 위한 typealias

typealias를 사용해 조합에 읽기 쉬운 이름을 지정하면 & 연결을 반복하지 않고 재사용할 수 있습니다.

protocol Codable2 { func encode() -> String }
protocol Loggable { func log() -> String }

typealias Persistable = Codable2 & Loggable

struct Record: Persistable {
    func encode() -> String { "data" }
    func log() -> String { "logged" }
}
func save(_ r: Persistable) { print(r.encode(), r.log()) }
save(Record())

컬렉션에서 조합 사용하기

배열에 조합된 유형의 값을 저장하고 각 요소에서 모든 프로토콜의 멤버에 접근할 수 있습니다.

protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct P: Named, Aged { let name: String; let age: Int }

let group: [Named & Aged] = [P(name: "A", age: 1), P(name: "B", age: 2)]
for g in group { print(g.name, g.age) }

표준 프로토콜과 조합하기

조합은 라이브러리 프로토콜과 함께 사용할 때 특히 유용합니다. 예를 들어 CustomStringConvertible과 Equatable을 모두 요구할 수 있습니다.

func report<T>(_ items: [T]) where T: CustomStringConvertible & Equatable {
    for i in items { print(i.description) }
}
report([1, 2, 3])

빈 프로토콜을 표식으로 사용하기

조합을 사용하면 표식 프로토콜(요구 사항 없음)과 기능 프로토콜을 결합하여 타입 시스템에 의도를 표현할 수 있습니다.

protocol Secure {}
protocol Sendable2 { func send() -> String }

struct Packet: Secure, Sendable2 {
    func send() -> String { "sent securely" }
}
func transmit(_ p: Secure & Sendable2) { print(p.send()) }
transmit(Packet())

조합과 제네릭 비교

조합(A & B)은 구체 타입을 지우지만, 제네릭(<T: A & B>)은 구체 타입을 보존합니다. 매개변수와 반환 타입을 서로 연관해야 할 때는 제네릭을 사용하십시오.

protocol A { func a() -> String }
protocol B { func b() -> String }
struct S: A, B { func a() -> String { "a" }; func b() -> String { "b" } }

func generic<T: A & B>(_ x: T) -> T { print(x.a(), x.b()); return x }
_ = generic(S())

빠른 확인

프로토콜 조합에 대한 이해도를 확인해 보십시오.

복습

&를 사용한 프로토콜 조합을 이용하면 새로운 통합 프로토콜을 정의하지 않고도 한 번에 여러 프로토콜(선택적으로 하나의 클래스 포함)을 준수하도록 요구할 수 있습니다. 조합에 typealias로 이름을 붙이고, 매개변수·반환값·컬렉션에 사용할 수 있습니다. 또한 구체 타입을 보존하는 방식에서 조합과 제네릭이 어떻게 다른지도 살펴보았습니다.

자주 묻는 질문

“프로토콜 조합” 강의는 무료인가요?

네 — “프로토콜 조합” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“프로토콜 조합”에서 뭘 배우나요?

&로 여러 프로토콜 요구 사항을 결합합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“프로토콜 조합” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 계약으로서의 프로토콜
  2. 확장의 기본 구현
  3. 프로토콜 조합
  4. 조건부 적합성
← Swift Academy(으)로 돌아가기