2021년 3회대비 실기 모의고사 나눠주신 문제에서
10번 해설에 검은동그라미 6번 라인에 대한 설명이 이해가 잘 안갑니다. func(1,2)
SubCls a = new SubCls(); 로 했으니
SubCls()
생성자가 작동하여
super();
sum = sum+ 5; 가
실행되는 건 알겠는데
super();[부모클래스의 생성자]을 처리하는 과정에서 func(1,2)를 왜 SubCls에 오버라이딩 된 func(int x, int y)로 처리하는지 이해가 안갑니다.
super(); 를 호출해서
SuperCls() 의
sum = sum + 3; 을 처리한 뒤
func(1,2) 가 나오는데
이 func(1,2)가 super();[부모클래스의 생성자]에 의해 SuperCls()가 호출된건데
그안에 있는 func(1,2)를 처리할 때
SuperCls() 메소드에도 정수인 인수를 2개 받는 func(int x, int y) 가 존재하는데
이것을 왜 자식클래스에 존재하는 오버라이딩 된 func(int x, int y)로 실행하나요?
super(); 가 호출이 되었으니 SuperCls()의 func(1,2)는 SuperCls에 정의 된
void func(int x, int y){ sum = sum +x +y; } 이게 적용되어야 하는 것 아닌가요?
자식클래스에 오버라이딩 되어있으면 super();를 호출해서 그안에서 func(1,2)여도 자식클래스SubCls()에 오버라이딩 된 메소드인
void func(int x, int y) { sum =0; } 이 적용되는건가요?
정리해서 질문한다고 몇 번 고쳐썼는데 핵심은
[[ super();[부모클래스의 생성자]을 처리하는 과정에서 SuperCls()[부모클래스의 생성자]에 포함되어있는 func(1,2)를 왜 SubCls에 오버라이딩 된 func(int x, int y)로 처리하는지 이해가 안갑니다. ]]
입니다..
+추가질문 만약에 오버라이딩된 SubCls()[자식클래스]에 정의된 func(int x, int y)가 아닌 SuperCls()[부모클래스]에 정의된 메소드인 func(int x, int y)를 쓰고 싶었다면 어떻게 썼어야 하나요?
차라리 [부모클래스][객체변수명] = new [자식클래스생성자()] 이런 묵시적 클래스 형 변환 모습이면 이해가 갈 것 같은데
주어진 문제에서는 [자식클래스][객체변수명] = new [자식클래스생성자()] SubCls a = new SubCls(); 이므로 더 이해가 가지 않습니다.
안녕하세요 길벗수험서 운영팀입니다.
subcls의 생성자에서 super()를 호출했지만 여전히 실행되고 있는 범위는 a 객체변수의 범위라는 것을 잊지 마세요.
(해설의)4~6번에서 실행하고 있는 코드들은 SuperCls 클래스에서 실행되고 있다고 생각하는 것이 아닌 a 객체변수가 갖고 있는 메소드가 실행되고 있다고 이해하셔야 합니다.
a 객체변수 내에서 SuperCls로부터 상속받은 변수나 메소드를 사용하려면 SubCls에서 오버라이딩되지 않은 것이어야 하고, 만약 오버라이딩되었다면 반드시 super 예약어를 이용하여 접근해야 합니다.
6번에서 실행하는 func는 SuperCls가 아닌 a 객체변수로 접근하는 func(int, int)가 되는 것이죠.
+ SubCls의 메소드에서 super.func()로 호출해야 합니다.
+ 아니면 func 메소드에 static를 붙여 SuperCls.func()로 호출해야 하죠.
행복한 하루되세요 :)
-
관리자2021-10-14 09:52:06
안녕하세요 길벗수험서 운영팀입니다.
subcls의 생성자에서 super()를 호출했지만 여전히 실행되고 있는 범위는 a 객체변수의 범위라는 것을 잊지 마세요.
(해설의)4~6번에서 실행하고 있는 코드들은 SuperCls 클래스에서 실행되고 있다고 생각하는 것이 아닌 a 객체변수가 갖고 있는 메소드가 실행되고 있다고 이해하셔야 합니다.
a 객체변수 내에서 SuperCls로부터 상속받은 변수나 메소드를 사용하려면 SubCls에서 오버라이딩되지 않은 것이어야 하고, 만약 오버라이딩되었다면 반드시 super 예약어를 이용하여 접근해야 합니다.
6번에서 실행하는 func는 SuperCls가 아닌 a 객체변수로 접근하는 func(int, int)가 되는 것이죠.
+ SubCls의 메소드에서 super.func()로 호출해야 합니다.
+ 아니면 func 메소드에 static를 붙여 SuperCls.func()로 호출해야 하죠.
행복한 하루되세요 :)
-
관리자2021-10-15 11:18:13
제대로 답변드린 것 같아 기쁘네요 :)
-
*2021-10-14 16:21:03
너무나 명확하게 이해되었습니다. 답변이 너무 좋아서 감사인사를 드릴 댓글란이 없어 여기다 올립니다.
미숙한 질문이었음에도 불구하고 알아야 할 부분, 알고싶어 할 부분들을 명확하게 캐치해주셔서 친절하고도 자세하게 답변해주셔서 감동입니다. 정말 감사합니다 !