JAVA/자바 완전 정복

자바 완전 정복 12장 연습문제 풀이

GaeGim 2022. 7. 5. 00:17
반응형

Q1. 다음은 추상 클래스 A를 상속해 클래스 B를 정의한 코드로, 오류를 포함하고 있다. 오류가 발생한 이유와 그 해결책을 쓰시오.

abstract class A {
    abstract void abc();
}

class B extends A {

}

 

오류가 발생한 이유 오류 해결책
추상 클래스를 상속받은 일반 클래스 B에 추상 메서드가 구현되어 있지 않다. 일반 클래스는 추상 메서드를 상속받을 수 없다. 부모 클래스 A의 추상 메서드를 구현해주던가
클래스 B를 추상 클래스로 명시해 준다.

 

 

 

 

Q2. 다음과 같이 클래스 A와 클래스 B의 상속 관계가 있을 때 실행 코드(a.abc())의 결과가 "안녕하세요"가 나오도록 클래스 B 내부의 코드를 완성하시오.

abstract class A {
    abstract void abc();
}
class B extends A {
    @Override
    void abc() {
    	System.out.println("안녕하세요");
    }
}

 

//실행 결과
A a = new B();
a.abc();	//안녕하세요

 

 

 

 

Q3. 다음과 같은 추상 클래스 A가 정의돼 있다. 실행 코드가 "반갑습니다"를 출력하도록 익명 이너 클래스를 이용해 객체를 생성하는 코드를 완성하시오.

abstract class A {
    abstract void abc();
}

A a = new A() {
    @Override
    void abc() {
    	System.out.println("반갑습니다");
    }
};
a.abc();	//반갑습니다

 

 

 

 

Q4. 추상 클래스의 객체를 생성하는 방법은 크게 다음과 같다. 각 방법의 장단점을 기술하시오.

① 추상 클래스를 일반 클래스로 상속해 객체 생성

② 익명 이너 클래스 사용

  장점 단점
한 번 정의해 두면
객체를 몇 번이고 생성할 수 있다.
자식 클래스 정의해야 한다.
추가적인 자식클래스의 정의가 불필요하다 객체 생성할 때마다 메서드 구현 등
익명 이너 클래스를 정의해야 한다.

 

 

 

 

Q5. 다음은 클래스와 인터페이스 간의 상속 문법이다. extends, implements, 불가능 중 적절한 상속 키워드를 넣으시오.

클래스 extends 클래스 {
     // . . .
}

인터페이스 extends 인터페이스 {
     // . . .
}

클래스 implements 인터페이스 {
     // . . .
}

인터페이스 불가능 클래스 {
     // . . .
}

 

 

 

 

Q6. 다음과 같이 클래스 D가 인터페이스 A, B, 클래스 C를 상속하고자 할 때의 상속 문법을 완성하시오.

interface A {
}
interface B {
}
class C {
}
class D extends C implements A, B {
}

 

 

 

 

Q7. 다음 코드는 인터페이스 A를 상속해 클래스 B를 정의한 코드로, 오류가 포함돼 있다. 오류가 발생한 이유와 해결책을 쓰시오.

interface A {
    void abc();
}
class B implements A {
    void abc() {
    	// . . .
    }
}

 

오류가 발생한 이유 오류 해결책
인터페이스에 접근 지정자를 명시하지 않고 메서드를 작성하면 컴파일러는 public abstract을 자동 추가한다. 따라서 인터페이스의 메서드의 지정자는 public이 된다. 인터페이스를 상속받는 클래스 B의 메서드는 상속받은 인터페이스의 메서드 지정자 범위보다 커야 한다. 근데 일반 클래스에서 메서드에 접근 지정자를 지정해주지 않으면 컴파일러는 자동으로 default 지정자를 추가시켜준다.

따라서 인터페이스 메서드의 지정자 범위보다
좁아지기 때문에 오류가 발생한 것이다.
클래스 B의 메서드 abc()의 접근 지정자를
public으로 바꿔주면 된다.

 

 

 

 

Q8. 다음 인터페이스 A는 디폴트 메서드를 포함하고 있다. 자식 클래스에서 부모 클래스의 abc() 메서드를 호출하는 코드를 추가해 다음과 같은 실행 결과가 나오도록 빈칸을 완성하시오.

interface A {
    default void abc() {
    	System.out.println("A 인터페이스의 abc()");
    }
}
class B implements A {
    @Override
    public void abc() {
    	A.super.abc();
        System.out.println("B 클래스의 abc()");
    }
}

B b = new B();
b.abc();

 

 

반응형