Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[iOS - swift] 1. 추상화 - 개념과 목적 본문

iOS 응용 (swift)

[iOS - swift] 1. 추상화 - 개념과 목적

jake-kim 2024. 1. 29. 01:36

* 추상화하기 목차: 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

Comments