MacBook
248
2020-11-12 02:04:06
3
216

자바 고수분들의 클래스 상속에 관해 조언 구해보겠읍니다.. 살려주십시오..



답은 3번으로 되어있습니다.

Foo f = new Bar(); 로 생성을 하면 f 자체는 Foo 라고 보면 되는 것 인가요..

게다가 f.addValue(1); 을 하면 a는 Foo 에서 정의 된 3을 사용하고

f.addFive(); 를 하면 a는 Bar 에서 정의된 8을 사용하는지 이 구조가 당최 이해가 가지 않습니다..

이 문제로 일주일을 불면증에 시달리고 있읍니다..

자바 고수분들의 명쾌한 설명 기다리고 있겠읍니다..

0
  • 답변 3

  • 옥탑방개발자
    84
    2020-11-12 06:57:26

    악마의 문제네요... 실전에서는 쓸 일이 없거나 절대로 쓰면 안되는 코드이지만....

    언어를 공부하는 입장이니 그렇다 치고요..


    문제의 f 객체는 생성될 당시 Bar 객체로 생성이 됩니다.

    이 객체에는 Foo 에서 선언한 aFoo 변수와 Bar 에서 선언한 aBar 두개의 int 타입 멤버를 가지고 있네요.

    메소드는 

    addValue(int)

    addValue(double) : double 인 경우에 호출하는 것으로...

    addFive() : Bar 에서 정의한 것으로 오버로딩됨.


    그런데 addValue(int)와 addFive() 를 호출을 했네요.


    Foo 에서 정의한 addFive는 new Foo() 를 한 객체에서만 보입니다. new Bar()를 할때 이미 오버라이딩 되어서 접근할 길이 없습니다.

    그리고 4번 처럼 답이 나올려면 아래와 같이 호출하면 됩니다.

    Foo f = new Bar();
    ((Bar) f).addValue(1.0);
    f.addFive();





  • 지붕뚫고높이차
    1k
    2020-11-12 08:37:28 작성 2020-11-12 08:38:58 수정됨

    오버라이딩은 기존기능을 살리고 새로운 기능을 추가하는 방법이고


    오버로딩은 기존 기능을 새로운 기능으로 바꾸는 방법입니다.


    따라서 FOO를 상속받은 BAR 클래스가 


    객체가 될때


    오버라이딩과 오버로딩이 적용되어

    addvalue (int   : FOO 클래스 코드

    addvalue (double : BAR 클래스 코드

    addfive : FOO 클래스 코드를 무시한 BAR 클래스코드


    3개의 메소드를 가진 객체로 되는 겁니다.

  • MacBook
    248
    2020-11-12 12:35:04
  • 로그인을 하시면 답변 을 등록할 수 있습니다.