▶문제1
다음 클래스에 대해 물음에 답하라.
1
2
3
4
5
6
7
8
9
10
|
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;
}
|
cs |
1. A objA = new objA(); 에 의해 생성되는 객체 objA의 멤버들을 모두 나열하라.
[답]
private int a
public void set(int a){this.a = a;}
[풀이]
A의 클래스에 objA 객체를 생성하라는 것으로 A 클래스에 객체가 생성이 된다
2. B objB = new objB(): 에 의해 생성되는 객체 objB의 멤버들을 모두 나열하라.
[답]
private int a;
public void set(int a) { this.a = a; }
protected int b,c;
[풀이]
B는 현재 A를 상속받고있다. 즉, A의 내용이 모두 B에 보이지 않게 복사 붙혀넣기 되었다고 보면 되는 것으로 B가 class B extends A 를 설정하는 순간 A의 내용이 모두 B에 들어와있는 상태이다. 그래서 B클래스에 객체를 생성하게 된다면 A에 속해있는 멤버변수들도 같이 생성되게된다.
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를 다음과 같이 작성하였을 때, 오류가 발생하는 라인을 모두 찾아라.
1
2
3
4
5
6
7
8
|
class D extends C {
public void f() {
a = 1; // (1)
set(10); // (2)
b = 20; // (3)
d = 30; // (4)
}
}
|
cs |
[답]
1번
[풀이]
a는 private로 잠겨있어 set을 통해 접근해야한다.
▶문제2
자바의 모든 클래스가 반드시 상속받게 되어 있는 클래스는?
1. Object 2. Java 3. Class 4. Super
[답]
1
[풀이]
자바 클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속하게 된다. 따라서 자바의 모든 클래스는 Object 클래스의 자식이거나 자손 클래스가 되는 것이다. 즉, Objcet 는 자바의 최상위 부모 클래스에 해당한다.
Object 클래스는 필드가 없고 메소드로 구성되어있는데 이 메소드들은 모든 클래스들이 Object클래스를 상속하므로, 모든 클래스에서 이용할 수 있다.
▶문제3
상속을 이용하여 다음 클래스들을 간결한 구조로 재작성하라.
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 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); }
|
cs |
[답]
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
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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; // 펜의 굵기
public int getWidth(){
return width;
}
public void setWidth(int width){
this.width = 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);
}
|
cs |
[풀이]
문제에서 공통 클래스를 찾아보면 "남은량"임을 알 수 있다. 여기서 포인트는 공통적인 요소 클래스를 따로 만들어 상속을 받는 것! pen이라는 공통 클래스를 만들고 원래 샤프펜슬에 있었던 펜의 굵기는 자식클래스로 따로 만들어준다. 또한 상속을 받으면서 부모의 메게변수, 메서드 등 모든걸 다 가져오는 것이기에 자식클래스에서 겹치는 메게변수와 메서드를 모두 지워주면 훨씬 깔끔하고 가독성 높은 코드가 된다.
▶문제4
다음 중 설명에 적절한 단어를 기입하라.
자바에서 상속받는 클래스를 (1)라고 부르며, (2)키워드를 이용하여 상속을 선언한다. 상속받은 클래스에서 상속해준 클래스의 멤버를 접근할 때 (3)키워드를 이용한다. 한편, 객체가 어떤 클래스의 타입인지 알아내기 위해서는 (4)연산자를 이용하며, 인터페이스는 클래스와는 달리 (5)키워드를 이용하여 선언한다.
[답]
1. 서브클래스(sub class) & 자식클래스
2. extends
3. super
4. instance of
5. interface
▶문제5
상속에 관련된 접근 지정자에 대한 설명이다. 틀린 것은?
1. 슈퍼 클래스의 private 멤버는 서브 클래스에서 접근할 수 없다.
2. 슈퍼 클래스의 protected 멤버는 같은 패키지에 있는 서브 클래스에서만 접근할 수 있다.
3. 슈퍼 클래스의 public 멤버는 모든 다른 클래스에서 접근할 수 있다.
4. 슈퍼 클래스의 default 멤버는 같은 패키지에 있는 모든 다른 클래스에서 접근 가능하다.
[답]
2
[풀이]
1. private는 클래스 안에서만 사용가능하며 객체를 통해서 접근할 수 없다.
2. 슈퍼 클래스의 protected 멤버는 현재 클래스 내의 다른 자원이나, 같은 패키지 안에 존재하는 클래스와 하위 클래스에서 접근이 가능하다.
3. 모든 곳에서 접근이 가능하며, main에 public을 명시하는 이유도 자바의 시작점으로 모든 면에서 접근이 가능해야하기때문에 접근을 열어놓은 것이다.
4. 접근 한정자를 명시하지 않은 경우, 모든 멤버변수에는 default가 생략되어있다. 현재 클래스, 동일 패키지 내의 다른 클래스에서 접근이 가능하다.
▶문제6
다음 빈칸에 적절한 한 줄의 코드를 삽입하라.
1
2
3
4
5
6
7
8
9
10
11
|
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;
}
}
|
cs |
[답]
super(size);
[풀이]
Tv가 부모, Color Tv가 자식클래스이다. ColorTV는 생성자를 생성하면서 colors와 size의 데이터 값을 Main에서 받아오게되는데 이 때 colors는 본래 부모클래스(Tv)의 것이니까 super를 입력해서 부모클래스의 size 멤버변수를 불러준다. 근데 ColorTv는 size의 멤버변수를 재할당한 것이 아님으로 현재 size는 Tv클래스에 있었던 데이터 그대로 ColorTv에 상속되어있음으로 this.sizes = size;를 사용도 가능하다.
▶문제7
상속에 있어 생성자에 대해 묻는 문제이다. 실행될 때 출력되는 내용은 무엇인가?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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);
}
}
|
cs |
[답]
A
B: 11
[풀이]
Main메소드는 A의 데이터값을 주지 않았다. A라는 부모 메서드의 x에 데이터값을 넘기고 싶다면 객체를 생성하면서 super(); 을 넣어야했다. 그래서 public A(int x) 는 실행이 되지 않으며 그 위의 A()는 데이터 값을 받지 않아도되는 값으로 B에서 별다른 조치가 없었으니 정상출력된다.
*참고
'오답노트 > Java' 카테고리의 다른 글
클래스 연습문제(1) (0) | 2022.03.22 |
---|---|
클래스 상속 실습문제(1) (0) | 2022.03.20 |
조건문 연습문제 (0) | 2022.03.17 |
배열 연습문제 (0) | 2022.03.11 |
메서드 연습문제 (0) | 2022.03.11 |