매개변수의 다형성
- 참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
다형성
Tv t = new SmartTv();
조상 타입의 참조변수로 자손 객체를 다루는 것
- 참조변수의 형변환 (리모콘 바꾸기) - 사용가능한 멤버변수 개수 조절
- instanceof 연산자 - 형변환 가능여부 확인
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;
}
- 위 Buyer class에 오버로딩을 통해 아래 메서드들을 추가
-> 하지만 이 방법은 코드 중복 발생
void buy (Tv t) {
money -= t.price;
bonusPoint +=t.bonusPoint;
}
void buy (Computer c) {
money -= c.price;
bonusPoint +=c.bonusPoint;
}
void buy (Audio a) {
money -= a.price;
bonusPoint +=a.bonusPoint;
}
void buy (Product p) {
money -= p.price;
bonusPoint +=p.bonusPoint;
}
- 조상 타입의 참조변수로 자손 객체를 다루는 것이 가능한 다형성의 특징을 이용하여 아래 코드를 이용하여 위 메서드에 대입 가능!
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
class Product {
int price;
int bonusPoint;
Product(int price) {
this.price = price;
bonusPoint = (int) (price / 10.0);
}
}
class Tv1 extends Product {
Tv1() {
super(100);
}
public String toString() {
return "Tv"; }
}
class Computer extends Product {
Computer() {
super(200); }
public String toString() {
return "Computer"; }
}
class Buyer {
int money = 1000;
int bonusPoint = 0;
void buy(Product p) {
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
return;
}
money -= p.price;
bonusPoint +=p.bonusPoint;
System.out.println(p + "을/를 구입하셨습니다.");
}
}
class Ex {
public static void main(String[] args) {
Buyer b = new Buyer();
b.buy(new Tv1());
b.buy(new Computer());
System.out.println("현재 남은 돈은" + b.money + "만원입니다.");
System.out.println("현재 보너스점수는" + b.bonusPoint + "점입니다.");
}
}