티스토리 뷰
Opaque Types
불투명 타입
Opaque 반환 타입을 가진 함수, 메서드는 자신의 반환타입 정보를 외부에 숨길 수 있습니다. 일반적인 반환타입 처럼 명확한 반환 타입을 외부에 제공하는 대신 말이지요.
// OpaqueType 사용 예시, 반환타입은 Shape 프로토콜을 채택한 어떠한 타입이던 될 수 있습니다.
// -> 즉, 말 그대로 불투명한 타입(Opaque Type)입니다.
func flip<T: Shape>(_ shape: T) -> some Shape {
return FlippedShape(shape: shape)
}
반환타입을 숨기는 것은 모듈로 호출되는 코드와 모듈 사이에서 유용하게 사용되어질 수 있습니다.그 이유는 반환타입에 의존하는 타입은 private으로 유지될 수도 있기 때문입니다.
반환할때 일반적인 반환타입이 프로토콜 타입을 반환해야한다면, 그와 다르게 opaque타입은 타입의 정체를 유지합니다. - 컴파일러는 타입 정보에 접근할 수 있지만, 모듈의 클라이언트는 그럴 수 없습니다.
The Problem That Opaque Types Solve
Opaque 타입이 해결할 수 있는 문제
opaque타입의 장점을 알아보도록 하겠습니다. 예를들면, 만약 ASCII 문자로 그림을 그려주는 모듈을 당신이 작성한다고 가정해봅니다. ASCII로 형상 아트를 그릴때의 특징은 draw() 메서드를 가진다는 것입니다. draw() 메서드는 ASCII로 그린 형상을 String 타입으로 반환해줍니다. 이 내용은 Shape라는 프로토콜 내부에 구현되어있습니다.
Shape 프로토콜을 준수하고 있은 Triangle 구조체는 계단 모양의 별찍기를 수행하고 있습니다. 별찍기를 수행하는 draw메서드는 String 타입을 반환하고 있습니다. 이 때 반환되는 String 타입은 명확한 타입으로, 일반적인 반환형태라고 볼 수 있습니다.
그려진 형상을 위아래로 뒤집는 등의 연산을 수행하기 위해 제네릭(generic)을 사용할 수도 있습니다. 그 예시는 아래와 같습니다. 하지만, 아래의 코드는 접근 상의 중요한 제약이 존재합니다. 뒤집어진 결과(FlippedShape)는 만들어진 그 자체 그대로 명확한 제네릭 타입으로서 외부에 노출이 됩니다.
다른 예시를 이어서 보겠습니다.
아래코드와 같이 JoinedShape<T: Shape, U: Shape> 구조로 정의되는 접근은 수직으로 두개의 모양을 묶습니다. 결과적으로, JoiunedShape<FlippedShape<Triangle>, Triangle>과 같은 타입으로 일반 삼각형과 뒤집은 삼각형을 연결해줍니다.
상수타입의 joinedTriangles에 할당되는 JoinedShape는 Shape 프로토콜을 준수하는 두개의 일반삼각형, 뒤집힌삼각형 타입을 받아 생성되는 구조체입니다. 그 결과는 위 사진 하단 주석과 같습니다.
그려진 형상(shape) 결과에 대한 자세한 정보를 노출하는 위와 같은 일반적인 반환타입 사용은 단순 ASCII 아트 모듈의 공개 인터페이스가 아닐수도 있다는 문제가 있습니다. 왜냐하면 완전한 반환타입을 선언할 필요가 있기 때문입니다.
모듈 안에 있는 코드는 다양한 방식으로 구성이 될 수 있습니다. 이러한 내부 변환내용들에 대한 상세내용을 외부에 설명할 필요가 없습니다. JoinedShape, FlippdShape와 같은 래퍼타입들은 외부의 모듈 사용자들에게는 중요하지 않고, 노출될 필요도 없습니다. 모듈의 공개 인터페이스는 다양한 모양을 연결하고, 뒤집는 등의 연산으로 구성이 되고, 이러한 연산들의 결과로 또다른 Shape 값을 반환하게 됩니다.
이처럼 외부에 노출할 필요없는 타입들에 대해서 명확한 반환타입을 명시하지 않고 외부에 노출하지 않는 방법을 OpaqueType에서 찾을 수 있습니다.
OpaqueType은 iOS13버전에서 공개되었습니다.
다음 포스팅에서는 OpaqueType의 실제 사용 및 이로인해 얻을 수 있는 장점에 대해서 알아보겠습니다. 🤗
'iOS 개발 > 개발자문서 정보' 카테고리의 다른 글
Swift 문법, Extension 확장 역할 및 사용방법 (0) | 2020.07.21 |
---|---|
Swift 문법 Error Handling, 에러처리 특징 및 사용법 (0) | 2020.07.20 |
Swift switch문 예약어, fallthrough 알아보기 (2) | 2020.07.18 |
Swift 문법 Closure 1) 일급객체, 클로져 알아보기 (0) | 2020.07.17 |
스위프트 문법, 메모리 해제 간 소멸자 Deinit 동작방식 (1) | 2020.07.16 |
- Total
- Today
- Yesterday
- Protocol
- swift문제
- 프로그래머스swift
- 부스트코스
- Collection
- ios
- createML
- 자연어처리
- 개발자문서
- swift 기초
- 김프매매
- 알고리즘문제
- swift 문자열
- swift언어
- swift reduce
- 알고리즘
- 프로그래머스
- CoreML
- uikit
- 컬렉션
- swift
- 스위프트
- publisher
- swift알고리즘
- 백준swift
- 프로토콜
- 백준알고리즘
- swift string
- Swift 알고리즘
- SwiftUI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |