Chapter 07 상속

손은영·2022년 3월 30일
1

Java

목록 보기
2/3
post-thumbnail

07-1 상속

클래스 상속

  • 자식이 부모를 선택
  • 자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 결정
  • 선택된 부모 클래스는 extends 뒤에 기술

ex) Car 클래스를 상속해서 SportsCar 클래스를 설계

class SportsCar(자식) extends Car(부모) {
	// field
	// constructor
	// method
}



상속 특징

  1. 여러 개의 부모 클래스 상속 ❌
  2. 부모 클래스에 private 접근 제한을 갖는 필드와 메소드는 상속 대상 ❌
  3. 부모 클래스와 자식 클래스가 다른 패키지에 존재하면,
    default 접근 제한을 갖는 필드와 메소드도 상속 대상 ❌



super();

  • super(매개값, ...); 는 매개값의 타입과 일치하는 부모 생성자를 호출
  • 부모 클래스에 기본 생성자가 없고 매개 변수가 있는 생성자만 있다면 자식 생성자에서 반드시 부모 생성자 호출을 위해 super(매개값, ...); 를 명시적으로 호출
  • super(매개값, ...); 는 반드시 자식 생성자 첫 줄에 위치



메소드 재정의(Overriding)

  • 부모 클래스의 어떤 메소드는 자식 클래스가 사용하기에 적합하지 않을 수도 있음
  • 상속된 일부 메소드를 자식 클래스에서 다시 수정해서 사용

<메소드 재정의 방법>

  • 부모의 메소드와 동일한 리턴 타입, 메소드 이름, 매개변수목록
  • 접근 제한을 더 강하게 할 수 없음
  • 새로운 예외(Exception)을 throws 할 수 ❌
  • 부모 메소드를 불러와야할 경우 ⇒ super.부모메소드();


final 클래스와 final 메소드

  • 상속할 수 없는 final 클래스
    • 클래스를 선언할 때 final 키워드를 붙이면,
      최종적인 클래스가 되며 상속할 수 ❌
    • 대표적인 예: String 클래스
  • 재정의할 수 없는 final 메소드
    • 메소드를 선언할 때 final 키워드를 붙이면,
      최종적인 메소드가 되며 재정의할 수 ❌
    • 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 ❌





07-2 타입 변환과 다형성

  • 다형성 : 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질 (사용 방법은 동일)
    : 메소드 재정의 + 타입 변화 ⇒ 다형성



자동 타입 변환

  • 타입 변환: 다른 타입으로 변환하는 행위
  • 클래스 변환
    - 상속 관계에 있는 클래스 사이에서 발생
    - 자식은 부모 타입으로 자동 타입 변환이 가능
  • 자동 타입 변환
    - 프로그램 실행 도중에 자동으로 타입 변환이 일어나는 것
    - 자식은 부모의 특징과 기능을 상속 받기 때문에 부모와 동일하게 취급될 수 O
    - 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근 가능

❗️메소드가 자식 클래스에서 재정의 되었다면 자식 클래스의 메소드가 대신 호출됨❗️


필드의 다형성

왜? 자동 타입 변환이 필요한가?

⇒ 다형성을 구현하기 위해서

  • 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들을 저장할 수 O
    ⇒ 필드 사용 결과가 달라질 수 있다 ⇒ 필드의 다형성



매개 변수의 다형성

  • 메소드를 호출할 때, 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석
  • 하지만 매개값을 다양화하기 위해 매개 변수에 자식 객체를 지정할 수도 O



강제 타입 변환

  • 부모 타입을 자식 타입으로 변환하는 것
  • 모든 부모 타입을 자식 타입으로 강제 변환할 수 있는 것은 ❌
  • 자식 타입이 부모 타입으로 자동 타입 변환 후,
    다시 자식 타입으로 변환될 때 강제 타입 변환 사용 O
    Parent parent = new Child(); // 자동 타입 변환
    Child child = (Child)parent; // 강제 타입 변환
  • 자식 타입이 부모 타입으로 자동 타입 변환하면, 부모에 선언된 필드와 메소드만 사용 가능하다.
  • 자식의 필드와 메소드를 사용하고 싶다면, 강제 타입 변환을 해서 사용 가능



객체 타입 확인

  • 처음부터 부모 타입으로 생성된 객체는 자식 타입으로 변환할 수 ❌
Parent parent = new Parent(); 
Child child = (Child)parent; // 강제 타입 변환 ❌

<부모 변수가 참조하는 객체가 부모 객체인지 자식 객체인지 확인하는 방법>

instanceof 연산자 사용: 어떤 객체가 어떤 클래스의 인스턴스인지 확인

💡 boolean result = 좌향(객체) instanceof 우향(타입)
  • 좌향의 객체가 우향의 인스턴스이면 true, 아니면 false
  • instanceof 연산자는 주로 매개값의 타입을 조사할 때 사용 (메소드 내에서 강제 타입 변환이 필요한 경우)
public void method(Parent parent) {
	if(parent instanceof Child) {
		Child child = (Child) parent;
	}
}





07-3 추상 클래스

  • 객체를 직접 생성할 수 있는 클래스를 실체 클래스 라고 한다면,
    이 클래스들의 공통적인 특성을 추출해서 선한 클래스를 추상 클래스 라고 한다.
  • 추상 클래스와 실체 클래스는 상속 관계 (부모: 추상, 자식: 실체)



추상 클래스의 용도

  1. 공통된 필드와 메소드의 이름을 통일할 목적
  • 데이터와 기능이 모두 동일해도 이름이 다르기 때문에 객체마다 사용 방법이 달라짐
    ⇒ 추상 클래스를 사용하여 필드와 메소드 이름 통일
  1. 실체 클래스를 작성할 때 시간 절약
  • 공통적인 필드와 메소드는 추상 클래스에 모두 선언해두고,
    다른 점만 실체 클래스에 선언하면 실체 클래스를 작성하는 시간을 절약할 수 O



추상 클래스 선언

  • 클래스 선언에 abstract 키워드를 붙어야 함
  • abstract를 붙이면 new 연산자를 이용해서 객체를 만들지 ❌
  • 상속을 통해 자식 클래스만 만들 수 O
public abstract class 클래스 {
	// field
	// constructor
	// method
}



추상 메소드와 재정의

  • 모든 실체들이 가지고 있는 메소드의 실행 내용이 동일하다면, 추상 클래스에 메소드를 작성하는 것이 좋다!

하지만, 메소드 선언만 동일하고, 실행 내용은 실체 클래스마다 달라야 하는 경우 발생!

추상 메소드 선언!

  • 추상 메소드는 abstract 키워드와 함께 메소드의 선언부만 있고 실행 내용(중괄호)가 없는 메소드
💡 [public | protected] abstract 리턴타입 메소드이름(매개변수, ...);
  • 하위 클래스가 반드시 실행 내용을 채우도록 강제하고 싶은 메소드가 있을 경우 추상 메소드로 선언
  • 자식 클래스는 반드시 추상 메소드를 재정의해서 실행 내용 작성
profile
정글에서 살아남기

0개의 댓글