일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- async
- MVVM
- 학과별커뮤니티
- struct
- ios
- 동시성
- 스트럭트
- collectionview
- Optional
- 구름톤 유니브
- 옵셔널
- CS
- mvc
- Kingfisher
- 세종대학교
- 프로토콜
- 앱개발
- 반응형
- GCD
- swift
- 대표
- RxSwift
- WeatherKit
- 네트워크
- 실습
- 이론
- uikit
- SwiftUI
- 기초문법
- 토이프로젝트
- Today
- Total
스윞한 개발자
Swift 기초문법 - 프로토콜 본문
이번 포스팅은 프로토콜에 대해 자세히 알아보겠습니다!

프로토콜이란 ?
* 설계하고 설계대로 만드는 방법
프로토콜은 Swift에서 인터페이스를 정의하는 방법입니다. (약속)
명명 규칙 > 일반적으로(##able, ##delegate, ##ing 등)
프로토콜은 특정 역할을 수행하기 위해 필요한 메서드, 프로퍼티, 이니셜라이저 등의 요구사항을 정의합니다.
클래스, 구조체, 열거형은 프로토콜을 채택하여 프로토콜에 정의된 요구사항을 구현할 수 있습니다.
- 특징
1. 요구사항 정의 :
프로토콜은 특정 역할을 수행하기 위해 필요한 메서드, 프로퍼티, 이니셜라이저 등의 요구사항을 정의합니다. 프로토콜은 선언만 하고 구현하지 않습니다.
// 프로토콜 정의
protocol Vehicle {
var numberOfWheels: Int { get }
func drive()
}
2. 채택(Adopting) :
클래스, 구조체, 열거형은 프로토콜을 채택하여 프로토콜에 정의된 요구사항을 구현할 수 있습니다. 채택한 타입은 프로토콜의 요구사항을 모두 충족해야 합니다.
// 클래스가 프로토콜을 채택
class Car: Vehicle {
var numberOfWheels: Int = 4
func drive() {
print("Car is driving!")
}
}
>> // 구조체가 프로토콜을 채택
struct Bicycle: Vehicle {
var numberOfWheels: Int = 2
func drive() {
print("Bicycle is pedaling!")
}}
3. 다중 프로토콜 채택 :
하나의 타입은 여러 개의 프로토콜을 동시에 채택할 수 있습니다. > "다중 프로토콜 채택"
// 프로토콜 타입을 사용
let vehicle1: Vehicle = Car()
let vehicle2: Vehicle = Bicycle()
vehicle1.drive() // 출력: "Car is driving!"
vehicle2.drive() // 출력: "Bicycle is pedaling!"
구조체, 열거형, 클래스 등에서 프로토콜을 사용할때는 프로토콜에서 정의한 변수, 함수를 따라야합니다.
하지 않을경우 > 에러 발생
- 프로토콜 상속
스위프트에서는 프로토콜 상속(Protocol Inheritance)을 통해 하나 이상의 프로토콜을 상속받을 수 있습니다.
프로토콜 상속을 사용하면 다른 프로토콜의 요구사항을 상속하고, 추가적인 요구사항을 정의할 수 있습니다.
protocol ProtocolA {
// ProtocolA에 정의된 요구사항
}
protocol ProtocolB: ProtocolA {
// ProtocolA를 상속한 ProtocolB에 정의된 요구사항
}
protocol ProtocolC: ProtocolA, ProtocolB {
// ProtocolA와 ProtocolB를 상속한 ProtocolC에 정의된 요구사항
}
위의 예시에서 ProtocolB는 ProtocolA를 상속받았으며, "C는 A,B를 상속받았습니다.
프로토콜 상속을 사용하여 기존 프로토콜의 요구사항을 확장하거나 추가적인 요구사항을 정의할 수 있습니다.
protocol Printable {
func print()
}
protocol PrintableWithPrefix: Printable {
var prefix: String { get }
}
struct MyStruct: PrintableWithPrefix {
var prefix: String = "Prefix:"
func print() {
Swift.print("\(prefix) Printing...")
}}
- 프로토콜 확장
Swift에서 프로토콜 확장을 사용하면 기존 프로토콜에 새로운 기능을 추가할 수 있습니다.
프로토콜 확장은 기존 프로토콜을 채택한 모든 타입에 대해 확장이 적용되므로, 기존 타입을 수정하지 않고도 기능을 추가할 수 있습니다.
protocol MyProtocol {
// 프로토콜 요구사항
}
extension MyProtocol {
// 추가 기능 구현
}
MyProtocol은 프로토콜을 정의하고, extension 키워드를 사용하여 프로토콜 확장을 정의합니다.
extension 블록 내에서는 기존 프로토콜에 없는 메서드, 프로퍼티, 서브스크립트 등의 추가 기능을 구현할 수 있습니다.
protocol Printable {
func print()
}
extension Printable {
func print() {
Swift.print("Printing...")
}
func printTwice() {
print()
print()
}}
struct MyStruct: Printable {}
let myInstance = MyStruct()
myInstance.print() // 출력: "Printing..."
myInstance.printTwice() // 출력: "Printing..." (두 번 출력)
프로토콜 확장은 기존 타입에 기능을 추가하는 데 사용되며, 코드의 재사용성과 확장성을 높여줍니다.
기능을 중복 구현하지 않고 다양한 타입에 일관된 기능을 제공하는 데 도움이 됩니다.
- 프로토콜 associatedType
Swift에서 프로토콜의 'associatedType'은 프로토콜에서 사용되는 연관타입을 선언하는 데 사용됩니다.
연관 타입은 프로토콜 내에서 사용되는 일종의 플레이스홀더로, 실제 구현하는 타입에 따라 결정됩니다.
연관 타입은 제네릭과 비슷한 개념이지만, 특정한 타입이 아닌 다양한 타입을 지원합니다.
'associatedType'을 사용하여 프로토콜 내에서 일반화된 타입을 지정할 수 있으며, 이를 구현하는 각 타입은 자신만의 실제 타입을 할당할 수 있습니다.
protocol MyProtocol {
associatedtype MyType
// 연관 타입 선언
// MyType은 실제 구현하는 타입에 따라 결정됨
}
MyProtocol은 associatedtype인 MyType을 선언합니다.
구현 타입에서 associatedtype을 실제타입으로 지정하기 위해서는 typealias 키워드를 사용합니다.
struct MyStruct: MyProtocol {
typealias MyType = Int
// MyType을 Int로 지정
}
class MyClass: MyProtocol {
typealias MyType = String
// MyType을 String으로 지정
}
associatedType은 제네릭을 사용하여 유연성을 제공하고, 프로토콜을 다양한 타입에 대해 일반화 할 수 있게 합니다.
연관 타입을 사용하면 프로토콜을 구현하는 타입에 따라 다른 타입을 지정할 수 있으므로, 타입 안정성과 재사용성을 높일 수 있습니다.
* 프로토콜에서 제네릭 형태의 타입을 가질 수 있게 할수 있습니다.
'Swift 이론' 카테고리의 다른 글
Swift 기초 문법 - 고차함수 Higher Order Functions (0) | 2024.01.23 |
---|---|
Swift 기초 문법 - 별칭/typealias, Set (0) | 2024.01.23 |
Swift 기초문법 - 스트럭트 mutating/메서드 (0) | 2024.01.23 |
Swift 기초문법 - 에러 (0) | 2024.01.23 |
Swift 기초문법 - 파이널 클래스 (2) | 2024.01.23 |