본문 바로가기
IT/프로그래밍

명품 JAVA Programming 5장 연습문제 정답

by nutrient 2020. 12. 11.
728x90
728x170

명품 JAVA Programming 5장 연습문제 정답

 

명품 JAVA Programming 5장 연습문제 정답

 

1. (1) 객체 objA의 멤버들은 총 2개로서 다음과 같다.

private int a; public void set(int a) { this.a = a; }

(2) 객체 objB의 멤버들을 총 4개로서 다음과 같다.

private int a; public void set(int a) { this.a = a; } protected int b, c;

(3) 객체 objC의 멤버들은 총 6개로서 다음과 같다.

private int a; public void set(int a) { this.a = a; } protected int b, c; public int d, e;

(4) a = 1; // ① 라인에서 오류가 발생한다. a는 클래스 A의 private 멤버이므로 상속받은 클래스 D에서 접근할 수 없기 때문이다. 하지만, protected 멤버는 마음대로 접근할 수 있다.

2. ① Object

3. 독자마다 조금씩 다르게 할 수도 있겠지만, 현재와 미래에 확장성으로 고려하여 다음과 같이 작성하였다.

class Pen { // 모든 펜의 공통 속성 private int amount; // 남은 량 public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } } class SharpPencil extends Pen {

private int width; // 펜의 굵기 } class BallPen extends Pen { private String color; public String getColor() { return color; } public void setColor(String color ) { this.color = color; } } class FountainPen extends BallPen { public void refill(int n) { setAmount(n); } }

다음과 같이 작성할 수도 있다.

class Pen { private int amount; public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } }

class SharpPencil extends Pen { private int width; // 펜의 굵기 }

class ColorPen extends Pen { private String color; public String getColor() { return color; } public void setColor(String color ) { this.color = color; } }

class BallPen extends ColorPen {

}

class FountainPen extends ColorPen { public void refill(int n) { setAmount(n); } }

4.

자바에서 상속받는 클래스를 서브 클래스라고 부르며, extends 키워드를 이용하여 상속을 선언한다. 상속받은 클래스에서 슈퍼 클래스의 멤버를 접근할 때 super 키워드를 이용한 다. 한편, 객체가 어떤 클래스의 타입 인지 알아내기 위해서는 instanceof 연산자를 이용 하며, 인터페이스는 클래스와 달리 interface 키워드를 이용하여 선언한다.

5. ②. protected 멤버는 다른 패키지의 서브 클래스에서도 접근 가능하다.

6.

class TV { private int size; public TV(int n) {size = n;} } class ColorTV extends TV { private int colors; public ColorTV(int colors, int size) { super(size); this.colors = colors; } }

7. 다음과 같이 출력된다.

A B:11

8. 클래스 A의 생성자를 protected로 사용해도 무관하므로 다음은 오류가 아니다.

protected A(int i) { a = i; }

잘못된 부분은 클래스 B의 다음 생성자에 있다.

public B() { b = 0; }

자바 컴파일러는 이 문장을 컴파일할 때, 클래스 A의 매개변수 없는 생성자를 호 출하도록 컴파일하는데 클래스 A에는 매개변수 없는 기본 생성자가 만들어져 있지 않다. 그래서 다음과 같은 컴파일 오류 메시지가 출력된다. Implicit super constructor A() is undefined. Must explicitly invoke another constructor

오류를 수정하는 방법에는 2가지가 있다. 첫째, 클래스 A에 다음 생성자를 추가하는 방법이다.

public A() { }

둘째, 클래스 A에 문제를 삼는 것은 바람직하지 않다. 상속받는 사람이 클래스 A를 의 의미를 훼손하지 않고 상속해야하는 것이 정상이다. 그러므로 클래스를 B의 생 성자를 다음과 같이 수정한다. 이것이 정답이다.

public B() { super(0); // 클래스 A의 A(int i)의 생성자 호출. b = 0; }

9. ①. 잘못됨. 추상 메소드 void f()를 abstract void f();로 수정하여야 한다. ②. 문제 없음. 추상 메소드가 없는 클래스로 추상 클래스로 선언할 수 있다. ③. 잘못됨. 추상 클래스 B를 상속받고 추상 메소드를 오버라이딩하지 않으면 클래 스 C도 추상 클래스가 됨. 그러므로 클래스 C를 다음과 같이 수정하여야 한다.

abstract class C extends B { }

④. 잘못됨. 추상 클래스 B의 추상 메소드는 리턴 타입이 int이지만, 상속받은 클 래스 C에서는 void 타입의 메소드를 f()를 구현하였기 때문에 오버라이딩이 실패하였음. 다음과 같이 수정하여야 한다.

class C extends B { int f() { System.out.println("~"); return 0;} }

10.

abstract class OddDetector { protected int n; public OddDetector (int n) { this.n = n; } public abstract boolean isOdd(); } public class B extends OddDetector { public B(int n) { super(n); } public boolean isOdd() { // isOdd() 메소드 오버라이딩 if(n%2 == 0) return false; else return true; } public static void main(String [] args) { B b = new B(10); System.out.println(b.isOdd()); } }

11. (1) ② B b = new C(); ③ A a = new D(); (2)

true false

(3)

true true

12. (1) Circle (2) draw(); (3) super.draw();

13. (1) 추상 클래스의 객체는 생성할 수 없다. 그러므로 다음 두 경우가 오류이다. ② Shape s = new Shape(); ④ Circle c = new Circle(10);

(2) Circle 클래스에 2군데를 수정해야 한다.

class Circle extends Shape { // abstract 삭제 private int radius; public Circle(int radius) { this.radius = radius; } double getArea() { return 3.14*radius*radius; }

// draw() 오버라이딩 public void draw() { System.out.println("반지름=" + radius); } }

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

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

16.

interface Device { void on(); void off(); } public class TV implements Device { public void on() { // Device의 on() 메소드 구현 System.out.println("켜졌습니다."); } public void off() { // Device의 off() 메소드 구현 System.out.println("종료합니다."); } public void watch() { // 새로운 메소드 작성 System.out.println("방송중입니다."); } public static void main(String [] args) { TV myTV = new TV(); myTV.on(); myTV.watch(); myTV.off(); } }

728x90
그리드형

댓글