📚 이것이 자바다 [개정판]
public class 자식클래스 extends 부모클래스{}
- 부모 클래스의 필드와 메소드를 자식 클래스에 물려주는 것
- 자식 클래스를 선언할 때 상속받을 부모 클래스를 선택한다
- 자바는 다중 상속을 허용하지 않으므로, extends 뒤에는 단 하나의 부모 클래스만 올 수 있다
- 자식 객체를 생성하면 부모 객체가 먼저 생성된 다음 자식 객체가 생성된다
- 참조변수는 자식 객체의 주소를 받고 부모 객체를 상속한다
- super()는 컴파일 과정에서 자동 추가되어 부모의 기본 생성자를 호출한다
- 부모 객체에 기본생성자가 없다면 자식 클래스에 에러가 발생한다
- 기본 생성자는 super()을 생략할 수 있지만, 매개변수가 있는 생성자의 경우 super(매개변수, …)를 생략할 수 없다
// 자식 생성자를 선언할 때 부모의 생성자를 호출한 후 사용
public 자식클래스() {
super(매개값, ...);
- 부모 메소드 중 자식 클래스가 사용하기에 적합하지 않은 경우, 자식 클래스에서 메소드를 재정의하는 것이다
- 오버라이딩이 되었다면 자식 메소드가 우선적으로 사용된다
- 규칙
- 부모 메소드의 선언부(리턴타입, 메소드명, 매개변수)와 동일해야 한다
- 접근 제한자를 더 강하게 오버라이딩 할 수는 없다 (public→private 불가능)
- 새로운 예외를 throws할 수 없다
@Override 애노테이션
컴파일 시 정확히 오버라이딩 되었는지 체크해주는 역할
생략 가능하다
super.메소드명();
을 통해 부모 메소드를 호출하고 변경/추가 할 내용을 작성한다
- final 필드는 초기값 설정 후 값을 변경할 수 없다
- final 클래스는 최종 클래스이므로 더 이상 상속할 수 없다
- final 메소드는 최종 메소드이므로 오버라이딩 할 수 없다
💡 final 클래스, final 메소드
최종적인 클래스이므로 더 이상 상속할 수 없다
최종적인 메소드이므로 오버라이딩 할 수 없는 메소드가 된다
부모타입 변수 = 자식타입객체;
- 자식은 부모로부터 상속 받으므로 부모와 동일 취급
- 부모 타입으로 자동 타입 변환이 이루어지면?
- 자식 객체를 참조하지만, 부모 클래스 멤버만 접근 할 수 있다
- 단, 자식 클래스에 오버라이딩된 메소드가 있다면 그 메소드를 호출한다 → 다형성 관련
Cat cat = new Cat(); Animal animal = cat; // 또는 Animal animal = new Cat(); // cat == animal -> true
자식타입 변수 = (자식타입) 부모타입객체;
- 자동 타입 변환 + 메소드 오버라이딩 ⇒ 다형성
- 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질
- 사용 방법이 동일하다는 것은 동일한 메소드를 가지고 있다는 것 (오버라이딩을 통해 실행 결과가 다양하게 나온다)
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());
객체 instanceof 타입;
- 변수가 참조하는 객체의 타입을 확인하고자 할 때 사용한다
- 좌항의 객체가 우항의 타입이면 true, 아니면 false 산출
💡 Java12부터 instanceof 연산의 결과가 true일 경우, 우측 타입 변수를 사용할 수 있으므로 강제 타입 변환이 필요없다.
if(parent instanceof CHild child) {}
→ child 변수 사용
public abstract class 클래스명 {}
abstract 리턴타입 메소드명(매개변수, ...)
- 공통적인 필드나 메소드를 추출해서 선언한 클래스
- 실체 클래스의 부모 역할을 한다
- new 연산자를 사용해서 객체를 직접 생성할 수 없다
- 실체 클래스를 만들기 위한 부모 클래스로만 사용된다(상속필수)