참조형 매개변수는 메소드 호출시, 자신과 같은 타입 또는 자손 타입의 인스턴스를 넘겨줄 수 있다.
2. 참조 변수 형변환 - 리모콘 바꾸기(control the number of usable members;사용가능한 멤버 갯수 조절)
3. instanceof operator : check casting(형변환 가능여부 확인할 때 쓰인다.)
*오버로딩 : 메소드 이름 같고, 매개변수 타입 다른 것.
아래의 코드는 많은 오버로딩으로 인해 코드의 유지보수가 어려워지고 코드가 중복되는 단점이 있다.
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(Product p) {
money -= p.price;
bonusPoint += p.bonusPoint;
}
}
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;
}
class Product {
int price;
int bonusPoint;
//constructor, initialize an object
Product(int price) {
//Product(100)하면 그 Product의 price가 100으로 초기화된다.
this.price = price;
this.bonusPoint = (int)(price/10.0);
}
}
class Tv1 extends Product {
Tv1() {
//Product(int price)를 호출한다.(조상클래스의 생성자를 호출)
super(100);
}
//Object 클래스의 toString()을 오버라이딩한다.
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 + "을/를 구입하셨습니다.");
//System.out.println(p.toString() + "을/를 구입하셨습니다.");
}
}
class Ex7_8 {
public static void main(String args[]) {
Buyer b = new Buyer();
//Product p = new Tv1();
//b.buy(p);
b.buy(new Tv1());
b.buy(new Computer());
System.out.println("현재 남은 돈은 " + b.money + "만원입니다");
System.out.println("현재 보너스 점수는 " + b.bonusPoint + "점입니다");
}
}