본문 바로가기
Java

[TIL] 231120 Java의 정석 연습문제 7장 오답

by studymode 2023. 11. 20.

자바의정석 3판 문제풀이 오답

 

 

[7-7] 다음 코드의 실행했을 때 호출되는 생성자의 순서와 실행결과를 적으시오.

class Parent {
    int x = 100;

    Parent() {
        this(200);
    }

    Parent(int x) {
        this.x = x;
    }

    int getX() {
        return x;
    }

}
class Child extends Parent {
    int x = 3000;


    Child() {
        this.x = x;
    }

    Child(int x) {
        this(1000);
    }
}
class Exercise7_7 {
    public static void main(String[] args) {
        Child c = new Child();
        System.out.println("x=" + c.getX());
    }
}

 

답: 

x= 200

 

해설:

c는 Child의 객체로 매개변수 없는 기본 생성자 Child()를 실행 =>

Child(int x)에 매개변수 1000이 x로 들어감 =>

부모 생성자 실행 =>

부모의 x는 설정되어있지 않음으로 부모 기본생성자 Parent() 실행=>

Parent(int x)에 x가 200으로 들어가서

Parent의 x값은 200=>

getX() 로 200 리턴

 

 

 

 

 

 

[7-18] 다음과 같은 실행결과를 얻도록 코드를 완성하시오.

 

[Hint] instanceof연산자를 사용해서 형변환한다.

메서드명 : action

기       능 : 주어진 객체의 메서드를 호출한다.

                 DanceRobot인 경우, dance()를 호출하고,
                 SingRobot인 경우, sing()을 호출하고,
                 DrawRobot인 경우, draw()를 호출한다.

반환타입  : 없음

매개변수  : Robot r - Robot인스턴스 또는 Robot의 자손 인스턴스

 

(⬇️문제+답)

class Exercise7_18 {
    /*
    (1) action메서드를 작성하시오.

    */

    public static void action(Robot r) {
        if (r instanceof DanceRobot) {
            DanceRobot dr = (DanceRobot) r; //Robot r을 댄스로벗으로 형번환!!
            dr.dance();
        } else if (r instanceof SingRobot) {
            SingRobot sr = (SingRobot) r;
            sr.sing();
        } else if (r instanceof DrawRobot) {
            DrawRobot dr = (DrawRobot) r;
            dr.draw();
        }
    }

    public static void main(String[] args) {
        Robot[] arr = { new DanceRobot(), new SingRobot(), new DrawRobot()};
        for(int i=0; i< arr.length;i++)
            action(arr[i]);
    } // main
}
class Robot {}

class DanceRobot extends Robot {
    void dance() {
        System.out.println("춤을 춥니다.");
    }
}

class SingRobot extends Robot {
    void sing() {
        System.out.println("노래를 합니다.");
    }
}
class DrawRobot extends Robot {
    void draw() {
        System.out.println("그림을 그립니다.");
    }
}