티스토리 뷰
728x90
오버라이드(Override) vs 오버로드(Overload)
오버라이드(Override)
- 상위 클래스의 매소드를 재정의 하는 것.
- 메소드 이름은 물론 인자 갯수나 타입도 동일해야 한다.
- 주로 상위 클래스의 동작을 상속받은 하위클래스에서 메소드의 동작을 변경하기 위해 사용된다.
오버로드(Overload)
- 함수(메소드) 이름은 같고 인자 갯수나 타입이 다른 함수를 정의하는 것을 의미한다.
메서드 오버라이드
- 클래스 상속과 마찬가지로 기본 final이며 명시적으로 open키워드를 붙여 줘야만 오버라이드가 가능하다.
- 오버라이드를 위해서는 명시적으로 override키워드를 붙여 주어야한다.
- final클래스에서는 open멤버가 금지된다.
open class Parent {
open fun walking() {
println("person is walking")
}
}
class Child : Parent() {
override fun walking() {
println("child is walking")
}
}
fun main() {
val child = Child()
child.walking() // child is walking
}
- 부모 클래스에서 open이 되어있지 않은 메서드는 override에 관계없이 동일한 시그니쳐로 선언하지 못한다.
open class Parent {
fun eat() {
println("person is eating")
}
}
class Child : Parent() {
fun eat() { // error
}
}
- override를 갖는 멤버는 그 자체로 open이며 하위 클래스에서 오버라이딩이 가능하다.
- 만약 오버라이딩을 못하게 막고자 한다면 final키워드를 명시적으로 적어야한다.
open class Parent {
open fun eat() {
println("person is eating")
}
}
open class Child : Parent() {
override fun eat() { // none open keyword
println("child is eating")
}
}
class GrandChild : Child() {
override fun eat() { // override Child.eat
println("grandchild is eating")
}
}
fun main() {
val grandChild = GrandChild()
grandChild.eat() // grandchild is eating
}
프로퍼티 오버라이드
- 메서드 오버라이드와 비슷한 방법으로 동작한다.
- 주요 생성자의 프로퍼티 선언부에서 override키워드를 사용할 수 있다.
open class Parent {
open val age:Int = 30
fun printAge() {
println("my age is ${this.age}")
}
}
class Child(override val age:Int): Parent() {
}
fun main() {
val child = Child(50)
child.printAge() // my age is 50
- 여러 인터페이스(클래스)를 상속받을때 중복된 시그니쳐를 상속한다면 반드시 이 멤버를 오버라이드 해야한다.
interface A1 {
fun a() { println("A1 class") }
}
interface A2 {
fun a() { println("A2 class") }
}
class Klass: A1, A2 {
override fun a() {
super<A1>.a()
super<A2>.a()
}
}
fun main() {
val klass = Klass()
klass.a()
//A1 class
//A2 class
}
출처
https://androidtest.tistory.com/103
https://brunch.co.kr/@mystoryg/15
https://tourspace.tistory.com/106
728x90
'개발 언어 > 코틀린' 카테고리의 다른 글
코틀린(Kotlin) | 클래스 - 가시성 제한자 (0) | 2019.06.22 |
---|---|
코틀린(Kotlin) | 클래스 - 추상 클래스, 인터페이스 (0) | 2019.06.21 |
코틀린(Kotlin) | 클래스 - 상속 (0) | 2019.06.21 |
코틀린(Kotlin) | 클래스 - 객체 생성 및 생성자 (0) | 2019.06.21 |
코틀린(Kotlin) | 클래스 - 객체지향 (0) | 2019.06.21 |
댓글