【 개발 이야기 】
인터페이스는 왜 필요한걸까요 그건 바로...
홍호나
2025. 3. 14. 16:16
var animals: List<Animal>
Animal 타입을 제네릭으로 가지는 List가 있다고 해봅시다.
나는 이 animals를 출력하고 싶습니다.
animals.forEach { it.makeSound() }
// woof
// meow
오 쉽게 출력이 됩니다.
interface Animal {
fun makeSound()
}
그 이유는 바로 Animal이 클래스가 아닌 인터페이스 였기 때문입니다.
무슨 말이냐면요
class Dog : Animal { // Animal 타입으로 다룰 수 있다.
override fun makeSound() {
println("Woof")
}
}
class Cat : Animal { // Animal 타입으로 다룰 수 있다.
override fun makeSound() {
println("Meow")
}
}
사실은, Dog 클래스와 Cat 클래스가 있습니다.
그리고 둘 다 Animal을 implements 했습니다.
Animal에 있는 makeSound() 함수도 오버라이드 했죠.
implements했기 때문에, Dog과 Cat보다 상위 집합인 Animal 타입으로 다룰 수 있었던 것이지요.
굳이 Dog과 Cat을 따로따로 다루지 않아도 됐던 겁니다. 편리하죠.
fun main() {
val animals: List<Animal> = listOf(Dog(), Cat())
animals.forEach { it.makeSound() } // Woof Meow
}
만약 두 개의 클래스를 포괄해주는 더 큰 개념인 인터페이스를 쓰지 않고
각각의 클래스만으로 코드를 구현했다면
리스트를 출력하는 코드는 다음과 같은 모양이 될 겁니다.
fun main() {
val animals = lisfOf(Dog(), Cat())
for (animal in animals) {
if (animal is Dog) {
animal.bark()
} else if (animal is Cat) {
animal.meow()
}
}
}