[kotlin] 비지터 디자인 패턴과 코틀린

비지터 디자인 패턴은 객체지향 소프트웨어 디자인에서 종종 사용되는 패턴 중 하나입니다. 이 패턴을 사용하면 객체의 타입에 따라 다양한 동작을 수행할 수 있습니다. 코틀린은 이러한 패턴을 쉽게 구현할 수 있는 기능을 제공합니다.

비지터 디자인 패턴이란?

비지터 디자인 패턴은 객체의 구조와 동작을 분리시키는 패턴입니다. 주로 객체 구조 내에서 새로운 동작을 추가하고 싶은 경우에 활용됩니다. 이 패턴은 “방문자(Visitor)”가 집합체(객체 구조)의 요소를 순회하면서 각 요소에 대해 특정한 동작을 수행할 수 있도록 합니다. 이렇게 함으로써 동일한 요소집합에 대해 다양한 동작을 쉽게 추가할 수 있습니다.

코틀린에서의 비지터 디자인 패턴

코틀린은 함수형 프로그래밍의 특징을 갖춘 객체지향 언어이므로 비지터 디자인 패턴을 자연스럽게 구현할 수 있습니다. 코틀린에서는 확장 함수(Extension Function)패턴 매칭(Pattern Matching)을 통해 비지터 패턴을 간단하게 구현할 수 있습니다.

sealed class Shape

class Circle(val radius: Double) : Shape()
class Rectangle(val width: Double, val height: Double) : Shape()

fun Shape.accept(visitor: ShapeVisitor) = when (this) {
    is Circle -> visitor.visitCircle(this)
    is Rectangle -> visitor.visitRectangle(this)
}

interface ShapeVisitor {
    fun visitCircle(circle: Circle)
    fun visitRectangle(rectangle: Rectangle)
}

위 코드에서 Shape는 방문할 요소 집합을 나타내는 클래스입니다. 각 요소 타입에 대해 동작을 수행하기 위해 ShapeVisitor 인터페이스를 정의했습니다. 이제 새로운 동작을 추가하려면 ShapeVisitor를 구현하는 새로운 클래스를 만들면 됩니다.

class AreaCalculator : ShapeVisitor {
    var totalArea = 0.0

    override fun visitCircle(circle: Circle) {
        totalArea += Math.PI * circle.radius * circle.radius
    }

    override fun visitRectangle(rectangle: Rectangle) {
        totalArea += rectangle.width * rectangle.height
    }
}

AreaCalculator 클래스는 ShapeVisitor를 구현하여 각 도형의 넓이를 계산합니다. 이러한 방식으로 새로운 동작을 추가하기 위해 기존 클래스를 변경할 필요가 없습니다.

마무리

코틀린의 확장 함수와 패턴 매칭은 비지터 디자인 패턴을 쉽게 구현할 수 있도록 도와줍니다. 객체 구조에 새로운 동작을 추가하거나 확장해야 하는 경우, 비지터 디자인 패턴은 유용한 도구가 될 수 있습니다.

참고: Kotlinlang - Extension Functions, Kotlinlang - Sealed Classes


이제 비지터 디자인 패턴과 코틀린에 대한 내용을 다룬 블로그 글을 마무리했습니다. 여부로 만족스러우신가요?