Generic vs Opaque Type

Minseok, Kim·2022년 4월 12일
0

Generic

Generic 코드

func max<T>(_ x: T, _ y: T) -> T where T: Comparable { ... }

Gerneric을 사용한 코드에서 Type이 선택되는 때는 언제일까?

다음 함수를 Call한다고 할 때
Caller는 x, y의 Type을 선택하게 된다.
즉, Caller가 Type을 선택하게 된다.

함수가 Call될때 Type이 선택되기 때문에,
함수는 Call되기 전까지 GenericType TComparable을 준수하는 Type이란 것을 제외하고는 아무것도 모른다.
즉, parameter의 Type에 대응하기 위해서, 해당 함수의 구현부는 추상적으로 작성되어야 한다.

Opaque Type

Opaque Type 코드

struct Square: Shape {
    var size: Int
    func draw() -> String {
        let line = String(repeating: "*", count: size)
        let result = Array<String>(repeating: line, count: size)
        return result.joined(separator: "\n")
    }
}

func makeTrapezoid() -> some Shape {
    let top = Triangle(size: 2)
    let middle = Square(size: 2)
    let bottom = FlippedShape(shape: top)
    let trapezoid = JoinedShape(
        top: top,
        bottom: JoinedShape(top: middle, bottom: bottom)
    )
    return trapezoid
}
let trapezoid = makeTrapezoid()
print(trapezoid.draw())

Opaque를 사용한 코드에서 Type이 선택되는 때는 언제일까?

함수의 구현부를 살펴보면
구체적인 Type을 생성한 후에 return하게 된다.
즉, 함수 구현부가 Type을 선택하게 된다.

함수 구현부에서 Type이 선택되기 때문에,
함수의 Caller는 return되는 값이 Shape protocol을 준수한다는 것을 제외하고는 아무것도 모른다.
즉, 함수의 return type에 대응하기 위해서, 해당 함수의 Caller는 추상적으로 작성되어야 한다.


정리

위의 내용들을 정리하면 다음과 같다.

Type이 선택되는 곳.

  • Generic: 함수 호출자가 Type을 선택.
  • Opaque: 함수 구현부가 Type을 선택.

추상적으로 작성되어야 하는 곳

  • Generic: 함수 구현부.
  • Opaque: 함수 호출자.

혹시 눈치를 챘을 수도 있지만,
Opaque Type은 Generic과 반대의 성격을 가지고 있는 것을 볼 수 있다.
때문에 Opaque Type을 Reverse Generic이라고도 부른다.


참고자료

https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.html

profile
iOS, Swift Dev

0개의 댓글