안드로이드 개발자의 창고
[14일차 Kotlin] Overriding(오버라이딩) 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 Overriding(오버라이딩)이란?
- 부모 클래스가 가지고 있는 메서드를 자식 클래스에서 재정의하는 개념이다.
- 부모가 가지고 있는 메서드의 이름, 매개 변수 형태 모두 동일해야 한다.
-
만약 객체가 부모형 참조변수에 담겨 있다면 부모 영역에 정의한 멤버만 사용할 수 있다.
-
만약 부모의 메서드를 자식에서 Overriding을 했다면 부모형 참조 변수를 통해 자식의 메서드를 호출 할 수 있다.
-
이는 이벤트 처리 방식에서 사건이 발생했을 경우 개발자가 만든 메서드를 호출하기 위해 사용하는 매우 중요한 개념이다.
super
- 메서드를 Overriding한 경우 부모의 메서드를 호출하고자 한다면 super 키워드를 사용한다.
- super는 상속관계에서 부모를 의미한다.
📖 예제 코드
SuperClass1와 SubClass1
open class SuperClass1{
var superA1 = 100
fun superMethod1(){
println("SuperClass1의 superMethod1 입니다")
}
}
class SubClass1 : SuperClass1(){
var subA1 = 200
fun subMethod1(){
println("SubClass1의 subMethod1 입니다")
}
}
SuperClass2와 SubClass2
open class SuperClass2{
var superA2 = 300
open fun superMethod2(){
println("SuperClass2의 superMethod2 입니다")
}
}
class SubClass2 : SuperClass2(){
override fun superMethod2(){
// 부모 메서드 호출
super.superMethod2()
println("SubClass2의 superMethod2 입니다")
}
}
✔️ 코드 해석
- SuperClass2의 superMethod2()
- 클래스 안에 있는 메서드는 final 메서드로 정의된다.
- SuperClass1의 superMethod1()도 final 메서드이다.
- final 메서드는 overriding이 불가능하다.
- open 키워드를 사용하면 final 메서드가 아닌 메서드로 변환된다.
- 따라서 overriding을 위해 open 키워드를 사용했다.
- 클래스 안에 있는 메서드는 final 메서드로 정의된다.
- SubClass2의 superMethod2()
- Overriding하는 메서드는 overrdide라는 키워드를 붙여주도록 강제하고 있다.
- 이는 overriding한 메서드라는 것을 명시하기 위함이다.
Main
fun main(){
val obj1 = SubClass1()
println("obj1.subA1 : ${obj1.subA1}")
println("obj1.superA1 : ${obj1.superA1}")
obj1.subMethod1()
obj1.superMethod1()
println("---------------------------")
var obj2:SuperClass1 = SubClass1()
println("obj2.subA1 : ${obj2.subA1}") <<< 오류 발생
println("obj2.superA1 : ${obj2.superA1}")
obj2.subMethod1() <<< 오류 발생
obj2.superMethod1()
println("-----------------------------")
val obj3 = SubClass2()
obj3.superMethod2()
println("-----------------------------")
val obj4:SuperClass2 = SubClass2()
obj4.superMethod2()
}
✔️ 코드 해석
- val obj1 = SubClass1() ...
- SuperClass1()을 상속받은 SubClass1()의 객체이다.
- 자식 클래스 타입이므로 자신의 멤버와 부모의 멤버 모두 사용이 가능하다.
- var obj2:SuperClass1 = SubClass1() ...
- SubClass1의 객체를 부모 클래스인 SuperClass1형 obj2에 담아준다.
- obj2는 부모클래스 타입이기 때문에 부모 맴버만 사용이 가능하다.
- obj4.superMethod2()
- obj4는 부모 클래스(SuperClass2)형의 프로퍼티이다.
- superMethod2()는 오버라이딩 되어 있기 때문에 부모의 메서드가 아닌 자식의 메서드가 호출된다.
'Computer > Kotlin' 카테고리의 다른 글
[15일차 Kotlin] 추상화(abstract) (0) | 2023.05.17 |
---|---|
[15일차 Kotlin] Any (0) | 2023.05.17 |
[14일차 Kotlin] 지연 초기화 - lateinit과 lazy (0) | 2023.05.17 |
[14일차 Kotlin] 캡슐화와 Property(프로퍼티) (0) | 2023.05.17 |
[14일차 Kotlin] 접근제한자 (0) | 2023.05.16 |