관리 메뉴

스윞한 개발자

Swift 기초문법 - 프로토콜 본문

Swift 이론

Swift 기초문법 - 프로토콜

스윞남 2024. 1. 23. 14:46
728x90
반응형
SMALL

이번 포스팅은 프로토콜에 대해 자세히 알아보겠습니다!

 

프로토콜이란 ? 

* 설계하고 설계대로 만드는 방법

 

프로토콜은 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은 제네릭을 사용하여 유연성을 제공하고, 프로토콜을 다양한 타입에 대해 일반화 할 수 있게 합니다.

연관 타입을 사용하면 프로토콜을 구현하는 타입에 따라 다른 타입을 지정할 수 있으므로, 타입 안정성과 재사용성을 높일 수 있습니다.

* 프로토콜에서 제네릭 형태의 타입을 가질 수 있게 할수 있습니다.

728x90
반응형
LIST