: 이미 잘 개발된 부모 클래스를 재사용해 자식 클래스에게 물려주기 때문에 중복되는 코드를 줄여 개발 시간을 단축시킴
: 사실 자식이 부모를 선택하는 방법
: 자식 객체를 생성하면 부모 객체가 먼저 생성된 다음에 자식 객체 생성
자식클래스 변수 = new 자식클래스();

- 생성자가 없을 경우 자동으로 no-parameter 생성자가 만들어짐
-> 생성자가 하나라도 있을 경우 자동으로 만들어지지 않음- 모든 자식클래스의 생성자는 먼저 부모클래스의 생성자 호출
-> super()를 통해 명시적으로 호출
-> 그렇지 않을 경우, 자동으로 no-parameter 생성자 호출- 부모클래스에 no-parameter 생성자가 없는데 자식클래스의 생성자에서 super()호출을 안 해주는 오류 흔함
: 부모 클래스의 메소드가 자식 클래스에 딱 맞지 않을 때, 자식 클래스에서 메소드를 재정의해서 사용하는 것
규칙
: 메소드를 재정의하면 자식 메소드에서 1줄만 추가하고 싶더라도 부모 메소드의 내용을 다시 작성해야 함
-> 공동 작업 처리 기법 이용하여 해결
class Parent {
public void method() {
...
}
}
class Child extends Parent {
@Override
// 재정의된 메소드
public void method() {
super.method();
}
}
: final을 붙이면 더 이상 상속할 수 없는 클래스가 됨
-> 자식을 만들 수 없음
: final을 붙이면 오버라이딩 할 수 없는 메소드가 됨
-> 부모클래스에 선언된 final 메소드는 자식 클래스에서 재정의 못 함

: 클래스의 타입 변환은 상속 관계에 있는 클래스 사이에서 발생

Cat cat = new Cat();
// 부모타입 변수 = 자식타입 객체
Animal animal = cat;
Animal animal = new Cat();



: 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질

- 객체 사용 방법이 동일하다는 것은 동일한 메소드를 가지고 있다는 뜻
- 타이어 : 부모 메소드 / 금호 타이어 : 자식 메소드 / 한국 타이어 : 자식 메소드
- 한국 타이어와 금호 타이어가 타이어 메소드를 오버라이딩 하고 있다면, 타이어 메소드 호출 시 오버라이딩된 메소드가 호출됨
- 오버라이딩된 내용은 두 타이어가 다르기 때문에 실행 결과가 다름
: 필드 타입은 동일하지만 대입되는 객체가 달라져서 실행 결과가 다르게 나올 수 있는 것
public class Car {
publit Tire tire;
public void run() {
tire.roll();
}
}
public class Tire {
public void run() {
System.out.println("타이어가 회전합니다.");
{
}
public class HanKookTire extends Tire() {
public void run(){
System.out.println("한국 타이어가 회전합니다.")
}
}
public class KumHoTire extends Tire() {
public void run(){
System.out.println("금호 타이어가 회전합니다.")
}
}
public static void main(String [] args) {
Car myCar = new Car();
myCar.tire = new Tire();
myCar.run();
myCar.tire = new HanKookTire();
myCar.run();
myCar.tire = new KumHoTire();
myCar.run();
: 다형성은 필드보다는 메소드를 호출할 때 자주 발생. 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 객체를 제공하는 것이 정석이지만 자식 객체를 제공할 수도 있음. 여기서 다형성이 발생.
public class Driver() {
public void drive(Vehicle vehicle) {
vehicle.run();
}
}
Driver driver = new Driver();
Vehicle vehicle = new Vehicle();
driver.drive(vehicle);
: 변수가 참조하는 객체의 타입을 확인하고자 할 때, instanceof 연산자 사용
boolean result = 객체 instanceof 타입;
public void method(Parent parent) {
if (parent instanceof Child child) {
// child 변수 그냥 사용
// true이면 강제 타입 변환이 필요 없음
}
}
: 클래스들의 공통 필드, 메소드를 추출해서 선언한 클래스
: 공통 메소드를 뽑아내어 추상 메소드를 만들 때, 선언부만 동일하고 실행 내용은 달라야 하는 경우가 많다.
-> ex) Animal 클래스의 sound 메소드
-> 동물 별로 울음 소리는 내지만 다 다르기 때문
: sealed 키워드를 사용하면 permits 키워드 뒤에 상속 가능한 자식 클래스를 지정해야 함
public sealed class Person permits Employee, Manager {...}
public final class Employee extends Person { }
public non-sealed class Manager extends Person { }