3월 12일 TIL (프로토콜)

이승원·2024년 3월 12일
0

TIL

목록 보기
39/75
post-thumbnail

프로토콜 (Protocol)

  • 메서드, 속성 및 기타 요구사항의 청사진 (blueprint)를 정의하여 클래스, 구조체 또는 열거형에서 구현할 수 있는 일종의 인터페이스이다.
  • Class, Structure, Enum 이 Protocol를 채택하고, 모든 요구사항을 충족하면 Protocol를 준수헀다고 한다.
  • 프로토콜은 설계된 조건만 정의를 하고 실제로 기능을 구현하지는 않는다.
  • 프로퍼티는 항상 var 를 사용한다.
  • 프로토콜은 다중 상속이 가능하다.
protocol 프로토콜 {
	var 프로퍼티 : 타입 { get set } 
    // get 혹은 set를 요규하는 속성을 구현해야 한다
    // 여기 명시되어 있는건 최소 요구 사항이다. 
}

class 클래스 : 부모클래스, 프로토콜1, 프로토콜2.. {

}

protocol Vehicle {
	var speed : Double {get set}
    var manufacturer : String { get } // 읽기 전용 속성
}

class Car : Vehicle{
	var speed : Double = 0.0
    var manufacturer : String = "To"
}

AssociatedType , Typealias

  • AssociatedType 은 프로토콜 내에서 실제 타입을 명시하지 않고, 해당 프로토콜을 채택하는 타입에서 실제 타입을 결정하도록 하는데 사용된다.
  • AssociatedType 뒤에 있는 단어는 연관 타입이라고 하며, 해당 프로토콜을 채택하는 struct든 Class 는 해당 연관타입을 하나로 정해서 사용해야 한다.
  • Typealias 는 타입의 이름을 다른이름으로도 사용할 수 있게끔 해주는 것이다.
protocol Container {
    associatedtype Item // 연관 타입
    var count: Int { get }
    mutating func append(_ item: Item)
    func item(at index: Int) -> Item
}

struct IntContainer: Container {
    typealias Item = Int // 연관 타입을 Int로 typealias하여 구현
    var items = [Int]()
    
    var count: Int {
        return items.count
    }
    
    mutating func append(_ item: Int) {
        items.append(item)
    }
    
    func item(at index: Int) -> Int {
        return items[index]
    }
}

var intBox = IntContainer()
intBox.append(5)
intBox.append(10)
print(intBox.item(at: 0)) // 출력: 5
// protocol에서 명시된 associatedType Item을 Int로 typealias를 통해 Int 타입을 갖게 되고, Item = Int 라고 생각하고 사용하면 된다. 
// mutating func append (_ item: Int) 보면 프로토콜에서는 Item 타입으로 인자를 받지만, Int로 받아도 오류가 나지 않는다. 
profile
개발자 (진)

0개의 댓글