[kotlin] 객체지향 디자인 패턴과 코틀린

코틀린은 객체지향 프로그래밍 언어로, 디자인 패턴을 구현하는 데 매우 효과적입니다. 이번 블로그 포스트에서는 주요 객체지향 디자인 패턴을 코틀린으로 어떻게 구현하는지 살펴보겠습니다.

목차

  1. 팩토리 메서드 (Factory Method)
  2. 싱글톤 (Singleton)
  3. 스트래티지 (Strategy)

1. 팩토리 메서드 (Factory Method)

팩토리 메서드는 객체를 생성하는 인터페이스를 정의하지만, 서브클래스에서 어떤 클래스의 인스턴스를 생성할지를 결정하게 합니다. 코틀린에서는 이를 다음과 같이 구현할 수 있습니다.

interface Shape {
    fun draw()
}

class Circle : Shape {
    override fun draw() {
        println("원 그리기")
    }
}

class Rectangle : Shape {
    override fun draw() {
        println("사각형 그리기")
    }
}

class ShapeFactory {
    fun createShape(type: String): Shape {
        return when (type) {
            "Circle" -> Circle()
            "Rectangle" -> Rectangle()
            else -> throw IllegalArgumentException("유효하지 않은 타입")
        }
    }
}

fun main() {
    val factory = ShapeFactory()
    val circle = factory.createShape("Circle")
    circle.draw()
}

이렇게 하면 클라이언트는 구상 클래스를 직접 인스턴스화하지 않고 ShapeFactory를 통해 인스턴스를 받게 됩니다.

2. 싱글톤 (Singleton)

싱글톤은 애플리케이션 전반에 걸쳐 하나의 인스턴스만 존재하도록 보장하는 패턴입니다. 코틀린에서는 다음과 같이 구현할 수 있습니다.

object Logger {
    fun log(message: String) {
        println(message)
    }
}

fun main() {
    Logger.log("로그 메시지")
}

object 키워드를 사용하여 싱글톤 객체를 생성합니다.

3. 스트래티지 (Strategy)

스트래티지는 알고리즘을 캡슐화하고 상호 교환 가능하도록 만드는 패턴입니다. 코틀린에서는 다음과 같이 구현할 수 있습니다.

interface SortStrategy {
    fun sort(list: List<Int>): List<Int>
}

class QuickSortStrategy : SortStrategy {
    override fun sort(list: List<Int>): List<Int> {
        // 퀵 소트 알고리즘 구현
    }
}

class Sorter(private val strategy: SortStrategy) {
    fun sortList(list: List<Int>): List<Int> {
        return strategy.sort(list)
    }
}

fun main() {
    val list = listOf(3, 1, 2, 5, 4)
    val quickSorter = Sorter(QuickSortStrategy())
    val sortedList = quickSorter.sortList(list)
    println(sortedList)
}

스트래티지 패턴을 사용하면 Sorter 클래스는 어떤 정렬 알고리즘이 사용될지에 대해 신경 쓰지 않고, 클라이언트는 원하는 정렬 전략을 선택하여 사용할 수 있습니다.

각 패턴에 대한 더 자세한 설명과 구현 방법은 Gang of Four 책을 참고하시기 바랍니다.

이렇게 코틀린으로 다양한 객체지향 디자인 패턴을 구현할 수 있습니다. 객체지향 디자인 패턴을 효과적으로 활용하여 유지보수가 용이하고 확장성 있는 코드를 작성해보세요.