본문 바로가기
🤼‍♂️ 5. Project/5-2 연습문제 풀이

[혼자공부하는자바] 7장 상속

by 달님🌙 2021. 8. 6.
반응형

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();
	}
}

 

 

반응형

댓글