class Animal(val type: String)
// 동물 타입을 받아 각 동물에 맞춰 울음소리를 내게 하는 클래스 모듈
class HelloAnimal {
fun hello(animal: Animal) {
when (animal.type) {
"Cat" -> println("냐옹")
"Dog" -> println("멍멍")
else -> println("알 수 없는 동물")
}
}
}
fun main() {
val hello = HelloAnimal()
val cat = Animal("Cat")
val dog = Animal("Dog")
hello.hello(cat) // 냐옹
hello.hello(dog) // 멍멍
}
fun main() {
val hello = HelloAnimal()
val cat = Animal("Cat")
val dog = Animal("Dog")
val sheep = Animal("Sheep")
val lion = Animal("Lion")
hello.hello(cat) // 냐옹
hello.hello(dog) // 멍멍
hello.hello(sheep)
hello.hello(lion)
}
class HelloAnimal {
// 기능을 확장하기 위해서는 클래스 내부 구성을 일일히 수정해야 하는 번거로움이 생긴다.
fun hello(animal: Animal) {
when (animal.type) {
"Cat" -> println("냐옹")
"Dog" -> println("멍멍")
"Sheep" -> println("메에에")
"Lion" -> println("어흥")
// ...
else -> println("알 수 없는 동물")
}
}
}
// 추상클래스를 상속만 하면 메소드 강제 구현 규칙으로 규격화만 하면 확장에 제한 없다 (opened)
abstract class Animal {
abstract fun speak()
}
class Cat : Animal() {
override fun speak() {
println("냐옹")
}
}
class Dog : Animal() {
override fun speak() {
println("멍멍")
}
}
class Sheep : Animal() {
override fun speak() {
println("매에에")
}
}
class Lion : Animal() {
override fun speak() {
println("어흥")
}
}
// 기능 확장으로 인한 클래스가 추가되어도, 더이상 수정할 필요가 없어진다 (closed)
class HelloAnimal {
fun hello(animal: Animal) {
animal.speak()
}
}
fun main() {
val hello = HelloAnimal()
val cat: Animal = Cat()
val dog: Animal = Dog()
val sheep: Animal = Sheep()
val lion: Animal = Lion()
hello.hello(cat) // 냐옹
hello.hello(dog) // 멍멍
hello.hello(sheep) // 매에에
hello.hello(lion) // 어흥
}
추상화란 다른 모든 종류의 객체로부터 식별될 수 있는 객체의 본질적인 특징이다. (feat. Grady Booch)