인터페이스는 왜 필요한걸까요 그건 바로...

 

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()
        }
    }
}

'【 개발 이야기 】' 카테고리의 다른 글

직렬화  (0) 2025.03.21
[Springboot] 잭슨이란? Json Parser!!  (0) 2025.03.21
코틀린에서 new 없이 의존성 주입(DI)을 통해 객체를 생성하는 방식  (0) 2025.03.14
OOP  (0) 2025.02.18
RestTemplate <-> netty  (0) 2025.02.10