다형성을 꼭 이해하고 복습하자!
- 하나의 참조변수로 여러 타입의 객체를 참조할 수 있다.
- = 조상타입의 참조변수로 자손타입의 객체를 다루는 것
class Tv { //부모
boolean power;
int channel
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
class SmartTv extends Tv { // 자식
String text;
void caption() { }
}
//참조변수 타입과 인스턴스의 타입 일치
Tv t = new Tv();
SmartTv s = new SmartTv(); //-> 7개의 멤버를 모두 쓸 수 있다
//다형성은 타입이 일치해야하지만 불일치해도 ok - 조상타입 참조변수로 자손타입 객체를 다루는 것
Tv t = new SmartTv(); //-> 스마트티비를 티비 참조변수로 다루면 부모에 있는 5개 멤버만 참조변수로 사용 가능
Tv t = new SmartTv(); //-> 가능
SmartTv s = new Tv(); //-> 에러, 불가능
메소드 출력결과 - 같은 배열에 집어넣어도 각각의 인스턴스에 따라 결과가 다르게 나온다, 상속이어도 인스턴스 타입 따라감
* 이게 바로 다형성 (Polymorphism)
참조변수를 변경해서 사용할 수 있는 멤버의 갯수를 조절하기 위해 사용
자손타입 -> 조상타입 (Up-casting) : 형변환 생략가능
자손타입 <- 조상타입 (Down-casting) : 형변환 생략불가
class Car { //부모 클래스
String color;
int door;
void drive() {
System.out.println("drive");
}
void stop() {
System.out.println("stop!");
}
}
class FireEngine extends Car { //Car를 부모로 하는 자식 클래스
void water() {
System.out.println("water!");
}
}
FireEngine f = new FireEngine();
Car c = (Car)f; //조상인 Car타입으로 형변환 가능 (생략가능)
FireEngine f2 = (FireEngine)c; //자손인 FireEngine타입으로 형변환 가능 (생략불가)
Ambulance a = (Ambulance)f; //-> 에러 : 상속관계가 아닌 클래스간 형변환 불가
참조변수의 형변환 하기전 형변환 가능 여부를 확인할 때 사용
void doWork(Car c) {
if(c instanceof FireEngine) { //1. 형변환이 가능한지 확인 -> true가 나오면 가능
FireEngine fe = (FireEngine)c; //2. 형변환
fe.water();
}
...
FireEngine fe = new FireEngine();
System.out.println(fe instanceof Object); //true
System.out.println(fe instanceof Car); //true
System.out.println(fe instanceof FireEngine); //true
}
다형성의 장점 :
1) 다형적 매개변수
2) 하나의 배열로 여러종류 객체 다루기
class Product { //부모
int price;
int bonusPoint;
}
//자손
class Tv extends Product {}
class Computer extends Product {}
class Audio extends Product {}
class Buyer {
int money = 1000;
int bonusPoint = 0;
}
//오버로딩 - 메소드 이름이 같고 매개변수 타입만 다름
void buy(Computer c) {
money -= c.price;
bonusPoint +=c.bonus;
}
void buy(Audio a) {
money -= a.price;
bonusPoint +=a.bonus
}
//메소드를 여러개 써줄 필요 없이 이 메소드 하나로 적용해줄 수 있다 - 이러지 않으면 물견 별 항목에 하나하나 메소드 추가해줘야함
void buy(Product p) {
money -= p.price;
bonusPoint += p.bonusPoint;
}