0Pricing
Swift Academy · 강의

프로토콜 기반 추상화

구체적인 형식이 아니라 프로토콜에 의존합니다.

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

프로토콜 기반 추상화

구체적인 타입 대신 프로토콜을 주입하면 구현을 자유롭게 바꿔 끼울 수 있습니다. 사용하는 쪽은 클래스가 아니라 동작에만 의존합니다.

프로토콜 정의하기

기능을 프로토콜로 설명하세요. 해당 프로토콜을 준수하는 모든 타입을 의존성으로 제공할 수 있습니다.

protocol Logging {
    func log(_ message: String)
}
print("Protocol describes behavior, not a concrete class.")

구체적인 타입 준수시키기

실제 구현이 프로토콜을 준수합니다. 이것이 실제 환경에서 사용하는 의존성입니다.

protocol Logging { func log(_ m: String) }
struct ConsoleLogger: Logging {
    func log(_ m: String) { print("LOG: \(m)") }
}
ConsoleLogger().log("ready")

프로토콜에 의존하기

사용하는 쪽의 프로퍼티 타입이 프로토콜이므로, 해당 프로토콜을 준수하는 어떤 값이든 전달받을 수 있습니다.

protocol Logging { func log(_ m: String) }
struct ConsoleLogger: Logging { func log(_ m: String) { print(m) } }
struct Service {
    let logger: Logging // protocol, not ConsoleLogger
    func run() { logger.log("running") }
}
Service(logger: ConsoleLogger()).run()

구현 바꿔 끼우기

타입이 프로토콜이므로 사용하는 쪽을 수정하지 않고도 다른 프로토콜 준수 구현을 전달할 수 있습니다.

protocol Logging { func log(_ m: String) }
struct Loud: Logging { func log(_ m: String) { print(m.uppercased()) } }
struct Quiet: Logging { func log(_ m: String) {} }
struct Service { let logger: Logging; func run() { logger.log("hi") } }
Service(logger: Loud()).run()
Service(logger: Quiet()).run()

인터페이스를 기준으로 프로그래밍하기

이는 "구체적인 구현이 아니라 추상화에 의존한다"는 원칙입니다. 상위 수준의 코드는 하위 수준의 세부 사항으로부터 보호됩니다.

protocol Storage { func save(_ v: Int) }
struct MemoryStore: Storage { func save(_ v: Int) { print("kept \(v)") } }
struct Manager { let store: Storage; func add() { store.save(1) } }
Manager(store: MemoryStore()).add()

여러 준수 타입

여러 타입이 같은 프로토콜을 준수할 수 있으며, 각각 네트워크, 디스크, 메모리와 같은 상황에 맞게 사용할 수 있습니다.

protocol Source { func value() -> Int }
struct Fixed: Source { func value() -> Int { 10 } }
struct Doubler: Source { func value() -> Int { 20 } }
func use(_ s: Source) { print(s.value()) }
use(Fixed())
use(Doubler())

관련 동작을 포함한 프로토콜

프로토콜은 여러 메서드를 선언하여 의존성에 대한 명확한 계약을 구성할 수 있습니다.

protocol Cache {
    func get(_ key: String) -> Int?
    func set(_ key: String, _ v: Int)
}
struct Dict: Cache {
    var store: [String: Int] = [:]
    func get(_ k: String) -> Int? { store[k] }
    mutating func set(_ k: String, _ v: Int) { store[k] = v }
}
var c = Dict(); c.set("a", 1)
print(c.get("a") ?? -1)

제네릭 제약

프로토콜을 제약 조건으로 지정한 제네릭 매개변수를 통해 주입할 수도 있으며, 이렇게 하면 존재 타입 오버헤드를 피할 수 있습니다.

protocol Greeter { func greet() -> String }
struct English: Greeter { func greet() -> String { "Hello" } }
struct Welcome<G: Greeter> {
    let greeter: G
    func show() { print(greeter.greet()) }
}
Welcome(greeter: English()).show()

안정적인 계약

프로토콜이 안정적으로 유지되는 한 구현 내부를 변경해도 사용하는 쪽을 중단시키지 않습니다.

protocol Formatter { func format(_ n: Int) -> String }
struct Plain: Formatter { func format(_ n: Int) -> String { "\(n)" } }
struct Padded: Formatter { func format(_ n: Int) -> String { String(format: "%03d", n) } }
func render(_ f: Formatter) { print(f.format(7)) }
render(Plain())
render(Padded())

모의 객체 사용의 기반

무엇보다 프로토콜을 사용하면 테스트에서 실제 구현 대신 가짜 프로토콜 준수 타입을 제공할 수 있습니다. 이것이 다음 수업의 핵심 내용입니다.

protocol Network { func fetch() -> String }
struct Real: Network { func fetch() -> String { "server data" } }
struct VM { let net: Network; func load() { print(net.fetch()) } }
VM(net: Real()).load()

빠른 확인

구체적인 클래스 대신 프로토콜 타입을 주입하는 이유는 무엇인가요?

복습

프로토콜을 주입하면 구체적인 타입을 추상화할 수 있으므로 어떤 준수 타입이든 대신 사용할 수 있습니다. 이는 "추상화에 의존한다"는 원칙을 따르며, 대체 구현과 중요한 테스트 대역을 사용할 수 있게 합니다. 다음은 테스트에서 의존성을 모의하는 방법입니다.

자주 묻는 질문

“프로토콜 기반 추상화” 강의는 무료인가요?

네 — “프로토콜 기반 추상화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 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(으)로 돌아가기