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

- Author: @baealex
- Published: 2018-07-29
- Updated: 2018-07-29
- Source: http://blex.me/@baealex/%EB%AA%85%ED%92%88-%EC%9E%90%EB%B0%94-%EC%97%90%EC%84%BC%EC%85%9C-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C-5%EC%9E%A5%EC%9D%B4%EB%A1%A0
- Tags: 자바에센셜

---

<div class="txc-textbox" style="border-style: solid; border-width: 1px; border-color: rgb(254, 254, 184); background-color: rgb(254, 254, 184); padding: 10px;">
<p>문제와 해답은 직접 작성한 것으로 오타가 있을 수도 있으며 해답역시 틀린 부분이 있을 수 있습니다. 틀린 부분에 대한 지적은 적극 수용하도록 하겠습니다. 문제를 먼저 풀어보시고 참고용으로만
        봐주시길 바랍니다.<br/></p>
</div>

#### 연습문제 5장

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

```java
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의 멤버들은 모두 나열하라. 
 <font color="#ff0000">a, b, set()<br/></font> (2) B objB = new B(); 에 의해 생성되는 객체 objB의 멤버들은 모두 나열하라. 
 <font color="#ff0000">a, b, set(), c, d<br/></font> (3) C objC = new C(); 에 의해 생성되는 객체 objC의 멤버들은 모두 나열하라. 
 <span style="color: rgb(255, 0, 0);">a, b, set(), c, d, e, f</span>

2. 상속에 관한 접근 지정자에 대한 설명이다. 틀린 것은? 
 ① 슈퍼 클래스의 private 멤버는 서브 클래스에서 바로 접근할 수 없다. 
 <span style="color: rgb(255, 0, 0);">②
 슈퍼 클래스의 protected 멤버는 같은 패키지에 있는 서브 클래스에서만 접근할 수 있다.</span> 
 ③ 슈퍼 클래스의 public 멤버는 다른 모든 클래스에서 접근할 수 있다. 
 ④
 슈퍼 클래스의 디폴트 멤버는 같은 패키지에 있는 다른 모든 클래스에서 접근 가능하다. 
 <span style="color: rgb(34, 116, 28);">다른 패키지의 서브 클래스에서도 접근이
 가능하다.</span>

3. 메소드 오버라이딩에 대한 설명으로 틀린 것은? 
 ① 상속 관계에서 발생한다. 
 ② 슈퍼 클래스의 메소드를 서브 클래스에서 재작성하는 것이다. 
 ③ 서브 클래스에서 슈퍼 클래스의 메소드
 이름, 매게 변수의 개수와 타입, 리턴 타입을 동일하게 선언해야 한다. 
 <span style="color: rgb(255, 0, 0);">④ 정적 바인딩이 발생한다.</span> 
 <span style="color: rgb(34, 116, 28);">동적 바인딩</span>

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

```java
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
    }
}
```

<span style="color: rgb(34, 116, 28);">③ 슈퍼 클래스에서 private로 선언된 멤버라 위와같이 접근할 수 없다.</span>

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

```java
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;
    }
}
```

<span style="color: rgb(34, 116, 28);">super(size);</span>

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

```java
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) 이 코드에서 컴파일 오류가 발생하는 곳은 어디인가? 컴파일 오류의 원인은 무엇인가? 
 <span style="color: rgb(255, 0, 0);">위 코드 기준 7행이 에러: 같은
 유형의 생성자가 슈퍼 클래스에 존재하지 않음</span>

(2) B b = new B();를 실행한 결과가 다음과 같도록 생성자 B()를 수정하라. 
 **A20B** 
 <span style="color: rgb(255, 0, 0);">public
 B() { super(20); System.out.print("B</span> <span style="color: rgb(255, 0, 0);">"); }</span>

(3)B b = new B(30);을 실행한 결과가 다음과 같도록 생성자 B(int x)를 수정하라. 
 **A50B30** 
 <span style="color: rgb(255, 0, 0);">public
 B(int x) { super(50); System.out.print("B</span> <span style="color: rgb(255, 0, 0);">" + x); }</span>

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

```java
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(); <span style="color: rgb(255, 0, 0);">② a = b;</span> ③ b = a; ④ b = new B(); 
 <span style="color: rgb(34, 116, 28);">업캐스팅: 서브 클래스 레퍼런스를 슈퍼 클래스에 대입</span>

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

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

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

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

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

<span style="color: rgb(255, 0, 0);">false</span> 
 <span style="color: rgb(255, 0, 0);">true</span>

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

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

<span style="color: rgb(255, 0, 0);">false</span> 
 <span style="color: rgb(255, 0, 0);">true</span>

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

```java
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"이 출력된다. 
 <span style="color: rgb(255, 0, 0);">draw();</span> 
 (2) paint()가 호출되면
 "Shape"가 출력된다. 
 <span style="color: rgb(255, 0, 0);">super.draw();</span>

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

<div class="txc-textbox" style="margin:10px; border-style: solid; border-width: 1px; border-color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); padding: 10px;">
<p><span style="color: rgb(255, 0, 0);">① abstract class A {</span><br/><span style="color: rgb(255, 0, 0);"> 
              void f();</span><br/><span style="color: rgb(255, 0, 0);">}</span></p>
</div>

<div class="txc-textbox" style="margin:10px; border-style: solid; border-width: 1px; border-color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); padding: 10px;">
<p>② abstract class A {<br/>    void f() { }<br/>}</p>
</div>

<div class="txc-textbox" style="margin:10px; border-style: solid; border-width: 1px; border-color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); padding: 10px;">
<p>③ abstract class A {<br/>    abstract void f();<br/>}</p>
</div>

<div class="txc-textbox" style="margin:10px; border-style: solid; border-width: 1px; border-color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); padding: 10px;">
<p>④ abstract class W {<br/>    abstract void f();<br/>}<br/>abstract class A extends W {<br/> 
          void f() { }<br/>}</p>
</div>

<span style="color: rgb(34, 116, 28);">abstract void f();로 생성되어야 한다.</span>

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

```java
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; 
 <span style="color: rgb(255, 0, 0);">③ Shape s =
 new Shape();</span> 
 <span style="color: rgb(255, 0, 0);">④ Circle c = new Circle(10</span> <span style="color: rgb(255, 0, 0);">);</span> 
 <span style="color: rgb(34, 116, 28);">추상 클래스 이므로 객체 생성이 되지 않는다.</span>

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

```java
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. 다음 중 인터페이스의 특징이 아닌 것은? 
 ① 인터페이스의 객체를 생성할 수 없다. 
 ② 여러 인터페이스를 상속받는 다중 상속을 지원한다. 
 <span style="color: rgb(255, 0, 0);">③
 인터페이스는 추상 메소드, 상수, 필드로 구성된다.</span> 
 ④ 인터페이스는 implements 키워드를 이용하여 구현한다.
