명품 자바 에센셜 연습문제 5장(이론)


문제와 해답은 직접 작성한 것으로 오타가 있을 수도 있으며 해답역시 틀린 부분이 있을 수 있습니다. 틀린 부분에 대한 지적은 적극 수용하도록 하겠습니다. 문제를 먼저 풀어보시고 참고용으로만 봐주시길 바랍니다.



연습문제 5장

1. 다음 코드에 대해 물음에 답하라.

class A {
    private int a,b;
    public void set(int a, int b) {
        this.a = a;
        this.b = b;
    }
}
class B extends A {
    protected int c, d;
}
class C extends B {
    public int e,f;
}

(1) A objA = new A(); 에 의해 생성되는 객체 objA의 멤버들은 모두 나열하라.
a, b, set()
(2) B objB = new B(); 에 의해 생성되는 객체 objB의 멤버들은 모두 나열하라.
a, b, set(), c, d
(3) C objC = new C(); 에 의해 생성되는 객체 objC의 멤버들은 모두 나열하라.
a, b, set(), c, d, e, f


2. 상속에 관한 접근 지정자에 대한 설명이다. 틀린 것은?
① 슈퍼 클래스의 private 멤버는 서브 클래스에서 바로 접근할 수 없다.
② 슈퍼 클래스의 protected 멤버는 같은 패키지에 있는 서브 클래스에서만 접근할 수 있다.
③ 슈퍼 클래스의 public 멤버는 다른 모든 클래스에서 접근할 수 있다.
④ 슈퍼 클래스의 디폴트 멤버는 같은 패키지에 있는 다른 모든 클래스에서 접근 가능하다.
다른 패키지의 서브 클래스에서도 접근이 가능하다.


3. 메소드 오버라이딩에 대한 설명으로 틀린 것은?
① 상속 관계에서 발생한다.
② 슈퍼 클래스의 메소드를 서브 클래스에서 재작성하는 것이다.
③ 서브 클래스에서 슈퍼 클래스의 메소드 이름, 매게 변수의 개수와 타입, 리턴 타입을 동일하게 선언해야 한다.
④ 정적 바인딩이 발생한다.
동적 바인딩


4. 접근 지정에 관한 무제이다. 컴파일 오류가 발생하는 곳은 어디인가?

class A {
    private int x, y;
    protected void setX(int x) { this.x = x; }  // 1
}
class B extends A {
    private w;
    protected void setXY(int a, int b, int c) {
        setX(a+b); // 2
        y = b; // 3
        w = c;  // 4
    }
}

③ 슈퍼 클래스에서 private로 선언된 멤버라 위와같이 접근할 수 없다.


5. 생성자에 관한 문제이다. 다음 빈칸에 적절한 한 줄의 코드를 삽입하라.

class LCD {
    private int size;
    public LCD(int n) { size = n; }
}
class ColorLCD extends LCD {
    int colorSize;
    public B(int colorSize, int size) {
        _______________________
        this.colorSize = colorSize;
    }
}

super(size);


6. 생성자에 관한 문제이다. 다음 코드에 대해 물음에 답하라.

class A {
    public A(int x) { System.out.print("A" + x); }
}
class B extends A {
    public B() { System.out.print("B"); }
    public B(int x) { System.out.print("B" + x); }
}

(1) 이 코드에서 컴파일 오류가 발생하는 곳은 어디인가? 컴파일 오류의 원인은 무엇인가?
위 코드 기준 7행이 에러 : 같은 유형의 생성자가 슈퍼 클래스에 존재하지 않음

(2) B b = new B();를 실행한 결과가 다음과 같도록 생성자 B()를 수정하라.
A20B
public B() { super(20); System.out.print("B"); }

(3)B b = new B(30);을 실행한 결과가 다음과 같도록 생성자 B(int x)를 수정하라.
A50B30
public B(int x) { super(50); System.out.print("B" + x); }


7. 업캐스팅에 관한 문제이다. 다음 코드에는 클래스 A, B와 객체 생성 코드가 있다.

public class A {
    public int x;
}
public class B extens A {
    public int y;
}
...
A a = new A();
B b = new B();

(1) 업캐스팅을 골라라.
① a = new A(); ② a = b; ③ b = a; ④ b = new B();
업캐스팅 : 서브 클래스 레퍼런스를 슈퍼 클래스에 대입

(2) 다음 코드는 컴파일 오류는 없지만 실행중에 오류가 발생한다. 그 이유는 무엇인가?
b = (B) new A(); // 실행 오류 발생
b.y = 100;


8. instanceof에 관한 문제이다. 다음 클래스가 있을 때 물음에 답하라.

class A {
    int i;
}
class B extends A {
    int j;
}
class C extends B {
    int k;
}
class D extends B {
    int k;
}

(1) 다음 코드를 실행한 결과는?

A c = new C();
System.out.println(c instanceof D);
System.out.println(c instanceof A);

false
true

(2) 다음 코드를 실행한 결과는?

System.out.println(new D() instanceof C);
System.out.println(new D() instanceof A);

false
true


9. 동적 바인딩에 관한 문제다. 다음 질문에 따라 빈칸에 적절한 코드를 삽입하라.

class Shape {
    public void draw() { System.out.println("Shape"); }
}
class Circle extends Shape {
    public void paint() {
        _________________
    }
    public void draw() { System.out.println("Circle"); }
}

(1) paint()가 호출되면 "Circle"이 출력된다.
draw();
(2) paint()가 호출되면 "Shape"가 출력된다.
super.draw();


10. 다음에서 추상 클래스 선언이 잘못된 것은?

① abstract class A {
    void f();
}

② abstract class A {
    void f() { }
}

③ abstract class A {
    abstract void f();
}

④ abstract class W {
    abstract void f();
}
abstract class A extends W {
    void f() { }
}

abstract void f();로 생성되어야 한다.


11. 동적 바인딩에 대해 다음에 답하라.

abstract class Shape {
    public void paint() { draw(); }
    abstract public void draw();
}
abstract class Circle extends Shape {
    private int radius;
    public Circle(int radius) { this.radius = radius; }
    double getArea() { return 3.14*radius*radius; }
}

(1) 다음 중 오류가 발생하는 것을 모두 골라라.
① Shape s;
② Circle c;
③ Shape s = new Shape();
④ Circle c = new Circle(10);
추상 클래스 이므로 객체 생성이 되지 않는다.


(2) 다음 코드의 실행 결과가 “반지름=10”이 출력되도록 Circle 클래스를 수정하라.

class Circle extends Shape {
    private int radius;
    public Circle(int radius) {
        this.radius = radius;
    }
    double getArea() {
        return 3.14*radius*radius;
    }
    public void draw() {
        System.out.println("반지름="+radius);
    }
}


12. 다음 중 인터페이스의 특징이 아닌 것은?
① 인터페이스의 객체를 생성할 수 없다.
② 여러 인터페이스를 상속받는 다중 상속을 지원한다.
③ 인터페이스는 추상 메소드, 상수, 필드로 구성된다.
④ 인터페이스는 implements 키워드를 이용하여 구현한다.


이 글이 도움이 되었나요?

신고하기
0분 전
작성된 댓글이 없습니다. 첫 댓글을 달아보세요!
    댓글을 작성하려면 로그인이 필요합니다.