코틀린은 객체 지향 언어로 다형성을 구현하기 위해 인터페이스를 지원합니다. 인터페이스를 사용하여 클래스 간에 공통된 기능을 정의하고, 다양한 객체 타입을 호환 가능하게 만들 수 있습니다. 하지만 때로는 인터페이스를 대체할 다른 방법이 필요할 수 있습니다.
이번 글에서는 코틀린에서 인터페이스의 다형성을 활용하는 방법과 인터페이스를 대신할 수 있는 다른 기능에 대해 알아보겠습니다.
인터페이스의 다형성
코틀린에서 인터페이스는 클래스에서 상속받지 않고, 구현할 때 interface
키워드를 사용합니다. 인터페이스를 구현하는 클래스는 인터페이스가 정의한 메서드를 구현해야 합니다.
예를 들어, 다음은 Animal
인터페이스와 이를 구현한 Dog
와 Cat
클래스의 예시입니다.
interface Animal {
fun makeSound()
}
class Dog : Animal {
override fun makeSound() {
println("멍멍")
}
}
class Cat : Animal {
override fun makeSound() {
println("야옹")
}
}
인터페이스를 사용함으로써 Dog
와 Cat
클래스는 Animal
인터페이스에 정의된 makeSound
메서드를 구현하므로, Animal
타입으로 다형적으로 다룰 수 있습니다.
fun main() {
val dog: Animal = Dog()
val cat: Animal = Cat()
val animals = listOf(dog, cat)
for (animal in animals) {
animal.makeSound()
}
}
위 예시에서 Dog
와 Cat
객체는 모두 Animal
타입으로 사용될 수 있어, 다형성을 구현하는 것을 확인할 수 있습니다.
인터페이스 대신의 사용
코틀린에서는 람다 함수와 확장 함수를 이용하여 인터페이스의 일부 기능을 대체할 수 있습니다.
람다 함수를 활용한 다형성
람다 함수를 사용하면 인터페이스를 직접 구현하는 대신에 필요한 기능을 제공할 수 있습니다.
예를 들어, 이전의 Animal
인터페이스 대신에 makeSound
동작을 담은 람다 함수를 이용하여 Dog
와 Cat
객체를 생성할 수 있습니다.
val makeDogSound: () -> Unit = { println("멍멍") }
val makeCatSound: () -> Unit = { println("야옹") }
val dog = makeDogSound
val cat = makeCatSound
확장 함수를 활용한 다형성
인터페이스의 기능 중에서 특정 메서드만을 확장 함수로 구현할 수 있습니다. 이를 통해 클래스의 변경 없이 새로운 기능을 추가할 수 있습니다.
예를 들어, Animal
인터페이스의 makeSound
메서드를 확장 함수로 구현할 수 있습니다.
fun Dog.makeSound() {
println("멍멍")
}
fun Cat.makeSound() {
println("야옹")
}
위와 같이 람다 함수와 확장 함수를 사용하여 인터페이스의 기능을 대체할 수 있습니다. 이를 통해 더 유연하고 효율적인 코드를 작성할 수 있습니다.
결론
코틀린에서 인터페이스를 사용하여 다형성을 구현하는 방법과 인터페이스를 대신할 수 있는 람다 함수와 확장 함수에 대해 살펴보았습니다. 각각의 방법은 상황에 따라 적합한 방법을 선택하여 사용할 수 있습니다. 다형성을 활용해 유연하고 확장 가능한 코드를 작성하는 데에 참고가 되었으면 좋겠습니다.
참고문헌: