😵 상속
[상속 = 클래스 간의 상속]
- 클래스(설계도) 간의 관계를 더욱 끈끈하게 만들 수 있다.
- 공통적인 요소들이 있다면 부모/자식 클래스를 구분해서 상속 관계를 만들 수 있다.
- 코틀린은 무분별한 상속으로 예상치 못한 흐름을 방지하기 위해 다른 언어들과 달리 생략된 final 키워드로 기본적으로 상속을 막아두었다.
- 코틀린은 open 키워드를 활용해서(추가해야) 상속 관계를 만들 수 있다.
- 부모클래스에서 생성자를 활용하는 경우에 자식에서 객체 생성시 전달해 줘야 한다.
[상속이 필요한 이유]
- 다형성을 구현할 수 있다.
- 클래스의 내용을 변경해야하는경우, 부모 클래스만 변경하는것으로 유지보수의 공수를 크게 줄일 수 있다.
[예시 코드]
- 닭, 참새, 비둘기는 새라는 공통점이 있다.
- 닭, 참새, 비둘기는 새라는 부모에서 출발했다는 관계를 만들어 줄 수 있다.
(닭, 참새, 비둘기 class를 따로따로 만들어서 써도 지금 당장 문제는 없지만, 관계를 만들어 주면 나중에 유지보수가 쉽다.)
fun main() {
var bird = Bird()
var chicken = Chicken()
var sparrow = Sparrow()
var pigeon = Pigeon()
bird.fly()
chicken.fly()
sparrow.fly()
pigeon.fly()
}
open class Bird {
fun fly() {
println("새는 날아요~")
}
}
class Chicken : Bird() {
}
class Sparrow : Bird() {
}
class Pigeon : Bird() {
}
- 부모클래스(Bird)에서 생성자를 활용하는 경우에 자식 클래스에서 객체 생성시 전달해 주는 예시 코드
fun main() {
var bird = Bird("새")
var chicken = Chicken("닭")
var sparrow = Sparrow("참새")
var pigeon = Pigeon("비둘기")
bird.fly()
chicken.fly()
sparrow.fly()
pigeon.fly()
}
open class Bird(name:String) {
var name: String = ""
init {
this.name = name
}
fun fly() {
println("${name} 날아요~")
}
}
class Chicken(name: String) : Bird(name) {
}
class Sparrow(name: String) : Bird(name) {
}
class Pigeon(name: String) : Bird(name) {
}