학습
Swift 프로토콜(Protocol) 심화
Swift 프로토콜(Protocol) 심화 — 중급
프로토콜(Protocol) 심화
1. 도입 (왜 배워야 하는가)
Swift에서 프로토콜은 객체지향 프로그래밍의 중요한 구성 요소로, 특정 기능을 요구하거나 정의하는 계약서와 같은 역할을 합니다. 프로토콜을 효과적으로 사용하는 것은 코드의 재사용성을 높이고, 서로 다른 클래스나 구조체 간의 일관성을 유지하는 데 필수적입니다.
프로토콜을 잘 활용하지 않으면 다음과 같은 문제가 발생할 수 있습니다:
- 중복 코드: 동일한 기능을 가진 여러 클래스를 작성하면서 동일한 코드를 반복하게 됩니다.
- 유지보수 어려움: 코드 변경 시 여러 곳에서 수정해야 하므로 실수가 발생할 확률이 높습니다.
- 유연성 저하: 객체 간의 관계가 느슨하게 결합되지 않아 새로운 기능 추가가 어렵습니다.
2. 핵심 개념 설명
프로토콜 정의
프로토콜은 특정 속성이나 메서드를 정의하는 청사진입니다. 이를 통해 클래스나 구조체가 특정 기능을 구현하도록 강제할 수 있습니다.
실생활 비유
프로토콜은 일종의 규칙서입니다. 예를 들어, '운전면허증'을 비유할 수 있습니다. 운전면허증을 가진 사람은 특정 시험을 통과해야만 합니다. 이와 마찬가지로, 프로토콜을 준수하는 클래스는 반드시 그 프로토콜에서 요구하는 메서드나 속성을 구현해야 합니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 프로토콜 | 특정 기능을 요구하는 계약서 |
| 준수 | 클래스를 통해 프로토콜에서 정의한 기능을 구현 |
| 확장(Extension) | 기존 타입에 새로운 기능을 추가하는 방법 |
3. 기본 코드 예제
아래 예제는 '운전 가능한' 프로토콜을 정의하고, 이를 준수하는 클래스를 보여줍니다.
protocol Drivable {
var speed: Double { get set }
func drive()
}
class Car: Drivable {
var speed: Double = 0.0
func drive() {
print("자동차가 시속 \(speed)로 주행 중입니다.")
}
}
let myCar = Car()
myCar.speed = 60.0
myCar.drive()
자동차가 시속 60.0로 주행 중입니다.
- protocol Drivable: '운전 가능한' 프로토콜을 정의합니다.
- var speed: Double { get set }: 속도를 설정하고 가져올 수 있는 속성을 정의합니다.
- func drive(): 자동차가 주행하는 기능을 요구합니다.
- class Car: Drivable: Car 클래스가 Drivable 프로토콜을 준수함을 나타냅니다.
- myCar.speed = 60.0: myCar 객체의 속도를 설정합니다.
- myCar.drive(): drive 메서드를 호출하여 속도에 따라 주행 메시지를 출력합니다.
4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니 구현
쇼핑몰 애플리케이션에서 장바구니에 담을 수 있는 상품을 정의하는 프로토콜을 만들 수 있습니다.
protocol CartItem {
var name: String { get }
var price: Double { get }
}
class Product: CartItem {
var name: String
var price: Double
init(name: String, price: Double) {
self.name = name
self.price = price
}
}
let item = Product(name: "노트북", price: 1200.0)
print("장바구니에 \(item.name) 추가, 가격: \(item.price) 원")
예제 2: 게임 캐릭터 행동 정의
게임에서 캐릭터의 행동을 정의하는 프로토콜을 만들 수 있습니다.
protocol Character {
func attack()
func defend()
}
class Warrior: Character {
func attack() {
print("전사가 공격합니다!")
}
func defend() {
print("전사가 방어합니다!")
}
}
let warrior = Warrior()
warrior.attack()
warrior.defend()
5. 흔한 실수와 주의사항
실수 1: 프로토콜을 준수하지 않음
protocol Vehicle {
func start()
}
class Bike: Vehicle {
// func start() {} // 이 줄이 주석 처리되어 있으면 오류 발생
}
올바른 코드:
class Bike: Vehicle {
func start() {
print("자전거가 출발합니다.")
}
}
실수 2: 프로토콜 속성에 잘못된 접근
protocol Animal {
var name: String { get }
}
class Dog: Animal {
var name: String { return "강아지" }
// var name: String = "강아지" // 오류 발생: 읽기 전용 속성이므로
}
올바른 코드:
class Dog: Animal {
var name: String { return "강아지" }
}