[kotlin] 코틀린 인터페이스의 다형성과 인터페이스 대신의 사용

코틀린은 객체 지향 언어로 다형성을 구현하기 위해 인터페이스를 지원합니다. 인터페이스를 사용하여 클래스 간에 공통된 기능을 정의하고, 다양한 객체 타입을 호환 가능하게 만들 수 있습니다. 하지만 때로는 인터페이스를 대체할 다른 방법이 필요할 수 있습니다.

이번 글에서는 코틀린에서 인터페이스의 다형성을 활용하는 방법과 인터페이스를 대신할 수 있는 다른 기능에 대해 알아보겠습니다.

인터페이스의 다형성

코틀린에서 인터페이스는 클래스에서 상속받지 않고, 구현할 때 interface 키워드를 사용합니다. 인터페이스를 구현하는 클래스는 인터페이스가 정의한 메서드를 구현해야 합니다.

예를 들어, 다음은 Animal 인터페이스와 이를 구현한 DogCat 클래스의 예시입니다.

interface Animal {
    fun makeSound()
}

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

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

인터페이스를 사용함으로써 DogCat 클래스는 Animal 인터페이스에 정의된 makeSound 메서드를 구현하므로, Animal 타입으로 다형적으로 다룰 수 있습니다.

fun main() {
    val dog: Animal = Dog()
    val cat: Animal = Cat()
    
    val animals = listOf(dog, cat)
    for (animal in animals) {
        animal.makeSound()
    }
}

위 예시에서 DogCat 객체는 모두 Animal 타입으로 사용될 수 있어, 다형성을 구현하는 것을 확인할 수 있습니다.

인터페이스 대신의 사용

코틀린에서는 람다 함수확장 함수를 이용하여 인터페이스의 일부 기능을 대체할 수 있습니다.

람다 함수를 활용한 다형성

람다 함수를 사용하면 인터페이스를 직접 구현하는 대신에 필요한 기능을 제공할 수 있습니다.

예를 들어, 이전의 Animal 인터페이스 대신에 makeSound 동작을 담은 람다 함수를 이용하여 DogCat 객체를 생성할 수 있습니다.

val makeDogSound: () -> Unit = { println("멍멍") }
val makeCatSound: () -> Unit = { println("야옹") }

val dog = makeDogSound
val cat = makeCatSound

확장 함수를 활용한 다형성

인터페이스의 기능 중에서 특정 메서드만을 확장 함수로 구현할 수 있습니다. 이를 통해 클래스의 변경 없이 새로운 기능을 추가할 수 있습니다.

예를 들어, Animal 인터페이스의 makeSound 메서드를 확장 함수로 구현할 수 있습니다.

fun Dog.makeSound() {
    println("멍멍")
}

fun Cat.makeSound() {
    println("야옹")
}

위와 같이 람다 함수와 확장 함수를 사용하여 인터페이스의 기능을 대체할 수 있습니다. 이를 통해 더 유연하고 효율적인 코드를 작성할 수 있습니다.

결론

코틀린에서 인터페이스를 사용하여 다형성을 구현하는 방법과 인터페이스를 대신할 수 있는 람다 함수와 확장 함수에 대해 살펴보았습니다. 각각의 방법은 상황에 따라 적합한 방법을 선택하여 사용할 수 있습니다. 다형성을 활용해 유연하고 확장 가능한 코드를 작성하는 데에 참고가 되었으면 좋겠습니다.

참고문헌: