
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 |