다형성의 장점
1. 다형적 매개변수
2. 하나의 배열로 여러종류 객체 다루기
다형성 복습
1. Tv t = new SmartTv(); 조상 타입의 참조 변수로, 자손타입의 객체 다루기
2. 참조 변수의 형변환(리모컨바꾸기): 사용가능한 멤버 개수 조절
3. instanceof 연산자, 형변환 가능 여부 확인
1. 매개변수의 다형성
참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음
class Product {
int price; // 제품 가격
int bonusPoint; // 제품 구매 시 제공되는 포인트
Product(int price) { // line 14에서 호출
this.price = price;
bonusPoint = (int)(price/10.0); // 제품가격 10%가 보너스 포인트가 됨
}
}
class Tv1 extends Product {
Tv1() {
// 조상 클래스 생성 Product(int price) 호출.
super(100); // Tv 가격 100만원
}
// Object 클래스의 toString() 오버라이딩
public String toString() { return "Tv"; } // line 45에서 toString() 호출한 것임, 오버라이딩 되어있는 toString은 "Tv"반환
}
class Computer extends Product {
// 조상 클래스 생성 Product(int price) 호출
Computer() {
super(200);
} // Computer 가격 200만원
public String toString() {
return "Computer";
}
}
class Buyer { // 고객, 제품을 구매하는 사람
int money = 1000; // 소유 금액
int bonusPoint = 0; // 보너스 포인트
// 만약 buy(Tv t)라면 Tv 구매만 가능함, 다른 물건사려면 buy(Computer c) 이런식으로 오버로딩해야함
void buy(Product p) { // 매개변수의 다형성: 참조형 매개변수는 메서드 호출 시 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨 줄 수 있음, 자손인 Tv, Computer 등등을 다 한번에 처리
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
return;
}
money -= p.price; // 가진 돈에서 구입한 제품의 가격 빼기
bonusPoint += p.bonusPoint; // 제품의 보너스 점수 더하기
System.out.println(p + "을/를 구입하셨습니다."); // p.toString() 이라고 써져있는 것과 같음, 참조변수하고 문자열을 결합하기 위해서는 toString을 호출해서 붙인다
}
}
class Ex7_8 {
public static void main(String args[]) {
Buyer b = new Buyer();
Product p = new Tv1(); // Tv1 객체를 만들고, prodcut형 p로
b.buy(p);
// line 53, 54를 한 줄로 표현한 것이 아래 57줄임
b.buy(new Tv1()); // buy(product P), 참조변수가 없는 형태임 이 클래스 안에서는 참조변수(리모컨) 사용을 못함, 하지만 buy메서드가 Product p로 참조변수 p를 받기 때문에 buy메서드에서는 사용 가능
b.buy(new Computer()); // buy(product P)
System.out.println("현재 남은 돈은 " + b.money + "만원입니다.");
System.out.println("현재 보너스 점수는 " + b.bonusPoint + "점입니다.");
}
}
2. 여러 종류의 객체를 배열로 다루기
- 조상타입의 배열에 자손들의 객체를 담을 수 있음
// 조상타입인 Product 배열에 자손들의 객체(Tv, Computer, Audio)를 담음
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
cf) 가변 배열 기능: Vector class (👈🏻 11장에서 자세히 배움)
- Object타입의 배열을 가지고 있기 때문에 모든 종류의 객체 저장 가능
- 배열의 크기를 알아서 관리해주기 때문에 저장할 인스턴스 개수에 신경쓰지 않아도 됨
'Java' 카테고리의 다른 글
Java 인터페이스(interface) (0) | 2022.12.28 |
---|---|
Java 추상 클래스(abstract class), 추상 메서드(abstract method) (0) | 2022.12.27 |
Java 참조변수의 형변환과 instanceof (0) | 2022.12.27 |
Java 다형성(polymorphism) (0) | 2022.12.26 |
Java 제어자(modifier) (0) | 2022.12.26 |