2021. 11. 27. 14:48ㆍSolution`/Java
[5장 1번]
다음 클래스에 대해 물음에 답하라.
class A {
private int a;
public void set(int a) { this.a = a; }
}
class B extends A {
protected int b, c;
}
class C extends B {
public int d, e;
}
1. A objA = new objA(); 에 의해 생성되는 객체 objA의 멤버들을 모두 나열하라.
- private int a;
- public void set(int a) {this.a = a;}
2. B objB = new objB(): 에 의해 생성되는 객체 objB의 멤버들을 모두 나열하라.
- private int a;
- public void set(int a) {this.a = a;}
- protected int b, c;
3. C objC = new objC(); 에 의해 생성되는 객체 objC의 멤버들을 모두 나열하라.
- private int a;
- public void set(int a) {this.a = a;}
- protected int b, c;
- public int d, e;
4. 클래스 D를 다음과 같이 작성하였을 때, 오류가 발생하는 라인을 모두 찾아라.
class D extends C {
public void f() {
a = 1; // (1)
set(10); // (2)
b = 20; // (3)
d = 30; // (4)
}
}
- (1) a는 private멤버이기 때문에 접근할 수 없다
[5장 2번]
자바의 모든 클래스가 반드시 상속받게 되어 있는 클래스는?
1. Object 2. Java 3. Class 4. Super
- 1번 Object
[5장 3번]
상속을 이용하여 다음 클래스들을 간결한 구조로 재작성하라.
class SharpPencil { // 샤프펜슬
private int width; // 펜의 굵기
private int amount; // 남은 량
public int getAmount() { return amount; }
public void setAmount (int amount) { this.amount = amount; }
}
class Ballpen { // 볼펜
private int amount; // 남은 량
private String color; // 볼펜의 색
public int getAmount() { return amount; }
public void setAmount (int amount) { this.amount = amount; }
public String getColor() { return color; }
public void setColor(String color) { this.color = color; }
}
class FountainPen { // 만년필
private int amount; // 남은 량
private String color; // 볼펜의 색
public int getAmount() { return amount; }
public void setAmount (int amount) { this.amount = amount; }
public String getColor() { return color; }
public void setColor(String color) { this.color = color; }
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 SharpPen 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){amount = n;}
}
[5장 4번]
다음 중 설명에 적절한 단어를 기입하라.
자바에서 상속받는 클래스를 서브 클래스(sub class) 라고 부르며, extends 키워드를
이용하여 상속을 선언한다. 상속받은 클래스에서 상속해준 클래스의 멤버를 접근할 때
super 키워드를 이용한다. 한편, 객체가 어떤 클래스의 타입인지 알아내기 위해서는
instanceof 연산자를 이용하며, 인터페이스는 클래스와 달리 interface 키워드를
이용하여 선언한다.
[5장 5번]
상속에 관련된 접근 지정자에 대한 설명이다. 틀린 것은?
1. 슈퍼 클래스의 private 멤버는 서브 클래스에서 접근할 수 없다.
2. 슈퍼 클래스의 protected 멤버는 같은 패키지에 있는 서브 클래스에서만 접근할 수 있다.
3. 슈퍼 클래스의 public 멤버는 모든 다른 클래스에서 접근할 수 있다.
4. 슈퍼 클래스의 디폴트 멤버는 같은 패키지에 있는 모든 다른 클래스에서 접근 가능하다.
- 2번 슈퍼 클래스의 protected 멤버는 같은 패키지에 있는 서브 클래스 + 다른 패키지에 있는 서브 클래스에서도 접근이 가능하다
[5장 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) {
______________
this.colors = colors;
}
}
- super(size);
[5장 7번]
상속에 있어 생성자에 대해 묻는 문제이다. 실행될 때 출력되는 내용은 무엇인가?
class A {
public A() { System.out.println("A"); }
public A(int x) { System.out.println("A: " + x); }
}
class B extends A {
public B() { super(100); }
public B(int x) { System.out.println("B: " + x); }
}
public class Example {
public static void main(String[] args) {
B b = new B(11);
}
}
A
B : 11
[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());
}
}
≫ 풀이
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);
}
@Override
public boolean 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());
}
}
[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번, 추상 클래스는 객체를 생성할 수 없다
(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) 문제를 일으키므로 사용하지 않는 것이 바람직하다.
[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 void on() {
System.out.println("켜졌습니다.");
}
public void 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();
}
}