Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

UniCode

[이것이 자바다]CH07.상속(확인문제풀이) 본문

이것이 자바다

[이것이 자바다]CH07.상속(확인문제풀이)

Uni_code 2021. 4. 5. 13:16

1. 자바의 상속에 대한 설명 중 틀린 것은 무엇입니까?

① 자바는 다중 상속을 허용한다.

 

☞ 자바는 다른 언어와 달리 다중 상속을 허용하지 않는다. -> 하나만 상속 가능

 

2. 클래스 타입 변환에 대한 설명 중 틀린 것은 무엇입니까?

② 부모 객체는 항상 자식 타입으로 강제 타입 변환된다.

 

강제 타입 변환은 부모 클래스 타입으로 변환된 자식 객체만 가능하다. 

 

3. final 키워드에 대한 설명으로 틀린 것은?

① final 클래스는 부모 클래스로 사용할 수 있다.

② final 필드는 값이 저장된 후에는 변경할 수 없다.

③ final 메소드는 재정의(오버라이딩)할 수 없다.

④ static final 필드는 상수를 말한다.

 

☞ ① final 클래스는 부모 클래스로 사용할 수 있다.

클래스를 선언할 때 final 키워드를 class 앞에 붙이게 되면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다. 

대표적인 예 ) 자바 표준 API에서 제공하는 String클래스

 

4. 오버라이딩(Overriding)에 대한 설명으로 틀린 것은? 

① 부모 메소드의 시그니처(리턴 타입, 메소드명, 매개 변수)와 동일해야 한다.

② 부모 메소드보다 좁은 접근 제한자를 붙일 수 없다. (ex: public(부모) -> private(자식))

③ @Override 어노테이션을 사용하면 재정의가 확실한지 컴파일러가 검증한다.

④ protected 접근 제한을 갖는 메소드는 다른 패키지의 자식 클래스에서 재정의할 수 없다.

 

☞ ④ protected 접근 제한을 갖는 메소드는 다른 패키지의 자식 클래스에서 재정의할 수 없다.

protected : 같은 패키지 또는 다른 패키지내의 상속받은 자식 클래스에서 사용 가능

 

5. Parent 클래스를 상속해서 Child 클래스를 다음과 같이 작성했는데, Child 클래스의 생성자에서 컴파일 에러가 발생했습니다. 그 이유를 설명해보세요

public class Parent{
	public String name;
    
    //생성자
    public Parent(String name){
    	this.name = name;
    }
}
public class Child extends Parent{
	private int studentNo;
    
    public Child(String name, int studentNo){
    	//this.name = name;  (X)
        super(name); // 부모 생성자 호출 
        this.studentNo = studentNo;
    }
}

 

6. Parent 클래스를 상속받아 Child 클래스를 다음과 같이 작성했습니다. ChildExample 클래스를 실행했을 때 호출되는 각 클래스의 생성자의 순서를 생각하면서 출력 결과를 작성해보세요.

public class Parent{
	public String nation;
    
    // 부모 생성자1
    public Parent(){
    	this("대한민국"); // 자신의 생성자 호출 (부모 생성자 2 호출)
        System.out.println("Parent() call");
    }
    // 부모 생성자2
    public Parent(String nation){
    	this.nation = nation;
        System.out.println("Parent(String nation) call");
    }
}
public class Shild extends Parent{
	private String name;
    
    //자식 생성자 1
    public Child(){
    	// super();  // 컴파일 시 자동 생성 (부모 생성자 1 호출)
    	this("홍길동"); // 자신의 생성자 호출 (자식 생성자 2)
        System.out.println("Child() call");
    }
    //자식 생성자 2
    public Child(String name){
    	this.name = name;
        System.out.println("Child(String name) call");
    }
}
public class ChildExample{
	public static void main(String[] args){
    	Child child = new Child();
    }
}

☞ 실행 순서 : 부모생성자2 > 부모생성자1 > 자식생성자2 > 자식생성자1

    접근 순서 : 자식생성자1 > 부모생성자1 > 부모생성자2 > 자식생성자2

   

7. Tire 클래스를 상속받아 SnowTire 클래스를 다음과 같이 작성했습니다. SnowTireExample 클래스를 실행했을 때 출력 결과는 무엇일까요? 

public class Tire{
	public void run(){
    	System.out.println("일반 타이어가 굴러갑니다.");
    }
}
public class SnowTire extends Tire{
	@Override
    public void run(){
    	System.out.println("스노우 타이어가 굴러갑니다.");
    }
}
public class SnowTireExample {
	public static void main(String[] args){
    	SnowTire snowTire = new SnowTire();
        Tire tire = snowTire;   // 자동 타입 변환 (= Tire tire = new SnowTire();)
        
        snowTire.run();
        tire.run();
    }

}

☞ snowTire.run() > 스노우 타이어가 굴러갑니다 출력

    tire.run() > 스노우 타이어가 굴럽갑니다 출력

tire : 부모 클래스에 정의된 필드, 메소드 , 자식클래스에서 오버라이딩된 메소드 사용가능 

 

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

B b = □

메소드 선언 : void method(B b) {......}
메소드 호출 : method()



① new B( )

② (B) new A( ) // 강제 타입 변환

③ new D( )  // 자동 타입 변환

④ new E( )  // 자동 타입 변환

 

 

☞ 강제 타입 변환 : 부모클래스 변수명1 = new 자식클래스();

                          자식클래스 변수명2 = (자식클래스) 변수명1;

 

자식 타입이 부모 타입으로 자동 변환 되어 있을 경우만 가능