1절 상속
1. 자바의 상속 OX문제
① X -> 하나의 부모만 상속가능하다. 다중 상속을 허용하지않는다.
② O -> 오버라이딩의 개념 자체임
③ X -> 상속을 받았다면 부모 클래스의 private 멤버라도 상속받을 수 있다.
*④ O -> 답은 X임 공부할것
2. 메소드 재정의(오버라이딩) OX문제
① O
② X -> 접근 제한을 더 강하게 재정의할 수는 없다.
③ O
④ O
3. final 클래스, final 필드, final 메소드 OX문제
① X -> final 필드는 상속과 관련이 없다.
② X -> final 메소드를 가진 클래스는 부모 클래스가 될 수는 있지만 자식 클래스가 재정의를 할 수는 없다.
③ O
④ X -> final 클래스와 final 필드는 아무 관련이 없다
4.
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) {
super(name); // name 필드를 사용하려면 부모의 생성자를 super()를 통해 호출해야한다.
this.name = name;
this.studentNo = studentNo;
}
}
- 원래 부모 클래스의 생성자가 생략되어있다면 기본 생성자가 자동으로 생성되어 자식 클래스에서도 super(); 자동으로 생기는데
- 이 문제 같은 경우는 부모 클래스의 생성자가 명시적으로 선언 되었기 때문에 자식 클래스에서 부모클래스의 필드를 사용하기 위해서는 부모클래스의 명시적 생성자를 매개변수로 받으면서 호출해야한다.
- 그게 바로 super(name); 이다.
5.
public class Parent2 {
// 필드
public String nation;
// 생성자
public Parent2() {
this("대한민국");
System.out.println("Parent() call");
}
//생성자
public Parent2(String nation) {
this.nation = nation;
System.out.println("Parent(String nation) call");
}
}
public class Child2 extends Parent2 {
//필드
private String name;
//생성자
public Child2() {
this("홍길동");
System.out.println("Child() call");
}
//생성자
public Child2(String name) {
this.name = name;
System.out.println("Child(String name) call");
}
}
public class Child2Example {
public static void main(String[] args) {
Child2 child = new Child2(); // 자식 객체 생성이지만 그 전에 부모 객체가 먼저 생성됨!
}
}
Parent(String nation) call
Parent() call
Child(String name) call
Child() call
- 자식 객체를 생성하면 부모 객체가 먼저 생성됨. 그 다음에 자식 객체가 생성되는 것임
- 따라서 Parent 객체가 먼저 생성되므로 Parent 클래스부터 실행이 되는 것임
- 그런데 왜 Parent(String nation) call 가 Parent() call 보다 코드가 더 아래에 있으면서 더 먼저 출력이 되는 것일까?
2절 타입변환과 다형성
1. 클래스 타입 변환 OX문제
① O -> 자동 타입 변환의 의미 자체임
② O -> 항상 되는건 아님, 자식 타입이 부모 타입으로 자동 타입 변환이 된 경우에만 가능하다.
③ O -> 자동 타입 변환을 통해 자식 객체가 부모 타입의 필드와 메소드를 사용할 수 있어 다형성을 구현한다.
④ O
2. SnowTire 클래스 문제 - 메소드 오버라이딩과 자동 타입 변환 후 호출되는 메소드 문제
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(); // 스노우 타이어가 굴러갑니다.
}
}
3.
① O
② X -> A 클래스는 B 클래스의 부모인데 부모를 자식으로 타입 변환하는 강제 타입변환이므로 불가능하다.
③ O
④ O
4. setService 메소드의 매개변수 타입이 MemberService 이므로 MemberService 자신과 그 자식들은 매개값으로 올 수 있음
① X
② O
③ O
④ O
⑤ X
⑥ X
5.
멤버로그인
A 로그인
3절 추상 클래스
1. 추상 클래스 OX 문제
① O
② O
③ O
④ X
2. 추상 메소드 OX 문제
① O
② O
*③ O -> 실체 클래스에서 추상 메소드를 재정의하지 않으면 안된다. 그래서 만약에 추상 메소드를 재정의하지 않으려면 자식 클래스도 추상 클래스가 되어야한다.
④ X
3. 추상 메소드 재정의 문제
추상 클래스
public abstract class HttpServlet {
// 추상 메소드
public abstract void service();
}
실체 클래스 1
public class LoginServlet extends HttpServlet { // 1번. 꼭 상속 클래스를 작성해주어야함
// 추상 메소드 재정의
@Override
public void service() {
System.out.println("로그인 합니다."); // 2번. 실행 코드를 꼭 작성해주어야함
}
}
실체 클래스 2
public class FileDownloadServlet extends HttpServlet {
// 추상 메소드 재정의
@Override
public void service() {
System.out.println("파일 다운로드 합니다");
}
}
실행 클래스
public class HttpServletExample {
public static void main(String[] args) {
method(new LoginServlet());
}
public static void method(HttpServlet servlet) {
servlet.service();
}
}
'🤼♂️ 5. Project > 5-2 연습문제 풀이' 카테고리의 다른 글
[혼자공부하는자바] 9장 중첩 클래스와 중첩 인터페이스 (0) | 2021.08.11 |
---|---|
[혼자공부하는자바] 8장 인터페이스 (0) | 2021.08.11 |
[혼자공부하는자바] 6장 클래스 (0) | 2021.08.02 |
[혼자공부하는자바] 5장 참조타입 (0) | 2021.07.30 |
[혼자공부하는자바] 4장 조건문과 반복문 (0) | 2021.07.29 |
댓글