[파이썬] 비지터 패턴과 객체 구조 처리

비지터 패턴은 객체 구조 처리를 유연하게 하기 위한 디자인 패턴 중 하나입니다. 이 패턴은 객체 구조 내의 개별 객체를 독립적으로 수정할 수 있도록 하는 방법을 제공합니다. 이번 블로그에서는 비지터 패턴의 개념, 사용법, 그리고 Python에서의 구현을 살펴보겠습니다.

비지터 패턴 개념

비지터 패턴은 객체 구조에서 각각의 객체를 방문하고, 해당 객체에 특정 작업을 수행하는 방법을 제공합니다. 이러한 작업은 객체 자체가 아닌, 비지터(visitor)라고 불리는 외부 클래스에서 정의됩니다. 이 외부 클래스는 다양한 객체를 다루기 위한 메소드를 구현하며, 이 메소드는 특정 객체 타입에 따라 실행됩니다.

비지터 패턴은 객체 구조의 변경 없이도 새로운 작업을 추가하고자 할 때 유용합니다. 예를 들어, 여러 종류의 도형을 가지고 있는 그래픽 에디터를 구현한다고 가정해봅시다. 도형은 각자 다른 방식으로 그려질 수 있으며, 색상이나 크기를 변경할 수도 있습니다. 이때, 비지터 패턴을 사용하면 각 도형의 타입에 따라 다른 그리기 작업을 수행할 수 있습니다.

비지터 패턴 구현 방법

비지터 패턴을 구현하는 가장 기본적인 요소는 비지터 인터페이스(visitor interface)객체 구조(interface structure)입니다. 비지터 인터페이스는 외부 클래스에서 구현될 메소드를 정의하는 역할을 합니다. 객체 구조는 비지터가 방문할 객체들의 집합을 나타내며, 이 객체들은 비지터 인터페이스를 구현해야 합니다.

먼저, 비지터 인터페이스를 정의해봅시다.

interface Visitor:
    def visit_circle(self, circle):
        pass

    def visit_rectangle(self, rectangle):
        pass

위 코드에서 Visitor인터페이스는 CircleRectangle클래스를 방문하는 메소드를 정의합니다. 각 메소드는 매개변수로 방문할 객체를 받습니다.

다음으로, 객체 구조를 정의합니다.

class Shape:
    def accept(self, visitor):
        pass

class Circle(Shape):
    def accept(self, visitor):
        visitor.visit_circle(self)

class Rectangle(Shape):
    def accept(self, visitor):
        visitor.visit_rectangle(self)

각 도형 클래스(Circle, Rectangle)는 Shape클래스를 상속받고, accept메소드를 오버라이딩합니다. accept메소드는 비지터를 인자로 받아와서, 자기 자신을 매개변수로 해당 비지터를 호출합니다.

이제 비지터 패턴을 사용하여 작업을 수행하는 외부 클래스를 만들고, 객체 구조를 방문하여 작업을 수행하는 예제 코드를 작성해봅시다.

class DrawingVisitor(Visitor):
    def visit_circle(self, circle):
        print("Drawing circle")

    def visit_rectangle(self, rectangle):
        print("Drawing rectangle")

shapes = [Circle(), Rectangle()]

drawing_visitor = DrawingVisitor()

for shape in shapes:
    shape.accept(drawing_visitor)

위 코드에서 DrawingVisitorVisitor인터페이스를 구현한 클래스로, visit_circlevisit_rectangle메소드를 구현합니다. 각 메소드는 해당 도형의 그리기 작업을 수행합니다.

결론

비지터 패턴은 객체 구조 처리를 확장하고 유연하게 만들어줍니다. 비지터 패턴을 사용하면 객체들을 독립적으로 수정하고 추가 작업을 수행할 수 있기 때문에, 코드의 유지 보수성과 확장성을 높일 수 있습니다. Python을 비롯한 다양한 프로그래밍 언어에서 비지터 패턴을 사용할 수 있으며, 객체 구조 처리에 유용한 디자인 패턴 중 하나입니다.

참고: Design Patterns: Elements of Reusable Object-Oriented Software