안녕하세요.
다음 포스팅은 주관적 풀이이므로 오답이 있을 수 있습니다.
오답이라 생각되는 부분, 질문, 피드백 등 자유롭게 댓글을 남겨주시면 감사드리겠습니다.
1. 다음 클래스에 대한 물음에 답하라.
정답
(1) private int a;
public void set(int a) {this.a = a;}
(2) private int a;
public void set(int a) {this.a = a;}
protected int b, c;
(3) private int a;
public void set(int a) {this.a = a;}
protected int b, c;
public int d, e;
(4) a=1;
해설
(1) 최고 조상 격인 A 부모 클래스에서는 상속받은 값이 없다. A class에 속하는 멤버들이 생성된다.
(2) B의 경우 A클래스를 상속받았기 때문에 B클래스와 A클래스에 존재하는 멤버들을 모두 생성한다.
(3) 2번과 같이 C는 A를 상속받은 B를 상속받았기 때문에 A, B, C클래스에 있는 모든 멤버들을 생성한다.
(4) D는 최종적으로 A, B, C 모두를 상속받았다.
a의 경우 private 형으로 선언되었기 때문에 상속되어도 A 클래스에서 호출하여 사용할 수 없다. 그러므로 A클래스의 a변수에서 에러가 발생한다.
2. 자바의 모든 클래스가 반드시 상속받게 되어 있는 클래스는?
정답 1번
해설 Object 클래스는 java.lang 패키지에 속하는 클래스인데 java.lang 패키지는 import로 불러오지 않아도 자동으로 사용할 수 있고 Object 클래스는 java 클래스에서 최상단에 주 조상 격이기 때문에 Object 클래스를 모든 클래스가 반드시 상속받는다.
3. 상속을 이용하여 다음 클래스들을 간결한 구조로 재작성하라.
정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class Pen{
private int amount = 0;
public int getAonut() {return amount;}
public void setAmount(int amount) {this.amount = amount;}
}
class SharpPencil extends Pen{
private int width = 0;
}
class BallPen extends Pen{
private String color = null;
public String getColor() {return color;}
public void setColor(String color) {this.color = color;}
}
class FountainPen extends BallPen{
public void refill(int n) { setAmount(n);}
}
|
아래는 검증으로 컴파일 에러가 발생하지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class Pen{
private int amount = 0;
public int getAonut() {return amount;}
public void setAmount(int amount) {this.amount = amount;}
}
class SharpPencil extends Pen{
private int width = 0;
}
class BallPen extends Pen{
private String color = null;
public String getColor() {return color;}
public void setColor(String color) {this.color = color;}
}
class FountainPen extends BallPen{
public void refill(int n) { setAmount(n);}
}
public class ex{
public static void main(String[] args) {
}
}
|
해설 위 문제는 간략화하는 문제이다.
이 문제는 문제를 풀 때 노트에 멤버 변수와 메서드가 어떻게 구성되어 있는지부터 확인했다.
SharpPencil | BallPen | FountainPen |
width amount get/setAmount |
amount color get/setAmount get/setColor |
aomunt color get/setAmount get/setColor refill |
문제는 추상화 또는 인터페이스 클래스가 아니므로 3개의 기본 클래스가 상속을 받아 멤버 변수와 메서드를 재활용하기 좋다는 것이다.
각 공통되는 부분을 뽑아보면 amount, get/setAmount 하나의 멤버 변수와 두 개의 메서드를 갖는다.
Pen으로 공통 범주를 추출하여 작성한다.
이후 각 클래스에 Pen의 속성을 상속시키면 다음과 같은 정리가 나온다.
SharpPencil | BallPen | FountainPen |
width | color get/setColor |
color get/setColor refill |
하지만 다시 정리 문제를 접근해보면 BallPen과 FountainPen의 color 멤버 변수와 get/setColor의 메서드가 중첩되는 것을 알 수 있다.
여기서 상속을 다시 정의하고 지나가면 A를 상속받은 B, B를 상속받은 C는 A와 B의 멤버 구성원을 모두 상속받는다.
그렇다면 FountainPen이 BallPen을 상속받는다면 amount, get/setAmount, color, get/setColor가 다음과 같이 정리된다.
SharpPencil | BallPen | FountainPen |
width | color get/setColor |
refill |
하지만 BallPen의 상속을 받는 경우 FountainPen의 refill 메서드 안의 amount 변수에 문제가 생긴다.
이때 리필 메서드는 n값을 저장받기 위해서 amount에 변수 값을 받는 것이므로 private로 선언되어 값을 받지 못한 amount와 다르게 public으로 상속받은 setAmount를 활용하면 된다.
4. 다음 중 설명에 적절한 단어를 기입하라.
정답 자식 클래스 또는 서브 클래스, extends, super, instanceof, interface
해설
1번) 빈칸 -자바에서 상속하는 곳은 부모 클래스 또는 슈퍼 클래스라 한다. 상속받는 곳은 자식 클래스 또는 서브 클래스라 한다.
2번) 빈칸 - 상속받을 자식(서브) class에서는 extends를 사용하여 상속받아야 한다.
3번) 빈칸 - super 키워드를 사용하여 상속받은 부모 클래스의 멤버 변수 값을 불러온다.
4번) 빈칸 - 클래스 내의 객체가 어떤 타입인지 확인이 필요한 경우 instanceof를 사용한다.
5번) 빈칸 - 인터페이스 선언은 interface을 활용하여 선언한다.
5. 상속에 관련된 접근 지정자에 대한 설명이다. 틀린 것은?
정답 2번
해설 preotected는 상속받은 다른 패키지에서도 접근이 가능한 접근 지정자다.
6. 다음 빈칸에 적절한 줄의 코드를 삽입하라.
정답 extends / super(size);
해설 자식 클래스가 부모 클래스를 상속받기 위해서 [자식 클래스] extends [부모 클래스]로 작성되어야 한다(문법)
super()를 활용하여 자식 클래스에서 상속받은 부모 클래스의 값을 받아와야 한다.
7. 상속에 있어 생성자에 대해 묻는 문제이다. 실행될 때 출력되는 내용은 무엇인가?
정답
A B:11 |
해설 class에서 B객체에 11이라는 값을 반환하며 초기화했다.
B class의 경우 기본 생성자와 정수형을 받았을 경우의 생성자가 존재한다. 메인 클래스에서 정수형 값을 반환했기에 B:11이라는 값이 출력되는데 여기서 B는 A에게 상속된 값이므로 부모 클래스 이후 자식 클래스를 진행하기 때문에 A가 먼저 매개변수 값이 없는 생성자를 통하여 초기화가 진행된 후 B의 값이 초기화된다. 따라서 println("A")은 A를 출력하고 개행을 진행하기 때문에 A 개행 이후 B:11가 출력된다.
8. 다음 코드에서 생성자로 인한 오류를 찾아내어 이유를 설명하고 오류를 수정하라.
정답과 해설
1) 부모 클래스인 A class에 public A() {}로 빈 생성자를 초기화하여 B가 상속받은 A객체에 대한 문제를 해결한다.
2) B 객체에서 super() 키워드를 활용하여 문제를 해결한다.
B클래스는 A 클래스를 상속받아서 A클래스의 멤버들을 모두 생성한다. 생성자를 초기화할 때 A클래스의 A() 메서드의 값을 반환해야 하므로 super()를 사용하여 초기화한다. 이후 B클래스에서 원했던 b 멤버를 = 0으로 초기화한다.
super()의 사용 조건으로 생성자의 맨 첫 번째 줄에 생성되어야 한다.
문단 삽입 방법 public A(){} |
문단 수정 방법 public B() { super(0); b = 0;} |
9. 다음 추상 클래스의 선언이나 사용이 잘못된 것을 있는 대로 가려내고 오류를 지적하라.
정답과 해설
(1) void 앞에 abstract를 작성한다.
(2) 추상 클래스는 타입을 미리 지정하는 것일 뿐 메서드 안에 값을 가질 수 없다.
(3) 추상 클래스를 상속받았지만 오버 라이딩하지 않았기 때문에 컴파일 에러가 발생한다.
(4) abstract에서 int형 f() 메서드를 오버 라이딩해서 작성하려 한다. 이때 리턴 타입을 지정해줘야 한다.
10. 추상 클래스를 구현하는 문제이다. 실행 결과와 같이 출력되도록 클래스 B를 완성하라.
정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
abstract class OddDetector{
protected int n;
public OddDetector (int n){
this.n = n;
}
public abstract boolean isOdd();
}
public class ex extends OddDetector{
public ex(int n) {
super(n);
}
public boolean isOdd(){
if(n%2==1)
return true;
else
return false;
}
public static void main(String[] args) {
ex e = new ex(10);
System.out.println(e.isOdd());
}
}
|
해설
추상 클래스인 OddDetector로부터 상속을 받았다. 추상 클래스의 경우 상속받은 메서드를 모두 생성해야 하기 때문에 상속받은 ex 클래스에서 isOdd() 메소드를 선언해야 한다.
지문의 조건은 홀수이면 true를 반환한다. 선언하고 불린 형 타입으로 조건에 맞게 코드를 구성한다.
11. 다음 상속 관계의 클래스들이 있다.
정답
(1) 2, 3번
(2) true / false
(3) true / true
해설
(1) 부모 클래스 이름 = new 자식 클래스();로 자식 클래스를 부모 클래스로 업 캐스팅한 객체는 2번과 3번이다.
(2) D클래스는 B클래스에게 상속받았기 때문에 같은 객체 타입을 갖는다. 그러므로 true가 된다. 하지만 C클래스의 경우 C는 B에게 상속받은 클래스이며, D와는 다른 객체 클래스이므로 false가 된다.
(3) Object 클래스는 Java 클래스의 최상단에 위치한 클래스이므로 모든 클래스의 조상 격이다. 그러므로 새로 생성된 D객체도 "Java"로 저장된 값도 모두 Object와 같은 객체 타입을 갖는다.
12. 동적 바인딩에 관한 문제이다. 다음 코드가 있을 때 질문에 답하라.
정답
(1) Circle
(2) draw();
(3) super.draw();
해설
(1) Circle 클래스를 생성하며, s.draw()를 사용했기 때문에 Circle이 생성된다.
(2) draw(); 메서드를 호출받을 수 있도록 한다.
(3) super를 활용하여 상속받은 클래스에서 값을 호출한다.
13. 동적 바인딩에 대해 다음에 답하라.
정답
(1) 2번
(2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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);
}
}
public class ex {
public static void main(String[] args) {
Circle p = new Circle(10);
p.paint();
}
}
|
해설
1) 추상 클래스에는 객체를 생성할 수 없다.
2) 4개의 step으로 설명한다.
step 1) Circle 클래스를 추상 클래스에서 일반 클래스로 바꾼다.
step 2) 부모로부터 상속받은 draw() 메서드를 생성하여 출력하는 문장을 작성한다.
step 3) draw() 메서드의 경우 상속받은 부모 클래스인 Shape 클래스의 paint() 클래스를 참조하게 된다.
step 4) paint() 메서드를 활용하여 출력하면 반지름=10이 출력된다.
14. 다형성에 대한 설명 중 틀린 것은?
정답 4번
해설 자바의 다형성은 지양이 아닌 지향으로 사용되는 것이다. 또한 단점이 아닌 장점이다.
다형성은 클래스에서 생성된 하나의 객체가 여러 개의 타입을 가질 수 있게 해주는 것이므로 객체지향 프로그램에서 유연한 프로그래밍을 도와준다.
15. 다음 중 인터페이스의 특징이 아닌 것은?
정답 2번
해설인터페이스 안에는 멤버 변수의 선언이 불가능하다.
16. 빈칸을 적절히 채우고, 실행 예시와 같이 출력되도록 클래스 TV에 필요한 메서드를 추가 작성하라.
정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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();
}
}
|
해설 문제는 추상화 클래스로 선언되지 않았다. 인터페이스의 형식을 갖고 있기 때문에 Device 앞에 interface를 선언한다. 또한 인터페이스(interface)는 기존 클래스나 추상화 클래스의 상속과 다르게 implements를 상속시킨다.
이때 TV는 Device 클래스의 interface를 상속받은 경우 반드시 on(), off() 메서드를 작성해야 한다. TV 클래스 내에서 메서드를 생성해준다. 또한 현재 문제에서는 추가로 watch()메소드도 작성해야 한다.
각각의 메소드를 public void 메서드() { } 내용들을 맞춰서 작성한다.
감사드립니다.
다음 포스팅 때 뵙겠습니다.
'개인 학습용 해설 > 명품 Java Programming' 카테고리의 다른 글
[Java] 명품 JAVA Programming 4판 6장 연습문제 - 이론문제 (4) | 2022.04.16 |
---|---|
명품 JAVA Programming 4판 5장 연습문제 - 실습문제 (0) | 2021.12.09 |
명품 JAVA Programming 4판 4장 연습문제 - 실습문제 (0) | 2021.11.18 |
명품 JAVA Programming 4판 4장 연습문제 - 이론문제 (4) | 2021.11.15 |
명품 JAVA Programming 4판 3장 연습문제 - 실습문제 개인 풀이 (0) | 2021.11.08 |