7-27 매개변수의 다형성
- 참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
다형성
1. Tv t = new SmartTv();
2. 참조변수의 형변환 - 리모컨 바꾸기
사용 가능한 멤버 갯수 조절
3. instanceof 연산자: 형변환 가능 여부 체크
다형성의 장점
1. 다형적 매개변수
2. 하나의 배열로 여러 종류 객체 다루기

void buy(Tv t) {}
Tv t에는 new Tv(); 밖에 못온다.
많은 메서드들을 buy 메서드로 오버로딩하면
관리도 힘들고 코드 중복도 발생한다.
그래서 이 코드의 매개변수에 조상타입인 Product를 쓰는 것이다.
그러면 buy(Product p){} 하나로 여러 물건을 살 수 있다.
void buy(Tv t) {}를 void buy(Product p) {}로 바꾼다.
Tv타입을 쓰는 게 아니라 조상타입인 Product를 사용한다.
Product를 사용하면 다형성에 의해서
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
조상 타입의 참조변수로 자손들의 객체를 다룰 수 있다.
(자손 타입의 참조변수로 조상 객체 다루는건 불가능)

System.out.println(p + "을/를 구입하셨습니다.");
p가 p.toString
참조변수하고 문자열 결합할 때는 참조변수에 toString을 호출해서 붙인다.
System.out.println(p.toString() + "을/를 구입하셨습니다.");
System.out.println(p + "을/를 구입하셨습니다."); 둘이 같다!
class Product {
int price; //제품의 가격
int bonusPoint; //제품구매 시 제공하는 보너스점수
Product(int price) {
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"; }
}
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 + "을/를 구입하셨습니다.");
}
}
public class Ex7_8 {
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 + "점입니다.");
}
}
b.buy(new Tv1());는
Product p = new Tv1();
b.buy(p); 와 같은 코드다.
int i = 10;
System.out.println(i);
위의 두 줄이 아래 줄과 같은 이치다.
System.out.println(new Tv1()); 생성하고 바로 넘겨주면 참조변수가 없다.
그래서 이 main메서드 안에서 Tv1()을 사용할 수 없다.
참조변수가 없으니까. 리모컨이 없으니까
대신 buy메서드 안에서는 쓸 수 있다.
void buy(Product p)로 받으니까
(println(참조변수)이 이렇게 참조변수가 들어오면 내부적으로 toString을 호출한다.)
그래서 System.out.println(p + "을/를 구입하셨습니다.");가
System.out.println(p.toString + "을/를 구입하셨습니다."); 이렇게 된다.
'프로그래밍 언어 > 자바의 정석 기초편' 카테고리의 다른 글
자바의 정석 기초편 ch7-31,32 추상 클래스, 추상 메서드 (1) | 2022.09.30 |
---|---|
자바의 정석 기초편 ch7-29,30 여러 종류의 객체를 배열로 다루기 (0) | 2022.09.16 |
자바의 정석 기초편 ch7-26 instanceof 연산자 (0) | 2022.09.03 |
자바의 정석 기초편 ch7-24,25 참조변수의 형변환(2) (0) | 2022.09.03 |
자바의 정석 기초편 ch7-24,25 참조변수의 형변환(1) (0) | 2022.09.03 |