fun main() {
val a: AAA = AAA()
val b: AAA = BBB()
b.testA()
}
open class AAA {
protected open fun testA() {
println("AAA임다")
}
}
class BBB : AAA() {
public override fun testA() {
println("오버라이드 된 a 임다")
}
}
상속관계 공부중인데 여기서 a.test()가 동작하지 않는 이유는 무엇인가요?
testA()가 그냥 open 클래스(public)이고 BBB 클래스에서 이걸 오버라이드하고
a.test()하면 오버라이드된 testA()가 호출됩니다. (오버라이딩하지 않았을 경우에는 AAA의 testA()가 호출)
그런데 AAA에서 testA()의 접근 지정자를 protected로 하고 BBB에서 접근지정자를 public으로 변경해주면서 오버라이딩하면 왜 호출조차 안되나요?
저는 public으로 오버라이딩 했으므로 호출될줄 알았는데
코틀린 고수인데 몰르겟어 - dc App
public 속성은 overide 안되나보지
메인에서 b로 호출해야 되는 거 아닐까용 a가 프로텍트고 b가 퍼블릭인데
아 제가 코드를 잘못적은거였네요. 그런데 그래도 동작안되는건 똑같아유..
모르겠네용 b bbb로 해보고ㅠ안되면 걍 gpt한테 물어보죠
아 그생각을 못했네요 감사합니다
b도 오픈해야지 - dc App
해봤는데 안돼요
함수도 오픈함? - dc App
넹
근데 님 안드로이드? 스프링? 뭐땜에 kotlin배움? - dc App
안드로이드여
제 생각에 그냥 문법을 막 파고들려고 하지 않아도 될거 같은데 나중가면 저절로 느낌이와서 걍 상속 개념이랑 private 정도만 짚고 가도 될듯?? - dc App
public은 생략가능한 키워드이고 애초에 다른 접근지정자로 상속은 자바에서도 안됐음
다른접근지정자로 상속이라기보다는 접근지정자 오버라이딩아니에여?
b는 타입 AAA 이니까 메인에서 b.testA로 호출이 불가능한 것 아닌가요?
BBB에서 오버라이드 public으로 오버라이드했으니까 될거라고 생각했습니다
b타입을 AAA로 선언하면(제시한 코드의 경우) protected로 바라봄 b타입을 BBB로 선언하면 오버라이드한 public으로 바라봄