[swift] Composite 디자인 패턴을 사용한 트리 구조의 처리

트리 구조는 계층적으로 구성된 데이터를 표현하는 데 유용한 구조이며, 스위프트에서는 Composite 디자인 패턴을 사용하여 효율적으로 처리할 수 있습니다. Composite 패턴은 객체들을 트리 구조로 구성하여 단일 객체와 복합 객체를 동일하게 취급할 수 있도록 합니다.

Composite 패턴의 개요

Composite 패턴은 객체들을 트리 구조로 구성하여, 개별 객체와 객체들의 집합을 동일하게 취급할 수 있도록 합니다. 모든 객체가 동일한 인터페이스를 갖도록 하며, 클라이언트 코드는 복합 객체와 단일 객체를 구별하지 않고 처리할 수 있습니다.

스위프트에서의 Composite 패턴 적용

아래는 스위프트에서 Composite 패턴을 적용하여 트리 구조를 처리하는 예시 코드입니다.

protocol TreeComponent {
    var name: String { get }
    func display()
}

class Leaf: TreeComponent {
    var name: String

    init(name: String) {
        self.name = name
    }

    func display() {
        print("Leaf: \(name)")
    }
}

class Composite: TreeComponent {
    var name: String
    private var children: [TreeComponent] = []

    init(name: String) {
        self.name = name
    }

    func add(component: TreeComponent) {
        children.append(component)
    }

    func remove(component: TreeComponent) {
        if let index = children.firstIndex(where: { $0 === component }) {
            children.remove(at: index)
        }
    }

    func display() {
        print("Composite: \(name)")
        for child in children {
            child.display()
        }
    }
}

// 사용 예시
let root = Composite(name: "Root")
root.add(component: Leaf(name: "Leaf 1"))
root.add(component: Leaf(name: "Leaf 2"))
let branch = Composite(name: "Branch")
branch.add(component: Leaf(name: "Leaf 3"))
branch.add(component: Leaf(name: "Leaf 4"))
root.add(component: branch)
root.display()

위 코드에서 TreeComponent 프로토콜은 Leaf와 Composite 클래스를 통합하여 처리하기 위한 인터페이스를 정의하고, Leaf와 Composite 클래스는 해당 프로토콜을 준수하도록 구현되어 있습니다.

마무리

Composite 디자인 패턴을 사용하여 트리 구조를 처리하면, 단일 객체와 복합 객체를 동일하게 취급하여 일관성 있고 유연한 코드를 작성할 수 있습니다. 특히, 계층적인 구조를 갖는 데이터를 다룰 때 유용하며, 스위프트에서는 프로토콜과 클래스의 조합으로 이를 구현할 수 있습니다.

Composite 패턴에 대한 더 많은 정보를 참고할 수 있습니다.