[kotlin] 코틀린 스크립트에서의 디자인 패턴 사용법

코틀린은 많은 디자인 패턴들을 간단하고 효율적으로 구현할 수 있도록 도와주는 언어입니다. 이번 블로그 포스트에서는 코틀린 스크립트에서 몇 가지 유용한 디자인 패턴을 살펴보고, 어떻게 사용하는지 알아보겠습니다.

1. Singleton 패턴

Singleton 패턴은 한 개의 인스턴스만 생성하고, 그 인스턴스에 전역적인 접근을 제공하는 패턴입니다. 코틀린에서는 object 키워드를 사용하여 Singleton 클래스를 만들 수 있습니다.

object Singleton {
    fun showMessage() {
        println("Hello, Singleton!")
    }
}

위의 예제에서는 Singleton 클래스를 정의하고, showMessage 함수를 호출하면 “Hello, Singleton!”이 출력됩니다. Singleton 클래스의 인스턴스는 프로그램 전체에서 공유되며, 필요할 때 어디에서나 접근할 수 있습니다.

2. Builder 패턴

Builder 패턴은 복잡한 객체의 생성을 단순화하기 위해 사용되는 패턴입니다. 코틀린에서는 data class와 함께 사용하면 효과적입니다.

data class Person(val name: String, val age: Int) {
    class Builder {
        private var name: String = ""
        private var age: Int = 0

        fun setName(name: String): Builder {
            this.name = name
            return this
        }

        fun setAge(age: Int): Builder {
            this.age = age
            return this
        }

        fun build(): Person {
            return Person(name, age)
        }
    }
}

위의 예제에서는 Person 클래스와 빌더 클래스를 정의합니다. 빌더 클래스는 setName 및 setAge와 같은 메서드를 사용하여 Person 클래스의 필드 값을 설정합니다. 이후 build 메서드를 호출하면, Person 객체를 반환합니다.

val person = Person.Builder()
    .setName("John")
    .setAge(30)
    .build()

위의 예제에서는 Person 객체를 생성하면서 이름과 나이를 설정하고, build 메서드를 호출하여 최종적으로 Person 객체를 얻을 수 있습니다.

3. Observer 패턴

Observer 패턴은 한 객체의 상태 변화를 다른 객체들에게 통지하는 패턴입니다. 코틀린에서는 델리게이트(Delegate)를 활용하여 간단하게 구현할 수 있습니다.

interface Observer {
    fun update(message: String)
}

class MessagePublisher {
    private val observers: MutableList<Observer> = mutableListOf()

    fun attach(observer: Observer) {
        observers.add(observer)
    }

    fun detach(observer: Observer) {
        observers.remove(observer)
    }

    fun notify(message: String) {
        observers.forEach { it.update(message) }
    }
}

class MessageSubscriber(private val name: String) : Observer {
    override fun update(message: String) {
        println("$name received a message: $message")
    }
}

위의 예제에서는 Observer 인터페이스를 정의하고, MessagePublisher 클래스는 attach, detach, notify 메서드를 사용하여 Observer 객체를 등록 및 통지합니다. MessageSubscriber 클래스는 Observer 인터페이스를 구현하고, update 메서드를 통해 메시지를 수신합니다.

val publisher = MessagePublisher()
val subscriber1 = MessageSubscriber("Subscriber 1")
val subscriber2 = MessageSubscriber("Subscriber 2")

publisher.attach(subscriber1)
publisher.attach(subscriber2)

publisher.notify("Hello, subscribers!")

위의 예제에서는 MessagePublisher를 생성하고, MessageSubscriber 객체들을 등록한 뒤 notify 메서드를 호출하여 메시지를 전달하게 됩니다. 이 때, 등록된 모든 MessageSubscriber 객체들은 메시지를 수신하게 됩니다.

마무리

위에서 살펴본 것은 몇 가지 예시일 뿐이며, 코틀린에서 사용할 수 있는 다양한 디자인 패턴이 있습니다. 이러한 디자인 패턴들은 코드의 재사용성을 높이고 유지보수를 용이하게 만들어줍니다. 따라서, 코틀린 스크립트에서 프로젝트를 개발하거나 유지보수할 때, 디자인 패턴의 적절한 사용을 고려해보는 것이 좋습니다.

참고 자료