AR삽질러

이것이 자바다 - 7장 확인문제(상속) 본문

JAVA

이것이 자바다 - 7장 확인문제(상속)

아랑팡팡 2023. 2. 24. 12:31
728x90

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

정답 : 1 자바는 다중 상속을 허용한다.

 - 다른 언어와 달리 자바는 다중 상속을 허용하지 않는다. 즉 여러 개의 부모 클래스를 상속할 수 없다. 그러므로 extends뒤에는 단 하나의 부모 클래스만 와야한다.

 

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

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

 - 부모 객체가 자식 타입으로 강제 타입 변환되어도 실제 객체의 타입이 부모 클래스일 경우 런타임 에러가 발생할 수 있다. 이러한 상황에서는 instanceof 연산자를 사용하여 객체의 실제 타입을 확인한 후에 타입 변환을 시도한다.

 

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

정답 : 1 final클래스는 부모 클래스로 사용할 수 있다.

 - final 키워드는 클래스, 필드, 메소드 선언시에 사용할 수 있다. final 클래스는 다른 클래스의 상속 대상이 될 수 없다. final 클래스는 불변성을 가지며, 하위 클래스(subclass)를 생성할 수 없어 부모 클래스로 사용할 수 없다.

따라서, final 클래스는 자체적으로 독립적인 기능을 수행하며, 다른 클래스에서 확장해서 사용할 수 없다. final 클래스를 사용하려면 해당 클래스가 제공하는 기능을 직접 호출하거나, 해당 클래스와 상호작용하는 다른 클래스를 직접 작성해야 한다.

 

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

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

 

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

public class Parent {
	public String name;
	
	public Parent(String name) {
		this.name = name;
	}
}
public class Child {
	private int studentNo;
	
	public static void main(String[] args) {
		this.name = name;
		this.studentNo = studentNo;
	}
}

정답 :

1. Parent 클래스는 name 필드와 Parent 생성자를 가지고 있다.

2. Child 클래스는 Parent 클래스를 상속하고 studentNo 필드와 Child 생성자를 가지고 있다.

3. Child 클래스에서 Parent 클래스의 name 필드에 접근하기 위해 this.name = name 코드를 사용하고 있다. 

4. 자식클래스에서 부모클래스를 호출하지 않았다.

 

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

public class Parent {
	public String nation;
	
	public Parent() {
		this("대한민국");
		System.out.println("Parant() class");
	}
	
	public Parent(String nation) {
		this.nation = nation;
		System.out.println("Parent(String nation) call");
	}
}
public class Child extends Parent{
	private String name;
	
	public Child() {
		this("홍길동");
		System.out.println("Child() class");
	}
	
	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();
	}
}

정답 :

1. Child 클래스가 Parent 클래스를 상속하는 상속 관계를 가지고 있다.

2. Child 클래스에는 생성자가 두 개 정의되어 있고 Parent 클래스에는 기본 생성자와 매개변수를 받는 생성자가 정의되어 있다.

3. ChildExample 클래스에서 Child 클래스의 인스턴스를 생성할 때, 매개변수를 받지 않는 생성자를 호출하고 있다. 이때 Child 클래스의 생성자에서 this("홍길동") 코드가 호출되면서 Child 클래스의 매개변수를 받는 생성자가 호출됩니다.

4. Parent 클래스에 기본 생성자가 없으므로, Parent 클래스의 매개변수를 받는 생성자가 먼저 호출되고 nation 필드에 "대한민국"이 할당됩니다. 그리고 다시 Child 클래스의 생성자로 돌아와서 name 필드에 "홍길동"이 할당다.

 

 

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;
		
		snowTire.run();
		tire.run();
	}
}

정답 :

1. Tire 클래스를 상속하는 SnowTire 클래스를 정의하고, 이를 이용하여 SnowTireExample 클래스에서 SnowTire 인스턴스와 Tire 인스턴스를 생성하여 각각의 run() 메소드를 호출하는 코드입니다.

2. SnowTire 클래스는 Tire 클래스를 상속하므로, Tire 클래스의 run() 메소드를 오버라이딩하여 새로운 기능을 추가한 SnowTire 클래스의 run() 메소드가 호출됩니다. 따라서, snowTire.run() 코드는 "스노우 타이어가 굴러갑니다."라는 문자열이 출력됩니다.

3. Tire 인스턴스인 tire는 실제로는 SnowTire 클래스의 인스턴스를 참조하고 있으므로, Tire 클래스의 run() 메소드 대신 SnowTire 클래스의 run() 메소드가 호출됩니다.

4. 메소드 오버라이딩(overriding)되므로 tire.run() 코드도 "스노우 타이어가 굴러갑니다."라는 문자열이 출력됩니다.

 

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

B b = (   )

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

메소드 호출 : method(     )

 

정답 : 2 (B) new A() // 강제타입변

728x90
반응형
LIST