[이것이 자바다] 07. 상속

SeonJin·2023년 8월 29일
0

Java

목록 보기
5/11

📚 이것이 자바다 [개정판]


sec02. 클래스 상속

  • public class 자식클래스 extends 부모클래스{}
  • 부모 클래스의 필드와 메소드를 자식 클래스에 물려주는 것
  • 자식 클래스를 선언할 때 상속받을 부모 클래스를 선택한다
  • 자바는 다중 상속을 허용하지 않으므로, extends 뒤에는 단 하나의 부모 클래스만 올 수 있다

sec03. 부모 생성자 호출

  • 자식 객체를 생성하면 부모 객체가 먼저 생성된 다음 자식 객체가 생성된다
  • 참조변수는 자식 객체의 주소를 받고 부모 객체를 상속한다
  • super()는 컴파일 과정에서 자동 추가되어 부모의 기본 생성자를 호출한다
  • 부모 객체에 기본생성자가 없다면 자식 클래스에 에러가 발생한다
  • 기본 생성자는 super()을 생략할 수 있지만, 매개변수가 있는 생성자의 경우 super(매개변수, …)를 생략할 수 없다
// 자식 생성자를 선언할 때 부모의 생성자를 호출한 후 사용
public 자식클래스() {
	super(매개값, ...);

sec04. 메소드 재정의 (오버라이딩)

  • 부모 메소드 중 자식 클래스가 사용하기에 적합하지 않은 경우, 자식 클래스에서 메소드를 재정의하는 것이다
  • 오버라이딩이 되었다면 자식 메소드가 우선적으로 사용된다
  • 규칙
    • 부모 메소드의 선언부(리턴타입, 메소드명, 매개변수)와 동일해야 한다
    • 접근 제한자를 더 강하게 오버라이딩 할 수는 없다 (public→private 불가능)
    • 새로운 예외를 throws할 수 없다

@Override 애노테이션
컴파일 시 정확히 오버라이딩 되었는지 체크해주는 역할
생략 가능하다

  • super.메소드명();을 통해 부모 메소드를 호출하고 변경/추가 할 내용을 작성한다

sec05. final 클래스&메소드

  • final 필드는 초기값 설정 후 값을 변경할 수 없다
  • final 클래스는 최종 클래스이므로 더 이상 상속할 수 없다
  • final 메소드는 최종 메소드이므로 오버라이딩 할 수 없다

💡 final 클래스, final 메소드
최종적인 클래스이므로 더 이상 상속할 수 없다
최종적인 메소드이므로 오버라이딩 할 수 없는 메소드가 된다


sec07. 타입 변환

자동 타입 변환 (Upcasting)

  • 부모타입 변수 = 자식타입객체;
  • 자식은 부모로부터 상속 받으므로 부모와 동일 취급
  • 부모 타입으로 자동 타입 변환이 이루어지면?
  • 자식 객체를 참조하지만, 부모 클래스 멤버만 접근 할 수 있다
  • 단, 자식 클래스에 오버라이딩된 메소드가 있다면 그 메소드를 호출한다 → 다형성 관련
    Cat cat = new Cat();
    Animal animal = cat;
    // 또는
    Animal animal = new Cat();
    // cat == animal -> true

강제 타입 변환 (Downcasting)

  • 자식타입 변수 = (자식타입) 부모타입객체;
  • 부모 타입은 자식 타입으로 자동 변환되지 않으므로 캐스팅 연산자를 사용한다
  • 자식 객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때만 강제 타입 변환을 사용할 수 있다
  • 자식 타입에 선언된 필드와 메소드를 꼭 사용해야 하는 경우 필요로 한다

sec08. 다형성(polymorphism)

  • 자동 타입 변환 + 메소드 오버라이딩 ⇒ 다형성
  • 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질
  • 사용 방법이 동일하다는 것은 동일한 메소드를 가지고 있다는 것 (오버라이딩을 통해 실행 결과가 다양하게 나온다)

필드 다형성: 필드 타입 동일, 대입 객체의 차이

class Car {
	String tire;
}

class CarMain {
	Car myCar = new Car();
	myCar.tire = new HankookTire(); // 한국타이어 장착
	myCar.tire = new KumhoTire(); // 금호타이어 장착

// 한국타이어, 금호타이어에 메소드 오버라이딩이 된 경우 
// 각 객체의 오버라이딩된 메소드가 호출된다

매개변수 다형성

// Bus와 Taxi 객체는 Vihicle를 상속함
// 클래스 타입(Vehicle)의 매개변수를 가진 메소드인 경우에
// 자동 타입 변환으로 인해 Vehicle의 자식 객체 제공도 가능하다

public class Driver {
	// 클래스 타입의 매개변수를 가짐
	public void drive(Vehicle cehicle) {
		vehicle.run();
	}
}

// Main
Driver driver = new Driver();

// 매개값으로 Bus/Taxi 객체 제공
Bus bus = new Bus(); 
driver.drive(bus)
// 또는
driver.drive(new Taxi());

sec09. 객체 타입 확인

  • 객체 instanceof 타입;
  • 변수가 참조하는 객체의 타입을 확인하고자 할 때 사용한다
  • 좌항의 객체가 우항의 타입이면 true, 아니면 false 산출

💡 Java12부터 instanceof 연산의 결과가 true일 경우, 우측 타입 변수를 사용할 수 있으므로 강제 타입 변환이 필요없다.
if(parent instanceof CHild child) {} → child 변수 사용


sec10. 추상 클래스

  • public abstract class 클래스명 {}
  • abstract 리턴타입 메소드명(매개변수, ...)
  • 공통적인 필드나 메소드를 추출해서 선언한 클래스
  • 실체 클래스의 부모 역할을 한다
  • new 연산자를 사용해서 객체를 직접 생성할 수 없다
  • 실체 클래스를 만들기 위한 부모 클래스로만 사용된다(상속필수)
profile
study notebook

0개의 댓글