책 내용 질문하기
기사실기 모의고사 10번 질문
도서
2021 시나공 정보처리기사 실기
페이지
0
조회수
302
작성일
2021-10-13
작성자
탈퇴*원

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(); 이므로 더 이해가 가지 않습니다.

 

답변
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-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

    너무나 명확하게 이해되었습니다. 답변이 너무 좋아서 감사인사를 드릴 댓글란이 없어 여기다 올립니다.

     

    미숙한 질문이었음에도 불구하고 알아야 할 부분, 알고싶어 할 부분들을 명확하게 캐치해주셔서 친절하고도 자세하게 답변해주셔서 감동입니다. 정말 감사합니다 !

· 5MB 이하의 zip, 문서, 이미지 파일만 가능합니다.
· 폭언, 욕설, 비방 등은 관리자에 의해 경고없이 삭제됩니다.