새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능이 확장되는 클래스를 구현함
EX) 동물 -> 사자
class Animal {
}
class Lion extends Animal {
}

class Customer {
protected String customerID;
protected String customerName;
protected String customerGrade;
protected int bonusPoint;
protected double bonusRatio;
}
외부 클래스에는 private으로 하위 클래서에서는 public의 기능을 구현한 키워드
상위 클래스에 protected로 선언된 변수나 메서드는 다른 외부 클래스에서는 사용할 수 없지만 하위 클래스에서는 사용가능
| 외부 클래스 | 하위 클래스 | 동일 패키지 | 내부 클래스 | |
|---|---|---|---|---|
| public | O | O | O | O |
| protected | X | O | O | O |
| default | X | X | O | O |
| private | X | X | X | O |
Customer customer = new VIPCustomer(); // 상위 = new 하위

예제의 Customer 클래스의 calcPrice() 와 VIPCustomer의 calcPrice() 구현내용은 할인율과 보너스 포인트 적립내용부분의 구현이 다름
따라서 VIPCustomer 클래스는 calcPrice()메서드를 재정의 해야함
EX)
일반고객 (할인율 없음)
10000 * (1.0 - 0.0) = 10000원
VIP 고객 ( 할인율 있음)
10000 * (1.0 - 0.1) = 9000원
@override
pulbic int calcPrice(money) {
return money * (1.0 - saleRatio)
}
상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정된다.
EX)
Customer customer = new VIPCustomer();
customer.priceCalc(10000); // VIPCustomer의 priceCalc 메서드 실행
하나의 코드가 여러 자료형으로 구현되어 실행되는 것
같은 코드에서 여러 실행 결과가 나옴
정보은닉, 상속 과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나 객체지향 프로그래밍의 유연성, 재활용성, 유지보수성에 기본이 되는 특징임
다양한 여러 클래스를 하나의 자료형(상위 클래스)으로 선언하거나 형변환하여 각 클래스가 동일한 메서드를 오버라이딩 한 경우, 하나의 코드가 다양한 구현을 실행 할 수 잇음
유사한 클래스가 추가되는 경우 유지보수에 용이하고 각 자료형 마다 다른 메서드를 호출하지 않으므로 코드에서 많은 if 문이 사라짐!!
class Student {
Subject majorSubject;
}
묵시적으로 상위 클래스 형변환된 인스턴스가 원래 자료형(하위클래스)으로 변환되어야 할 때 다운캐스팅이랄 함
하위 클래스로의 형 변환은 명시적으로 되어야 함
Customer vc = new VIPCustomer(); // 묵시적
VIPCustomer vCustomer = (VIPCustomer)vc; //명시적
해당 참조변수가 참조하고 있는 인스턴스의 실제 타입이 뭔지 알려주는 명령
Animal hAnimal = new Human();
if(hAnimal instanceof Human) {
Human human = (Human)hAnimal;
}