비지터 디자인 패턴은 객체지향 소프트웨어 디자인에서 종종 사용되는 패턴 중 하나입니다. 이 패턴을 사용하면 객체의 타입에 따라 다양한 동작을 수행할 수 있습니다. 코틀린은 이러한 패턴을 쉽게 구현할 수 있는 기능을 제공합니다.
비지터 디자인 패턴이란?
비지터 디자인 패턴은 객체의 구조와 동작을 분리시키는 패턴입니다. 주로 객체 구조 내에서 새로운 동작을 추가하고 싶은 경우에 활용됩니다. 이 패턴은 “방문자(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
이제 비지터 디자인 패턴과 코틀린에 대한 내용을 다룬 블로그 글을 마무리했습니다. 여부로 만족스러우신가요?