[kotlin] 실제 예시로 배우는 코틀린 디자인 패턴

코틀린은 Java와 호환성이 뛰어나며 간결하고 효율적인 코드를 작성할 수 있는 강력한 언어입니다. 디자인 패턴은 소프트웨어 공학에서 중요한 개념으로, 효율적인 소프트웨어 설계를 위해 유용한 방법론을 제공합니다. 이번 포스트에서는 코틀린을 사용하여 실제 예시를 통해 디자인 패턴을 배우고 적용하는 방법을 살펴봅니다.

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

팩토리 메서드 패턴은 객체를 생성하기 위한 인터페이스를 정의하는 패턴입니다. 하위 클래스에서 객체의 생성을 처리하며, 객체의 생성 방법을 캡슐화하여 추상화된 레벨에서 객체를 생성할 수 있도록 합니다.

다음은 코틀린에서 팩토리 메서드 패턴을 적용한 예시 코드입니다.

interface Animal {
    fun makeSound()
}

class Dog : Animal {
    override fun makeSound() {
        println("멍멍")
    }
}

class Cat : Animal {
    override fun makeSound() {
        println("야옹")
    }
}

class AnimalFactory {
    fun createAnimal(type: String): Animal {
        return when (type) {
            "dog" -> Dog()
            "cat" -> Cat()
            else -> throw IllegalArgumentException("유효하지 않은 동물 타입")
        }
    }
}

위의 코드에서 Animal 인터페이스는 makeSound 메서드를 정의하고, DogCat 클래스는 Animal 인터페이스를 구현합니다. AnimalFactory 클래스에서는 createAnimal 메서드를 통해 동물 객체를 생성하는 로직을 캡슐화합니다.

2. 옵저버 (Observer) 패턴

옵저버 패턴은 객체의 상태 변화에 대한 관찰자(옵저버) 목록을 유지하고, 상태 변화가 발생했을 때 이를 통보하는 패턴입니다.

다음은 코틀린에서 옵저버 패턴을 적용한 예시 코드입니다.

interface Observer {
    fun update(value: Int)
}

class Subject {
    private val observers = mutableListOf<Observer>()

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

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

    fun notifyObservers(value: Int) {
        for (observer in observers) {
            observer.update(value)
        }
    }
}

위의 코드에서 Observer 인터페이스는 update 메서드를 정의하고, Subject 클래스는 옵저버 목록을 관리하며, 옵저버들에게 상태 변화를 알리는 로직을 구현합니다.

결론

코틀린은 다양한 디자인 패턴을 유연하고 간결하게 구현할 수 있는 강력한 언어입니다. 이러한 디자인 패턴을 이해하고 활용함으로써 개발자는 보다 견고하고 유지보수가 쉬운 소프트웨어를 개발할 수 있습니다.

참고문헌: 코틀린 인 액션: 코틀린 기본기에서 함수형 프로그래밍까지