학습
Swift 프로토콜(Protocol) 개념
Swift 프로토콜(Protocol) 개념 — 초급
프로토콜(Protocol) 개념
1. 도입 (왜 배워야 하는가)
Swift에서 프로토콜은 객체 지향 프로그래밍의 중요한 구성 요소입니다. 프로토콜을 정의함으로써, 여러 클래스나 구조체가 공통적으로 따라야 할 규칙을 설정할 수 있습니다. 이는 코드의 재사용성을 높이고, 다양한 객체 간의 일관성을 유지하는 데 큰 도움이 됩니다.
프로토콜을 모르면 다음과 같은 문제가 발생할 수 있습니다:
- 코드 중복이 발생하여 유지보수가 어려워집니다.
- 객체 간의 관계를 명확히 할 수 없어, 협업 시 혼란이 생길 수 있습니다.
- 의도한 기능이 제대로 작동하지 않을 위험이 있습니다.
2. 핵심 개념 설명
프로토콜은 특정 메서드, 프로퍼티, 그리고 기타 요구 사항을 정의하는 청사진입니다. 예를 들어, "운전 가능한" 차량을 생각해보세요. 모든 차량은 '운전'이라는 공통된 기능을 가져야 하며, 이를 프로토콜로 정의할 수 있습니다.
| 용어 | 설명 |
|---|---|
| 프로토콜 | 메서드, 프로퍼티 등의 규칙을 정의하는 청사진 |
| 채택 | 클래스, 구조체가 프로토콜을 구현하는 것 |
| 확장 | 기존 프로토콜에 새로운 기능을 추가하는 것 |
3. 기본 코드 예제
아래는 프로토콜을 정의하고 이를 채택하는 간단한 예제입니다.
// 프로토콜 정의
protocol Drivable {
var speed: Int { get set }
func drive()
}
// 프로토콜 채택
class Car: Drivable {
var speed: Int = 0
func drive() {
print("차가 시속 \(speed)로 주행 중입니다.")
}
}
// Car 객체 생성 및 사용
let myCar = Car()
myCar.speed = 60
myCar.drive()
실행 결과
차가 시속 60로 주행 중입니다.
코드 한 줄씩 동작 설명
protocol Drivable: Drivable이라는 프로토콜을 정의합니다.var speed: Int { get set }: 속도 속성을 정의합니다. 읽기/쓰기 가능해야 합니다.func drive(): 차량이 주행하는 메서드를 정의합니다.class Car: Drivable: Car 클래스가 Drivable 프로토콜을 채택합니다.var speed: Int = 0: 기본 속도를 설정합니다.func drive() {...}: 메서드를 구현하여 차량의 속도를 출력합니다.let myCar = Car(): Car 객체를 생성합니다.myCar.speed = 60: 속도를 60으로 설정합니다.myCar.drive(): drive() 메서드를 호출하여 차량의 주행 상태를 출력합니다.- 프로토콜을 정의하지 않고 구현
- 프로토콜의 요구사항을 구현하지 않음
- 프로토콜은 코드의 일관성과 재사용성을 높이는 데 필수적입니다.
- 프로토콜을 통해 객체 간의 관계를 명확히 할 수 있습니다.
- 프로토콜은 메서드와 프로퍼티를 명세하며, 이를 구현하는 객체는 해당 규칙을 따라야 합니다.
- 다음에 학습하면 좋은 주제: 프로토콜 익스텐션(Protocol Extension), 클로저(Closure), 제네릭(Generics).
4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니를 구현할 때
장바구니에 담긴 상품들이 공통적으로 가져야 할 속성이나 메서드를 프로토콜로 정의할 수 있습니다.
protocol Purchasable {
var price: Double { get }
func purchase()
}
class Product: Purchasable {
var price: Double
var name: String
init(name: String, price: Double) {
self.name = name
self.price = price
}
func purchase() {
print("\(name) 상품을 구매했습니다. 가격: \(price)원")
}
}
let item = Product(name: "사과", price: 1000)
item.purchase()
예제 2: 게임 캐릭터를 구현할 때
게임에서 모든 캐릭터가 따라야 할 행동을 프로토콜로 정의할 수 있습니다.
protocol Character {
var name: String { get }
func attack()
}
class Warrior: Character {
var name: String
init(name: String) {
self.name = name
}
func attack() {
print("\(name)이 공격했습니다!")
}
}
let hero = Warrior(name: "전사")
hero.attack()
5. 흔한 실수와 주의사항
- 잘못된 코드:
class Car {
var speed: Int = 0
func drive() {
print("차가 주행 중입니다.")
}
}
- 올바른 코드:
protocol Drivable {
var speed: Int { get set }
func drive()
}
- 잘못된 코드:
class Car: Drivable {
var speed: Int = 0
// drive() 메서드를 구현하지 않음
}
- 올바른 코드:
class Car: Drivable {
var speed: Int = 0
func drive() {
print("차가 주행 중입니다.")
}
}