조건부 적합성
제약 조건을 충족할 때만 제네릭 형식이 프로토콜을 따르게 합니다.
조건부 적합성은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
조건부 프로토콜 준수란?
조건부 프로토콜 준수를 사용하면 타입 매개변수가 특정 제약 조건을 만족할 때만 제네릭 타입이 프로토콜을 준수하도록 만들 수 있습니다. 대표적인 예로 Array는 Element가 Equatable일 때만 Equatable입니다.
extension Array where Element: Equatable {
func allEqual(to x: Element) -> Bool {
allSatisfy { $0 == x }
}
}내장 예시
표준 라이브러리에서도 이미 이를 사용합니다. [Int]는 Int가 Equatable이므로 Equatable입니다. 두 배열은 요소별로 비교하여 같은지 확인합니다.
let a = [1, 2, 3]
let b = [1, 2, 3]
print(a == b)조건부 준수 선언하기
where 절을 사용하여 프로토콜 준수를 추가하는 확장을 작성합니다. 여기서 래퍼는 해당 값의 타입도 Equatable일 때만 Equatable을 준수합니다.
struct Pair<T> {
let first: T
let second: T
}
extension Pair: Equatable where T: Equatable {
static func == (l: Pair, r: Pair) -> Bool {
l.first == r.first && l.second == r.second
}
}
print(Pair(first: 1, second: 2) == Pair(first: 1, second: 2))제약 조건이 중요한 이유
제약 조건이 없으면 래핑된 값을 비교하려면 값 자체를 비교할 수 있어야 하므로 컴파일러가 ==를 자동으로 생성할 수 없습니다. where 절이 바로 그 보장을 제공합니다.
struct Box<T> { let value: T }
extension Box: Equatable where T: Equatable {}
print(Box(value: "hi") == Box(value: "hi"))
print(Box(value: 5) == Box(value: 9))조건부 인코딩·디코딩 준수
Codable도 조건부로 준수하도록 만들 수 있습니다. 컨테이너의 요소가 인코딩 가능할 때만 컨테이너도 인코딩할 수 있습니다.
struct Wrapper<T> { let payload: T }
extension Wrapper: Codable where T: Codable {}
let w = Wrapper(payload: 42)
let data = try! JSONEncoder().encode(w)
print(String(data: data, encoding: .utf8)!)여러 제약 조건
where 절에는 쉼표로 구분하여 여러 요구 사항을 나열할 수 있습니다.
struct Stack<T> { var items: [T] = [] }
extension Stack where T: Comparable {
func maxItem() -> T? { items.max() }
}
var s = Stack<Int>()
s.items = [3, 9, 1]
print(s.maxItem()!)조건부 CustomStringConvertible
내용을 출력할 수 있을 때만 타입도 출력할 수 있도록 만들고, 요소로부터 설명을 조합합니다.
struct Labeled<T> { let label: String; let value: T }
extension Labeled: CustomStringConvertible where T: CustomStringConvertible {
var description: String { label + ": " + value.description }
}
print(Labeled(label: "Age", value: 30))중첩된 조건부 준수
조건부 준수는 조합할 수 있습니다. Int의 배열을 다시 배열로 감싼 타입이 Equatable인 것은 각 계층에서 제약 조건이 이어지기 때문입니다.
let grid1 = [[1, 2], [3, 4]]
let grid2 = [[1, 2], [3, 4]]
print(grid1 == grid2)다른 프로토콜로 제한하기
where 절에서 요소가 직접 정의한 프로토콜을 준수하도록 요구할 수 있으며, 그러면 해당 프로토콜을 기반으로 한 동작을 사용할 수 있습니다.
protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }
extension Array where Element: Priced {
var totalPrice: Double { reduce(0) { $0 + $1.price } }
}
print([Item(price: 1.5), Item(price: 2.5)].totalPrice)동일 타입 제약 조건
==를 사용하면 연관 타입을 특정 타입으로 제한할 수 있습니다. 여기서 메서드는 String 배열에만 적용됩니다.
extension Array where Element == String {
func joinedUpper() -> String {
map { $0.uppercased() }.joined(separator: "-")
}
}
print(["a", "b", "c"].joinedUpper())컴파일러가 이를 사용하는 방식
조건부 준수를 사용하면 컴파일러가 프로토콜의 기능이 유효한 경우에만 정확히 부여하므로, 제네릭 코드를 안전하면서도 최대한 재사용 가능하게 유지할 수 있습니다.
struct Optional2<T> { let value: T? }
extension Optional2: Equatable where T: Equatable {
static func == (l: Optional2, r: Optional2) -> Bool { l.value == r.value }
}
print(Optional2(value: 1) == Optional2(value: 1))빠른 확인
조건부 프로토콜 준수에 대한 이해도를 확인해 보십시오.
복습
조건부 프로토콜 준수는 extension Type: Protocol where ...를 사용하여 타입 매개변수가 제약 조건을 충족할 때만 준수를 부여합니다. Equatable, Codable, CustomStringConvertible에 적용하는 방법과 프로토콜 제약 조건, 동일 타입 제약 조건(==), 중첩을 살펴보았습니다. 이를 통해 제네릭 타입을 안전하고 재사용 가능하게 유지할 수 있습니다.
자주 묻는 질문
“조건부 적합성” 강의는 무료인가요?
네 — “조건부 적합성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“조건부 적합성”에서 뭘 배우나요?
제약 조건을 충족할 때만 제네릭 형식이 프로토콜을 따르게 합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Swift Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“조건부 적합성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 계약으로서의 프로토콜
- 확장의 기본 구현
- 프로토콜 조합
- 조건부 적합성