0. 문제
➡ 정답
(설명)
1. 자바의 상속에 대한 설명 중 틀린 것은 무엇입니까?
➡ 자바는 다중 상속을 허용한다.
(설명) 문법적인 한계! 자바는 단일 상속만을 지원한다.
ex) 다이아몬드 문제
2. 클래스 타입 변환에 대한 설명 중 틀린 것은 무엇입니까?
➡ 부모 객체는 항상 자식 타입으로 강제 타입 변환된다.
(설명)
X 항상 되는 것은 아니다!
3. final 키워드에 대한 설명으로 틀린 것은?
➡ final 클래스는 부모 클래스로 사용할 수 있다.
(설명)
final 키워드는 해당 선언이 최종 상태이고, 결코 수정될 수 없음을 뜻한다.
때문에 final 키워드를 class 앞에 붙이게 되면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다!
4. 오버라이딩(Overriding)에 대한 설명으로 틀린 것은?
➡ 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; // 이 부분을 super(name);으로 변경해야 한다!
this.studentNo = studentNo;
}
}
(설명)
부모 클래스 생성자를 먼저 super를 통해 정의해야 한다.
왜? ➡ 매개변수가 다를 경우, 컴파일러가 super()를 자동으로 추가되지 않기 때문이다.
6. Parent 클래스를 상속받아 Child 클래스를 다음과 같이 작성했습니다.
ChildExample 클래스를 실행했을 때 호출되는 각 클래스의 생성자의 순서를 생각하면서 출력 결과를 작성해보세요.
public class Parent {
public String nation;
public Parent() {
this("대한민국");
System.out.println("Parent() call"); // 2
}
public Parent(String nation) {
this.nation = nation;
System.out.println("Parent(String nation) call"); // 1
}
}
public class Child extends Parent {
private String name;
public Child() {
this("홍길동");
System.out.println("Child() call"); // 4
}
public Child(String name) {
super(); // 컴파일러 자동추가
this.name = name;
System.out.println("Child(String name) call"); // 3
}
}
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
(설명)
부모 생성자 호출은 super(); 로 컴파일러 자동추가(5번과 다름 주의)
** 호출되는 순서 잘 확인하기
1. 상속받는 Parent 생성자로 먼저 초기화를 진행 ➡ this()를 만나서 Parent(String nation) 먼저 수행하게 된다.
2. 그 다음 Parent() 수행
3. Child()에서 this()를 부르기 때문에 Child(String name)을 호출한 후 Child()가 수행됨
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();
}
}
➡
스노우 타이어가 굴러갑니다.
스노우 타이어가 굴러갑니다.
(설명)
tire.run()은 tire 클래스를 구현하고 있는 snowTire를 넣어 초기화를 시켜줌
결국 snowTire.run();과 tire.run();은 같은 결과를 가져올 수 밖애 없음
8번 문제는 생략합니다.
'🤯TIL > JAVA' 카테고리의 다른 글
[연산자] 복합대입 연산자? (0) | 2023.01.19 |
---|---|
[이것이 자바다 - 연습문제] chapter 08. 인터페이스 (0) | 2022.11.09 |
[이것이 자바다 - 연습문제] chapter 06. 클래스 (0) | 2022.11.07 |
[이것이 자바다 - 연습문제] chapter 05. 참조 타입 (0) | 2022.10.13 |
[이것이 자바다 - 연습문제] chapter 04. 조건문과 반복문 (0) | 2022.10.11 |