부모 클래스의 정보를 재설계(refactoring)
오버로딩과는 다른 개념!
상속받은 부모 클래스의 정보(프로퍼티)나 행위(메서드)를 재설계하는 기법
주로 부모 클래스의 행위(메서드)를 재설계
오버라이딩이 필요한 이유
각 개체마다 개성을 더하고 싶다
fun main() {
var bird = Bird("새") // name만 받아서 클래스 인스턴스화
var chicken = Chicken("닭", 2) //닭과 2라는 파라미터를 받아서 클래스 인스턴스화
var sparrow = Sparrow("참새", "갈색")//참새와 갈색이라는 파라미터를 받아서 클래스 인스턴스화
var pigeon = Pigeon("비둘기", "서울")//비둘기와 서울이라는 파라미터를 받아서 클래스 인스턴스화
bird.fly() //bird의 fly 메서드 호출
chicken.fly() //bird의 fly 메서드 호출
sparrow.fly() //bird의 fly 메서드 호출
pigeon.fly() //bird의 fly 메서드 호출
}
// 주생성자를 이용한 부모 클래스
open class Bird(name:String) {
var name: String = ""
init {
// this는 현재 클래스의 상태변수를 의미
// var name: String = ""
this.name = name
}
open fun fly() { //오버라이딩 하기 위해서 open 키워드 사용
println("${name}은 날아요~")
}
}
// Chicken 클래스는 주생성자의 파라미터로 닭과 나이를 받아옮
// 받아온 파라미터 중 닭을 부모 클래스 Bird의 주생성자로 전달
class Chicken(name: String, age: Int) : Bird(name) {
var age:Int = 0
init {
this.age = age
}
// 부모 클래스 Bird에 있는 fly 메서드를 내가 원하는 기능으로 수정함
override fun fly() { //오버라이딩 하기 위해서 override 키워드 사용
// super객체는 부모의 객체를 의미하며 자동으로 생성됨
// 즉 부모객체의 fly메서드를 부르는 행위임
// 필요없으니 주석처리완료
// super.fly()
println("${age}살의 ${name}가 날아봅니다~ 꼬끼오!")
}
}
// Sparrow 클래스는 주생성자의 파라미터로 참새와 색을 받아옮
// 받아온 파라미터 중 참새를 부모 클래스 Bird의 주생성자로 전달
class Sparrow(name: String, color: String) : Bird(name) {
var color:String = ""
init {
this.color = color
}
// 부모 클래스 Bird에 있는 fly 메서드를 내가 원하는 기능으로 수정함
override fun fly() { //오버라이딩 하기 위해서 override 키워드 사용
// super객체는 부모의 객체를 의미하며 자동으로 생성됨
// 즉 부모객체의 fly메서드를 부르는 행위임
// 필요없으니 주석처리완료
// super.fly()
println("${color}의 ${name}이 날아봅니다~ 짹짹!")
}
}
// Pigeon 클래스는 주생성자의 파라미터로 비둘기를 받아옮
// 받아온 파라미터를 부모 클래스 Bird의 주생성자로 전달
class Pigeon(name: String, address: String) : Bird(name) {
var address: String = ""
init {
this.address = address
}
// 부모 클래스 Bird에 있는 fly 메서드를 내가 원하는 기능으로 수정함
override fun fly() { //오버라이딩 하기 위해서 override 키워드 사용
// super객체는 부모의 객체를 의미하며 자동으로 생성됨
// 즉 부모객체의 fly메서드를 부르는 행위임
// 필요없으니 주석처리완료
// super.fly()
println("${address} 살고있는 ${name}가 날아봅니다~ 구구!")
}
}