1. 자바의 상속에 대한 설명 중 틀린 것은 무엇입니까? (1)
① 자바는 다중 상속을 허용한다. -> 다중 상속 불가
② 부모의 메소드를 자식 클래스에서 재정의(오버라이딩) 할 수 있다.
③ 부모의 private 접근 제한을 갖는 필드와 메소드는 상속의 대상이 아니다.
④ final 클래스는 상속할 수 없고, final 메소드는 오버라이딩할 수 없다.
2. 클래스 타입 변환에 대한 설명 중 틀린 것은 무엇입니까? (2)
① 자식 객체는 부모 타입으로 자동 타입 변환된다. -> Parent parent = new Child();
② 부모 객체는 항상 자식 타입으로 강제 타입 변환된다. -> Child child = (Child) parent; -> 먼저 자동 타입 변환이 되었어야 한다.
③ 자동 타입 변환을 이용해서 필드와 매개 변수의 다형성을 구현한다.
④ 강제 타입 변환 전에 instanceof 연산자로 변환 가능한지 검사하는 것이 좋다.
3. final 키워드에 대한 설명으로 틀린 것은? (1)
① final 클래스는 부모 클래스로 사용할 수 있다. -> 없다.
② fianl 필드는 값이 저장된 후에는 변경할 수 없다.
③ final 메소드는 재정의(오버라이딩)할 수 없다.
④ static final 필드는 상수를 말한다.
4. 오버라이딩(Overriding)에 대한 설명으로 틀린 것은? (4)
① 부모 메소드의 시그너처(리턴 타입, 메소드명,매개 변수)와 동일해야 한다.
② 부모 메소드보다 좁은 접근 제한자를 붙일 수 없다. (예: public(부모) → private(자식))
③ @Override 어노테이션을 사용하면 재정의가 확실한지 컴파일러가 검증한다.
④ protected 접근 제한을 갖는 메소드는 다른 패키지의 자식 클래스에서 재정의할 수 없다. -> protected는 다른 패키지더라도 자식 클래스이면 접근 가능하다.
5. Parent 클래스를 상속해서 Child 클래스를 다음과 같이 작성했는데, Child 클래스의 생성자에서 컴파일 에러가 발생했습니다. 그 이유를 설명해보세요.
package exercise.Exercise05;
public class Parent {
//필드
public String name;
//생성자 (default 생성자가 없음)
public Parent(String name) {
this.name = name;
}
}
package exercise.Exercise05;
public class Child extends Parent {
//필드
private int studentNo;
//생성자
public Child(String name, int studentNo) {
super(name); //Parent 클래스의 default 생성자가 없어서 super(매개변수)하여 호출해야함
this.studentNo = studentNo;
}
}
6. Parent 클래스를 상속받아 Child 클래스를 다음과 같이 작성했습니다. ChildExample 클래스를 실행했을 때 호출되는 각 클래스의 생성자의 순서를 생각하면서 출력 결과를 작성해보세요.
package exercise.Exercise06;
public class Parent {
//필드
public String nation;
//생성자
public Parent() { //default 생성자
this("대한민국"); //③ 매개변수를 가지고 있는 생성자 호출 (아래 생성자)
System.out.println("Parent() call");
}
public Parent(String nation) {
this.nation = nation; //④
System.out.println("Parent(String nation) call");
}
}
package exercise.Exercise06;
public class Child extends Parent {
//필드
private String name;
//생성자
public Child() {
this("홍길동"); //ⓡ 매개변수를 가지고 있는 생성자를 호출 (아래 생성자)
System.out.println("Child() call");
}
public Child(String name) {
this.name = name; //② Parent 클래스의 default 생성자 호출
System.out.println("Child(String name) call");
}
}
package exercise.Exercise06;
public class ChildExample {
public static void main(String[] args) {
Child child = new Child();
}
}
Parent(String nation) call
Parent() call
Child(String name) call
Child() call
7. Tire 클래스를 상속받아 SnowTire 클래스를 다음과 같이 작성했습니다. SnowTireExample 클래스를 실행했을 때 출력 결과는 무엇일까요?
package exercise.Exercise07;
public class Tire {
//메소드
public void run() {
System.out.println("일반 타이어가 굴러갑니다.");
}
}
package exercise.Exercise07;
public class SnowTire extends Tire {
//메소드
@Override
public void run() {
System.out.println("스노우 타이어가 굴러갑니다.");
}
}
package exercise.Exercise07;
public class SnowTireExample {
public static void main(String[] args) {
SnowTire snowTire = new SnowTire();
Tire tire = snowTire;
snowTire.run();
tire.run(); //run() 메소드는 자식 클래스에서 오버라이딩 되었으므로, 자식 객체에서 메소드를 불러온다.
}
}
스노우 타이어가 굴러갑니다.
스노우 타이어가 굴러갑니다.
8. A, B, C, D, E, F 클래스가 다음과 같이 상속 관계에 있을 때 다음 빈칸에 들어올 수 없는 코드는?
A ← C ← F
↑
B ← E
↑
D
B b = ①
메소드 선언: void method(B b) {...}
메소드 호출: method(② )
① new B()
② (B) new A() //강제 타입 변환
③ new D() //자동 타입 변환
④ new E() //자동 타입 변환
'Java > 7. 상속 (Inheritance)' 카테고리의 다른 글
Day 10 : 추상 메소드와 오버라이딩 (0) | 2021.11.01 |
---|---|
Day 10 : 추상 클래스 선언 (0) | 2021.11.01 |
Day 10 : 객체 타입 확인 (instanceof) (0) | 2021.11.01 |
Day 10 : 강제 타입 변환 (Type Casting) (0) | 2021.11.01 |
Day 10 : 매개 변수의 다형성 (0) | 2021.11.01 |