class Animal{
public void move(){
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal{
@Override
public void move(){
System.out.println("사람이 두 발로 걷습니다");
}
public void readBook(){
System.out.println("사람이 책을 읽습니다");
}
}
class Tiger extends Animal{
@Override
public void move(){
System.out.println("호랑이가 네 발로 걷습니다");
}
public void hunting(){
System.out.println("호랑이가 사냥을 합니다.");
}
}
class Eagle extends Animal {
@Override
public void move() {
System.out.println("독수리가 하늘을 날아다닙니다.");
}
public void flying(){
System.out.println("독수리가 양날개를 쭉 펴고 날아다닙니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal hAnimal = new Human();
Animal tAnimal = new Tiger();
Animal eAnimal = new Eagle();
AnimalTest test = new AnimalTest();
test.moveAnimal(hAnimal);
test.moveAnimal(tAnimal);
test.moveAnimal(eAnimal);
}
public void moveAnimal(Animal animal){
animal.move();
}
}
ArrayList를 사용하면
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(hAnimal);
animalList.add(tAnimal);
animalList.add(eAnimal);
for (Animal animal : animalList){
animal.move();
}
GoldCustomer.java
package ch6;
public class GoldCustomer extends Customer{
double salesRatio;
public GoldCustomer(int customerID, String customerName) {
super(customerID, customerName);
salesRatio = 0.1;
bonusRatio = 0.02;
customerGrade = "GOLD";
}
public int calcPrice(int price){
bonusPoint += price * bonusRatio;
return price - (int)(price * salesRatio);
}
}
상속받아서 생성자와 calcPrice를 수정해주기만 하면 된다
IS - A 관계
일반적인 개념과 구체적인 개념과의 관계
상위클래스: 하위보다 일반적인 개념
하위클래스: 상위보다 구체적인 개념을 더함
상속은 클래스간의 결합도가 높은 설계
상위 클래스의 수정으로 하위클래스에 많은 영향을 미칠 수 있다
계층 구조가 복잡하거나 깊이가 깊으면 좋지 않음
HAS - A 관계
클래스가 다른 클래스를 포함하는 관계
코드 재사용의 일반적인 방법
예를 들어 Student가 Subject를 포함하는 관계
Library를 구현할 때 ArrayList를 생성하여 사용
상속하지 않음
if (customerE instanceof GoldCustomer) {
GoldCustomer vc = (GoldCustomer) customerE;
System.out.println(customerE.showCustomerInfo());
}
Customer 형으로 업캐스팅된 customerE가 원래 GoldCustomer인지 instanceof로 확인한 후 GoldCustomer로 형 변환을 해줌
public void testDownCasting(ArrayList<Animal> list){
for (int i = 0; i < list.size(); i++){
Animal animal = list.get(i);
if (animal instanceof Human){
Human human = (Human) animal;
human.readBook();
} else if (animal instanceof Tiger) {
Tiger tiger = (Tiger) animal;
tiger.hunting();
} else if (animal instanceof Eagle) {
Eagle eagle = (Eagle) animal;
eagle.flying();
} else {
System.out.println("unsupported type");
}
}
}
다운캐스팅을 하면 각각의 하위클래스마다 구현된 메서드를 사용할 수 있다