이것이 자바다 7장 확인문제

  1. 자바의 상속에 대한 설명 중 틀린 것은 무엇입니까?
    ① 자바는 다중 상속을 허용한다.
    ② 부모의 메소드를 자식 클래스에서 재정의(오버라이딩) 할 수 있다.
    ③ 부모의 private 접근 제한을 갖는 필드와 메소드는 상속의 대상이 아니다.
    ④ final 클래스는 상속할 수 없고, final 메소드는 오버라이딩 할 수 없다.

    1번 정답

    답 : ①
    자바는 다른 언어와 달리 다중 상속을 허용하지 않는다.


  2. 클래스의 타입 변환에 대한 설명 중 틀린 것은 무엇입니까?
    ① 자식 객체는 부모 타입으로 자동 타입 변환된다.
    ② 부모 객체는 항상 자식 타입으로 강제 타입 변환된다.
    ③ 자동 타입 변환을 이용해서 필드와 매개 변수의 다형성을 구현한다.
    ④ 강제 타입 변환 전에 instanceof 연산자로 변환 가능한지 검사하는 것이 좋다.

    2번 정답

    답 : ②
    항상 부모 객체가 자식 타입으로 변환될 수 있는 것은 아니다.
    자식 타입이 부모 타입으로 자동 변환한 후, 다시 자식 타입으로 변환할 때 사용 가능하다.


  3. final 키워드에 대한 설명으로 틀린 것은?
    ① final 클래스는 부모 클래스로 사용할 수 있다.
    ② final 필드는 값이 저장된 후에는 변경할 수 없다.
    ③ final 메소드는 재정의(오버라이딩) 할 수 없다.
    ④ static final 필드는 상수를 말한다.

    3번 정답

    답 : ①
    final 키워드를 class 앞에 붙이면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스이다.
    (부모 클래스로 사용 불가능)


  4. 오버라이딩(Overriding) 에 대한 설명으로 틀린 것은?
    ① 부모 메소드의 시그너처(리턴 타입, 메소드명, 매개 변수) 와 동일해야 한다.
    ② 부모 메소드보다 좁은 접근 제한자를 붙일 수 있다. ( public (부모) → private (자식) )
    ③ @Override 어노테이션을 사용하면 재정의가 확실한지 컴파일러가 검증한다.
    ④ protected 접근 제한을 갖는 메소드는 다른 패키지의 자식 클래스에서 재정의할 수 없다.

    4번 정답

    답 : ④
    protected 접근 제한자는 같은 패키지 내에서는 접근 제한이 없지만
    같은 패키지의 자식 클래스와 다른 패키지라도 상속받은 자식 클래스에서는 사용(재정의)할 수 있다.


  5. Parent 클래스를 상속해서 Child 클래스를 다음과 같이 작성했는데, Child 클래스의 생성자에서 컴파일 에러가 발생했습니다. 그 이유를 설명해보세요.
    • Parent.java
      1
      2
      3
      4
      5
      6
      7
      
       public class Parent {
         public String name;
      
         public Parent(String name) {
             this.name = name;
         }
       }
      
    • Child.java
      1
      2
      3
      4
      5
      6
      7
      8
      
        public class Child extends Parents {
            private int studentNo;
      
            public Child(String name, int studentNo) {
                this.name = name;
                this.studentNo = studentNo;
            }
        }
      
    5번 정답

    답 : 자식 클래스에서 부모 생성자를 호출해야 한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     public class Child extends Parents {
         private int studentNo;
    
         public Child(String name, int studentNo) {
             // this.name = name;    (X)
             super(name);    //부모 생성자 호출
             this.studentNo = studentNo;
         }
     }
    


  6. Parent 클래스를 상속밭아 Child 클래스를 다음과 같이 작성했습니다. ChildExample 클래스를 실행했을 때 호출되는 각 클래스의 생성자의 순서를 생각하면서 출력 결과를 작성해보세요.
    • Parent.java
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
       public class Parent {
         public String nation;
      
         public Parent() {
             this("대한민국");
             System.out.println("Parent() call");
         }
      
         public Parent(String nation) {
             this.nation = nation;
             System.out.println("Parent(String nation) call");
         }
       }
      
    • Child.java
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
        public class Child extends Parent {
            private String name;
      
            public Child() {
                this("홍길동");
                System.out.println("Child() call");
            }
      
            public Child(String name) {
                this.name = name;
                System.out.println("Child(String name) call");
            }
        }
      
    • ChildExample.java
      1
      2
      3
      4
      5
      
        public class ChildExample {
            public static void main(String[] args) {
                Child child = new Child();
            }
        }
      
    6번 정답

    답 : 출력 결과

    1. Parent(String nation) call
    2. Parent() call
    3. Child(String name) call
    4. Child() call

    Child 객체를 생성하면 Child child = new Child();

    먼저 Child 클래스(자식)가 상속받고 있는 Parent 생성자(부모)로 초기화 진행

    기본 생성자를 수행하다보면 this(“대한민국”); 을 만나서 Parent(String nation) 먼저 수행

    다시 Parent() 로 돌아와서 수행

    Child 생성자에서 this(“홍길동”); 을 만나서 Child(String name) 호출

    다시 Child()를 수행


  7. Tire 클래스를 상속받아 SnowTire 클래스를 다음과 같이 작성했습니다. SnowTireExample 클래스를 실행했을 때 출력 결과는 무엇일까요?
    • Tire.java
      1
      2
      3
      4
      5
      
      public class Tire {
       public void run() {
         System.out.println("일반 타이어가 굴러갑니다. ");
       }
      }
      
    • SnowTire.java
      1
      2
      3
      4
      5
      6
      
        public class SnowTire extends Tire {
            @Override
            public void run() {
                System.out.println("스노우 타이어가 굴러갑니다. ");
            }
        }
      
    • SnowTireExample.java
      1
      2
      3
      4
      5
      6
      7
      8
      9
      
        public class SnowTireExample {
            public static void main(String[] args) {
                SnowTire snowTire = new SnowTire();
                Tire tire = snowTire;
      
                snowTire.run();
                tire.run();
            }
        }
      
    7번 정답

    답 : “스노우 타이어가 굴러갑니다. “ “스노우 타이어가 굴러갑니다. “


    snowTire.run() 는 SnowTire 의 객체이므로
    스노우 타이어가 굴러갑니다. 출력

    tire.run() 은 메소드 오버라이딩으로 자식 객체의 메소드가 출력되기 때문에
    스노우 타이어가 굴러갑니다. 출력


  8. A, B, C, D, E, F 클래스가 다음과 같이 상속 관계에 있을 때 다음 빈칸에 들어올 수 없는 코드는?

    B b = [ 빈칸 ]

    메소드 선언 : void method(B b) {…}
    메소드 호출 : method( [ 빈칸 ] )

    ① new B()
    ② (B) new A() //강제 타입 변환
    ③ new D() //자동 타입 변환
    ④ new E() //자동 타입 변환

    8번 정답

    답 : ②

    강제 타입 변환(Casting)은 부모 타입을 자식 타입으로 변환하는 것으로
    자식 타입이 부모 타입으로 자동 변환되어 있을 경우 다시 자식 타입으로 변환하는 경우에만 가능하다.

    A a = new B(); //부모타입 변환
    B b = (b) a; //다시 자식 타입으로 강제 타입 변환


🌞 정보 : 공부 기록용 블로그입니다. 오타나 내용 오류가 있을 경우 알려주시면 감사하겠습니다.

댓글남기기