본문 바로가기
Solution_/명품 java

[명품 JAVA] 5장 연습문제(8~16) (상속)

by 낭람_ 2019. 4. 20.
반응형

[5장 8번]


다음 코드에서 생성자로 인한 오류를 찾아내어 이유를 설명하고 오류를 수정하라.

class A {
private int a;
protected A(int i) { a = i; }
}
class B extends A {
private int b;
public B() { b = 0; }
}


- class B의 생성자와 짝을 이룰 기본 생성자가 class A에 없다.

- public A() { } 생성자를 만들어주거나, public B(){ super(1); b = 0; } 으로 수정해준다.


[5장 9번]


다음 추상 클래스의 선언이나 사용이 잘못된 것을 있는 대로 가려내고 오류를 지적하라.

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

(2)abstract class A {
void f() { System.out.println("~"); }
}

(3)abstract class B {
abstract void f();
}
class C extends B {
}

(4)abstract class B {
abstract int f();
}
class C extends B {
void f() { System.out.println("~"); }
}

- 1. void f(); 를 abstract void f(); 로 수정한다.

- 2. 오류가 없다. _ 추상 클래스에 추상 메소드가 없어도 된다.

- 3. 추상 클래스를 상속받고 추상 메소드를 오버라이딩하지 않으면 클래스 C도 추상 클래스가 된다. _ abstract class C extends B로 수정한다.

- 4. 추상 클래스 B의 메소드 f는 int 타입의 메소드 이지만, 상속받는 클래스 C에서는 void 타입의 메소드를 적었다. int f() { System.out.println("~"); return 0; } 으로 수정한다.


[5장 10번]


추상 클래스를 구현하는 문제이다. 실행 결과와 같이 출력되도록 클래스 B를 완성하라.

abstract class OddDetector {
protected int n;
public OddDetector (int n) {
this.n = n;
}
public abstract boolean isOdd(); // 홀수이면 true 리턴
}
public class B extends OddDetector {
public B(int n) {
super(n);
}
public static void main(String[] args) {
B b = new B(10);
System.out.println(b.isOdd());
}
}
false


[풀이]

abstract class OddDetector {
protected int n;
public OddDetector (int n) {
this.n = n;
}
public abstract boolean isOdd(); // 홀수이면 true 리턴
}
public class B extends OddDetector {
public B(int n) {
super(n);
}
public boolean isOdd() { // 이부분을 추가
if(n%2 == 1)
return true;
else
return false;
}
public static void main(String[] args) {
B b = new B(10);
System.out.println(b.isOdd());
}
}


[5장 11번]


다음 상속 관계의 클래스들이 있다.

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

(1) 다음 중 업캐스팅을 모두 골라라

1. A a = new A();    2. B b = new C();    3. A a = new D();    4. D d = new D();


- 2. B b = new C();

- 3. A a = new D();


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

A x = new D();
System.out.println(x instanceof B);
System.out.println(x instanceof C);
true
false

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

System.out.println(new D() instanceof Object);
System.out.println("Java" instanceof Object);
true
true


[5장 12번]


동적 바인딩에 관한 문제이다. 다음 코드가 있을 때 질문에 답하라.

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

(1) Shape s = new Circle(); s.draw()가 호출되면 출력되는 내용은?

Circle

(2) s.paint()가 호출되면 "Circle"이 출력되도록 빈 칸에 적절한 코드를 삽입하라.

draw();

(3) s.paint()가 호출되면 "Shape"이 출력되도록 빈 칸에 적절한 코드를 삽입하라.

super.draw();


[5장 13번]


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

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

(1) 다음 중 오류가 발생하는 것을 있는 대로 골라라.

1. Shape s;    2. Shape s = new Shape;    3. Circle c;    4. Circle c = new Circle(10);


- 2. Shape s = new Shape; _ 추상 클래스는 객체 생성이 불가능하다.


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

Circle p = new Circle(10);
p.paint();


[풀이]

abstract class Shape {
public void paint() { draw(); }
abstract public void draw();
}
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); } // 이부분 추가
}


[5장 14번]


다형성에 대한 설명 중 틀린 것은?

1. 추상 메소드를 두는 이유는 상속 받는 클래스에서 다형성을 실현하도록 하기 위함이다.

2, 인터페이스도 구현하는 클래스에서 다형성을 실현하도록 하기 위함이다.

3. 다형성은 서브클래스들이 수퍼 클래스의 동일한 메소드를 서로 다르게 오버라이딩하여 이루어진다.

4. 자바에서 다형성은 모호한(ambiguous) 문제를 일으키므로 사용하지 않는 것이 바람직하다.


- 4. 자바에서 다형성은 모호한(ambiguous) 문제를 일으키므로 사용하지 않는 것이 바람직하다.


[5장 15번]


다음 중 인터페이스의 특징이 아닌 것은?

1. 인터페이스의 객체는 생성할 수 없다.

2. 인터페이스는 클래스와 같이 멤버 변수(필드)의 선언이 가능하다.

3. 인터페이스의 추상 메소드는 자동으로 public이다.

4. 클래스에서 인터페이스를 구현할 때 implements 키워드를 이용하며, 모든 추상 메소드를 작성하여야 한다.


- 2, 인터페이스는 클래스와 같이 멤버 변수(필드)의 선언이 가능하다. _ 불가능하다.


[5장 16번]


빈칸을 적절히 채우고, 실행 예시와 같이 출력되도록 클래스 TV에 필요한 메소드를 추가 작성하라.

________ Device {
void on();
void off();
}
public class TV _________ Device {
public static void main(String[] args) {
TV myTV = new TV();
myTV.on();
myTV.watch();
myTV.off();
}
}
켜졌습니다.
방송중입니다.
종료합니다.


[풀이]

interface Device {
void on();
void off();
}
public class TV implements Device {
public static void main(String[] args) {
TV myTV = new TV();
myTV.on();
myTV.watch();
myTV.off();
}
public void on() {
System.out.println("켜졌습니다.");
}
public void off() {
System.out.println("종료합니다.");
}
public void watch() {
System.out.println("방송중입니다.");
}
}


반응형

댓글