관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 3. 추상화 - 프로토콜에 제네릭스 사용하는 추상화 이해하기 본문

iOS 응용 (swift)

[iOS - swift] 3. 추상화 - 프로토콜에 제네릭스 사용하는 추상화 이해하기

jake-kim 2024. 2. 1. 01:42

* 추상화하기 목차: https://ios-development.tistory.com/1627

프로토콜과 제네릭스 사용하는 목적 파악하기

  • 프로토콜 사용 목적?
    • protocol을 타입(existential type)으로하고 구현체를 assign하는 패턴으로하면 구현체의 변경할 때 유연성이 증가
    • 구현체에는 여러 구현 코드가 섞여서 정말 사용하는쪽에서만 필요한 인터페이스만 보려면 가독성이 떨어지지만 protocol을 타입으로한다면 사용하는 쪽에서 필요한 스펙 파악이 용이
  • 제네릭스 사용 목적
    • 코드의 재사용성
    • 중복 제거

포로토콜에 제네릭스 사용의 이해

  • 프로토콜에는 associated type 키워드를 사용하여 제네릭스 사용이 가능

ex) cell타입을 추상화하기 위해서 protocol을 사용했고 이 protocol에는 Cell에서 필요한 데이터 타입인 D를 정의

(전체 코드는 이전 포스팅 글 참고)

protocol TableViewCellable where Self: UITableViewCell {
    associatedtype D
    
    func configure(_ value: D)
}
  • 프로토콜과 제네릭스 사용에 관한 이해
    • 프로토콜에 대한 타입을 사용한다면 그 타입을 conform하는 별도의 타입을 정의해야함
    • 제네릭스를 사용한다면 그 타입을 conform하는 별도의 타입이 불필요
    • 즉 요구사항에 맞추어서 사용하는쪽에서 특정 기능을 구현해야하는 경우는 protocol로 추상화하고, 특정 요구사항 없이 단순히 추상화하고 싶은경우 제네릭스로 표현하는 것

cf) 제네릭스도 프로토콜처럼 특정 타입만 가능하다는 Type Constraint는 가능

// Type Constraint 예시
// 코드 출처: https://docs.swift.org/swift-book/documentation/the-swift-programming-language/generics/#Type-Constraint-Syntax

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
    // function body goes here
}

 

예를 통해서 protocol + generics 이해하기

protocol TableViewCellable where Self: UITableViewCell {
    associatedtype D
    
    func configure(_ value: D)
}
  • protocol 추상화
    • 커스텀 셀에서는 항상 configure를 통해 데이터를 갱신해주는 메서드가 있어야하므로 사용하는쪽에 configure 메서드를 강제화시키는 추상화가 필요하므로 protocol을 사용 
  • protocol에 generics를 사용하여 추상화
    • associatedtype으로 데이터 타입을 추상화했는데, 사용하는쪽에서 데이터 타입을 사용할때 특별한 제약사항이 없어도 되므로 제네릭스로 선언한 것
protocol TableViewCellable where Self: UITableViewCell {
    associatedtype D
    
    func configure(_ value: D)
}
  • protocol과 generics 사용 정리
    • protocol 추상화: 사용하는쪽에서 특별한 제약사항이나 필수 기능을 가지고 있어야하는 경우
    • generics 추상화: 사용하는쪽에서 특별한 제약사항 없이 단순히 타입만 나타내고 싶은 경우

* 참고

- https://docs.swift.org/swift-book/documentation/the-swift-programming-language/generics/#Type-Constraint-Syntax

Comments