Q1. 생성자의 2가지 문법적 조건은 무엇인가?
1. 클래스명과 동일한 이름을 가질 것
2. 리턴 타입은 가지지 않는다
Q2. 다음과 같은 상속 구조도가 있을 때 이를 코드로 작성하시오(클래스 내용은 작성하지 않음).
class A {}
class B extends A {}
class C extends B {}
class D extends B {}
Q3. 다음과 같은 상속 관계에서 다형적 표현을 사용한 객체 생성 코드 중 올바른 것은 O, 잘못된 것은 X에 표시하시오.
//다형적 표현
A a1 = new A(); //O
A a2 = new B(); //O
A a3 = new C(); //O
A a4 = new D(); //O
B b1 = new A(); //X
B b2 = new B(); //O
B b3 = new C(); //X
B b4 = new D(); //O
C c1 = new A(); //X
C c2 = new B(); //X
C c3 = new C(); //O
C c4 = new D(); //X
D d1 = new A(); //X
D d2 = new B(); //X
D d3 = new C(); //X
D d4 = new D(); //O
Q4. 상속 구조가 다음과 같다. 다음 중 타입 변환이 올바른 것은 O, 잘못된 것은 X에 표시하시오.
A a1 = new A();
B b1 = (B) a1; //X
C c1 = (C) a1; //X
D d1 = (D) a1; //X
E e1 = (E) a1; //X
A a2 = new B();
B b2 = (B) a2; //O
C c2 = (C) a2; //X
D d2 = (D) a2; //X
E e2 = (E) a2; //X
A a3 = new C();
B b3 = (B) a3; //O
C c3 = (C) a3; //O
D d3 = (D) a3; //X
E e3 = (E) a3; //X
Q5. 상속 구조가 다음과 같을 때 알맞은 출력 결과를 고르시오.
A aa = new A();
System.out.println(aa instanceof A); //true
System.out.println(aa instanceof B); //false
System.out.println(aa instanceof C); //false
System.out.println(aa instanceof D); //false
A ad = new D();
System.out.println(ad instanceof A); //true
System.out.println(ad instanceof B); //true
System.out.println(ad instanceof C); //false
System.out.println(ad instanceof D); //true
Q6. 클래스 A와 B가 다음과 같다.
class A {
void hello() {
System.out.println("안녕하세요");
}
}
class B extends A {
void hello() {
System.out.println("반갑습니다");
}
}
다음 실행 코드의 결과를 쓰시오.
A aa = new A();
aa.hello();
B bb = new B();
bb.hello();
A ab = new A();
ab.hello();
실행 결과 |
안녕하세요 반갑습니다 반갑습니다 |
Q7. 다음과 같이 클래스 A를 상속받아 B, C, D, E 클래스를 생성하고자 한다. 다음 중 오류를 포함하고 있는 클래스는 무엇이고, 오류가 발생한 이유는 무엇인지 쓰시오.
class A {
void method() {
}
}
class B extends A {
public void method() {
}
}
class C extends A {
protected void method() {
}
}
class D extends A {
void method() {
}
}
class E extends A {
private void method() {
}
}
오류를 포함하고 있는 클래스명 | 오류가 발생한 이유 |
E | 부모 클래스의 메서드를 오버라이딩하려면 접근 지정자가 부모 클래스의 메서드의 범위와 같거나 더 커야 한다. 부모 클래스인 클래스 A의 메서드의 접근 지정자는 default이니 클래스 E의 메서드 접근 지정자 private보다 더 크다. 따라서 오버라이드 작성 규칙에 어긋나 오류가 발생한다. |
Q8. 다음과 같이 인스턴스 멤버와 정적 멤버를 포함하고 있는 클래스 A와 B가 있다.
class A {
int m = 2;
static int n = 4;
void method1() {
System.out.println("A 클래스 instance method");
}
static void method2() {
System.out.println("A 클래스 static method");
}
}
class B extends A {
int m = 6;
static int n = 8;
void method1() {
System.out.println("B 클래스 instance method");
}
static void method2() {
System.out.println("B 클래스 static method");
}
}
다음 실행 코드의 결과를 쓰시오.
A ab = new B();
System.out.println(ab.m);
System.out.println(ab.n);
ab.method1();
ab.method2();
실행 결과 |
2 4 B 클래스 instance method A 클래스 static method |
Q9. 다음과 같이 클래스 B는 클래스 A를 상속한 후 내부에 아무것도 추가하지 않은 상태다. 이때 오류가 발생하는데, 오류가 발생한 이유를 설명하시오.
class A {
A(int a) {
System.out.println("A 생성자");
}
}
class B extends A { //오류 발생
}
클래스에 생성자가 아무 것도 없으면 JVM은 기본 생성자를 추가시켜주고 상속 관계에 있을 때, 생성한 생성자 내부에 this()나 super() 메서드가 없다면 JVM은 super() 메서드를 추가시켜준다.
클래스 B가 상속하는 클래스 A엔 기본 생성자가 존재하지 않는다. 따라서 JVM이 클래스 B에 기본생성자와 super()을 추가시켜줘도 부모클래스인 클래스 A 객체를 만들 수 없는 것이다. 따라서 오류가 발생하게 된다.
Q10. 클래스 A와 B의 구조는 다음과 같다.
class A {
A() {
System.out.println("A 생성자1");
}
A(int a) {
this();
System.out.println("A 생성자2");
}
}
class B extends A {
B() {
System.out.println("B 생성자1");
}
B(int a) {
super(a);
System.out.println("B 생성자2");
}
}
다음 코드의 실행 결과를 쓰시오.
public static void main(String[] args) {
B bb = new B(5);
}
실행 결과 |
A 생성자1 A 생성자2 B 생성자2 |
Q11. 다음과 같은 클래스 A가 있다.
class A {
int data;
A(int data) {
this.data = data;
}
}
다음 코드의 실행 결과로 false가 출력되는 이유를 설명하시오.
A a1 = new A(3);
A a2 = new A(3);
System.out.println(a1.equals(a2)); //false
객체 2개를 새로 생성하므로 둘이 위치한 힙 메모리 공간은 다르다. 따라서 스택 메모리에 실제 데이터값을 비교해주는 equlas() 메서드를 오버라이딩하지 않고 쓰면 참조 자료형은 실제 데이터가 있는 위치값을 비교하는 것이기 때문에 같은 수를 입력해도 다른 값으로 인식했기 때문이다.
Q12. Q11에서 출력값이 true가 나오도록 클래스 A를 수정하시오.
class A {
int data;
A(int data) {
this.data = data;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof A) {
return this.data ==((A)obj).data;
}
return false;
}
}
A a1 = new A(3);
A a2 = new A(3);
System.out.println(a1.equlas(a2)); //true
'JAVA > 자바 완전 정복' 카테고리의 다른 글
자바 완전 정복 12장 연습문제 풀이 (0) | 2022.07.05 |
---|---|
자바 완전 정복 11장 연습문제 풀이 (0) | 2022.07.05 |
자바 완전 정복 9장 연습문제 풀이 (0) | 2022.07.05 |
자바 완전 정복 8장 연습문제 풀이 (0) | 2022.07.05 |
자바 완전 정복 7장 연습문제 풀이 (0) | 2022.07.05 |