Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- clean architecture
- 리펙터링
- combine
- Human interface guide
- 리팩토링
- RxCocoa
- UITextView
- uiscrollview
- Xcode
- 애니메이션
- Observable
- Refactoring
- swift documentation
- uitableview
- tableView
- UICollectionView
- 스위프트
- collectionview
- Protocol
- map
- SWIFT
- 클린 코드
- 리펙토링
- Clean Code
- swiftUI
- rxswift
- ios
- HIG
- MVVM
- ribs
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 1. 추상화 - 개념과 목적 본문
* 추상화하기 목차: https://ios-development.tistory.com/1627
추상화란?
- 복잡성을 숨기고 필요한 부분만을 노출시키는 것
- 특정한 타입에 의존하지 않고 일반화하여 작성 > 코드의 유연성과 재사용성 상승
추상화의 목적
- 추상화한다는 것은 일종의 DIP(Dependency Inversion Principle)의 목적과도 유사
- DIP는 구현체에 의존하지 않고 인터페이스(protocol)에 의존하게끔하여, 구현체의 변경이 유연하게 가져갈 수 있다는 개념
- DIP 구체적인 개념은 이전 포스팅 글 참고
- 코드의 유연성, 재사용성 상승
추상화의 종류
- generics 사용
- 커스텀 뷰를 만들 때 Generics를 사용하여 값을 표현
class GenericInputView<T>: UIView {
var value: T? // 입력된 값
..
}
- porotocol 사용
- 버튼을 커스텀한 MyButton이 있고 이를 사용하는 곳에서는 MyButton 그대로 의존하지 않고 필요한 기능들을 protocol로 만들어서 MyButton을 사용하는쪽에서는 protocol을 의존하도록 설정
- (주의사항 - 아래처럼 사용하는 경우 ButtonProtocol을 Existential type이라고 하는데, dynamic dispatch가 발생하므로 성능에 민감한 부분에서는 지양할것)
let button: ButtonProtocol = MyButton()
// button은 구현체에 의존하지 않고 ButtonProtocol에 의존하기 때문에,
// ButtonProtocol만 의존하는 다른 MyButton2와 같은것으로 쉽게 변경 가능
- generics와 protocol 사용
- Stack을 구현할때 프로토콜을 따르도록 구현하고, 사용하는쪽에서는 protocol만 의존하도록 구현
protocol Stackable {
associatedtype Element // 제네릭 요소 타입
mutating func push(_ element: Element)
mutating func pop() -> Element?
func peek() -> Element?
var isEmpty: Bool { get }
var count: Int { get }
}
struct Stack<Element>: Stackable {
private var elements: [Element] = []
...
}
다음글에서 제네릭스로 추상화하기 계속...
* 추상화하기 목차: https://ios-development.tistory.com/1627
'iOS 응용 (swift)' 카테고리의 다른 글
[iOS - swift] 2. 추상화 - 제네릭스로 추상화하기 (#GenericTableView) (2) | 2024.01.31 |
---|---|
[iOS - swift] protocol에 사용되는 any 키워드 개념 (existential any, existential type) (2) | 2024.01.30 |
[iOS - swift] 추상화하기 목차 (0) | 2024.01.28 |
[iOS - swift] device 분기 방법, 시뮬레이터 분기문 (targetEnvironment, os, arch, swift) (0) | 2024.01.27 |
[iOS - swift] nested protocol 개념 (#Swift 5.10) (0) | 2024.01.24 |
Comments