다형성
- 조상 참조변수로 자손 객체 다루기
- ex: 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;
// 1. 매개 변수를 자손의 참조 변수를 이용할 경우, 여러개를 만들어야 함
// -> 오버로딩. 메서드 이름은 같고, 매개변수만 다른 것.
void buy(Tv t) {
money -= t.price;
bonusPoint += t.bonusPoint;
}
void buy(Computer c) {
money -= t.price;
bonusPoint += t.bonusPoint;
}
void buy(Audio a) {
money -= t.price;
bonusPoint += t.bonusPoint;
}
// 2. 매개 변수를 조상의 참조 변수를 이용할 경우, 한개로 가능
// 다형성에 의해, 이 메서드 하나로 여러 물건 구매 가능
// ▽ new Tv();, new Computer();, new Audio(); 모두 사용 가능
void buy(Product p) {
money -= p.price;
bonusPoint += p.bonusPoint;
}
// ex
Tv tv = new Tv();
Computer com = new Computer();
b.buy(tv);
b.buy(com);
}
배열 다형성
조상 타입의 배열에 여러 자손들의 객체를 담을 수 있다.
// 참조변수에 직접 자손객체 대입
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
// 배열을 이용한 자손객체 대입
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Compupter();
p[3] = new Audio(); // 배열 p에는 여러 종류의 객체가 들어가있다.
// ex
class Buyer {
int money = 1000;
int bonusPoint = 0;
Product[] cart = new Product[10]; // 처음엔 참조형 기본값 null로 초기화
int i = 0;
void buy(Product p) {
if(money < p.price) {
System.out.println("잔액 부족");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
cart[i++] = p; // 배열에 차곡 차곡 저장!
// 해당 코드는 아래 코드와 동일하다
// cart[i] = p;
// i++;
}
}
// Vector class : 가변 배열 기능을 가진 class
// protected Object elementData[]; 라는 "Object 배열"을 갖고있다.
// 최고 조상인 Object[] 배열에는 모든 종류의 객체를 저장할 수 있다.
// 원래는 우리가 배열의 "길이"를 "직접 관리"해주어야 한다.
// 배열의 단점, "한번 만들면 크기를 변경할 수 없다"
// Vector class는 알아서 다 해준다. 신경 쓸 필요가 없다~~!
// add() 메서드로 객체 추가 가능! (배열의 길이 및 메모리 자동 관리)