본문 바로가기
Java/연습문제

[명품자바] 5장 상속 이론문제(2)

by Meaning_ 2021. 7. 11.
728x90
반응형

9번

 

다음 추상클래스의 선언이나 사용이 잘못된 것을 있는 대로 가려내고 오류를 지적하라.

 

1)

abstract class A{

  void f();

}

오류) 추상 클래스 상에 있는 메소드의 body를 구현하지 않을거면 abstract 선언을 해줘야함!

 

2)

abstract class A{

   void f(){System.out.println("~");}

}

문제가 없다. 메소드의 body를 구현해주면 추상클래스여도 abstract 선언해줄 필요가 없다

 

3)

 

abstract class B{
     abstract void f();

}

class C extends B{

}

 

오류) 추상클래스를 상속받고 추상메소드 오버라이딩을 하지 않으면 자동으로 자식클래스는 추상클래스가 된다. 그래서 class C 앞에 abstract 선언을 해줘야 한다. 

4)

 

abstract class B{
    abstract int f();

}

class C extends B{
     void f(){System.out.println("~");}

}

 

오류) 메소드 오버라이딩을 실패했다. 리턴타입이 int여야 하는데 void이다. 

class C extends B {

    int f(){
            System.out.println("~");

            return 0;

}

 

으로 바꿔줘야한다!

 

 

10번 

 

추상클래스를 구현하는 문제이다. 실행 결과와 같이 출력되도록 클래스 B를 완성하라.

 

abstract class OddDector{

    protected int n;

    public OddDector(int n){

             this.n=n;

    }

   public abstract boolean is Odd(); //홀수이면  true 리턴 

}

 

public class B extends OddDector{

   public B(int n){

         super(n);

   }

   public static void main(String[]args){

        B b=new B(10);

        System.out.println(b.isOdd());

   }

}

 

 

------------------------------------------

 

false

 

답)

public abstract boolean is Odd(){

       if(n%2==1){

              return true;

        }

      else{

           return false;

      }

 

}

 

 

11번

 

다음 상속 관계의 클래스들이 있다.

 

class A{

    int i;

}

class B extends A{

   int j;

}

class C extends B{

   int k;

}

 

class D extends B{

   int m;

}

 

(1) 다음 중 업캐스팅을 모두 골라라

 

A a=new A();

B b=new C();

A a=new D();

D d=new D();

 

슈퍼 클래스 레퍼런스로 서브클래스의 객체를 가리키는 것이 업캐스팅

 

(2) 다음 코드를 실행한 결과는?

 

A x=newD();

System.out.println( x instanceof B); //T

System.out.println(x instanceof C); //F -->x는 B타입 또는 D타입이지 C타입은 아니다!

 

(3) 다음 코드를 실행한 결과는?

 

System.out.println(new D() instanceof Object()); //T

Systme.out.println("Java" instanceof Object()); //T

 

12번

 

동적바인딩에 관한 문제이다. 다음 코드가 있을 때 질문에 답하라.

(1) Shape s=new Circle(); s.draw();가 호출돠면 출력되는 내용은? 

Circle

 

(2) s.paint()가 호출되면 "Circle"이 출력되도록 빈 칸에 적절한 코드를 삽입하라.

 

(3) s.paint()가 호출되면 "Shape"이 호출되도록 빈칸에 적절한 코드를 삽입하라.

 

 

 

13번

 

동적바인딩에 대해 다음에 답하라

 

 

abstract class Shape{

     public void paint(){draw();}

     abstract public void draw();

}

 

abstract class Circle extends Shape{

 

    private int radius;

    public Circle(int radius){this.radius=radius;}

    double getArea(){return 3.14*radius*radius;}

}

 

 

(1) 다음 중 오류가 발생하는 것을 있는대로 골라라.

 

Shape s;

Shape s=new Shape();

Circle c;

Circle c=new Circle(10);

 

--> 추상 클래스는 객체 생성이 불가능 

 

(2) 다음 코드의 실행결과 "반지름=10" 이 출력되도록 Circle 클래스를 수정하라.

 

Circle p=new Circle(10);

p.paint();

 

 

답)

 

1. 객체를 생성해야하기 때문에 Circle클래스를 추상클래스로 선언하지 않는다.

 

2. 추상클래스를 상속받을 때, 자식 클래스가 자동으로 추상 클래스가 되지 않게 하기 위해서는 추상메소드 오버라이딩이 필요하다.

 

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);

  }

}

 

14번

 

다형성에 대한 설명 중 틀린것은?

 

1) 추상메소드를 두는 이유는 상속 받는 클래스에서 다형성을 실현하도록 하기 위함이다.

2) 인터페이스도 구현하는 클래스에서 다형성을 실현하도록하기 위함이다.

3) 다형성은 서브클래스들이 수퍼클래스의 동일한 메소드를 서로 다르게 오버라이딩하여 이루어진다.

4) 자바에서 다형성은 모호한 문제를 일으키므로 사용하지 않는 것이 바람직하다.

 

 

15번

 

다음 중 인터페이스의 특징이 아닌 것은?

 

1) 인터페이스의 객체는 생성할 수 없다.

2) 인터페이스는 클래스와 같이 멤버변수(필드)의 선언이 가능하다. --> 불가능하다

3) 인터페이스의 추상메서도는 자동으로 public이다. 

4) 클래스에서 인터페이스 구현할 때 implements 키워드를 사용하며, 모든 추상메소드를 작성해야한다. 

 

cf) 인터페이스 vs 추상클래스

 

인터페이스 추상클래스
- 변수 필드(멤버변수)는 포함하지 않는다
- 상수, 추상메소드,일반 메소드, default 메소드, static 메소드
  모두 포함
- protected 접근 지정 불가
- 다중상속 지원 

- 추상메소드와 일반메소드 모두 포함
- 상수,변수필드 포함. 
- 추상메소드가 있으면 반드시 추상 클래스로 선언되어야 한다.

 

[memo]

 

인터페이스에서 레퍼런스 변수 선언은 가능하다.

추상메소드가 있으면 반드시 추상클래스로 선언해야한다.

추상클래스가 아닌채로 상속받으려면 반드시 추상메소드를 오버라이딩 해야한다.

추상클래스 안의 메소드에 body가 없으면 추상메소드로 선언해야한다. 

 

 

16번 

 

728x90
반응형

댓글