다형성의 장점
① 다형적 매개변수
② 하나의 배열로 여러 종류 객체 다루기
참조변수의 다형적 특성은 메소드의 매개변수에도 적용된다. 만약 우리가 전자 제품을 사러 가는 것을 코드를 통해 표현하면 다음과 같다.
//1.제품
class Product{
int price; //제품의 가격
int bonusPoint; //제품을 구매하면 주어지는 마일리지
}
//2.제품의 구성
class Tv extends Product {}
class Computer extends Product {}
class Audio extends Product {} //3.고객(물건을 사려는 사람)
//3.구매자(구매자의 정보)
class Buyer{
int money = 1000; // 소유하고 있는 돈
int bonusPoint = 0; //마일리지
}
만약 Buyer(구매자)가 제품을 구매하려면?
void buy(Tv t) {
//Buyer가 가진 돈(money)에서 제품 가격만큼을 차감한다
money -= t.price;
//Buyer의 보너스 점수(BonusPoint)에 제품의 보너스점수(bonusPoint)를 더한다.
bonusPoint += t.bonusPoint;
}
void buy(Computer com) {
money -= com.price;
bonusPoint += com.bonusPoint;
}
void buy(Audio au) {
money -= au.price;
bonusPoint += au.bonusPoint;
}
하지만 해당 방식은 구매하려는 제품이 많아질 때마다 추가해야 하기 때문에 적절하지 않다. 이때 매개변수의 다형성을 이용해 좀 더 편리하게 표현할 수 있다.
void buy(Product p) {
money -= p.price;
bonusPoint += bonusPoint;
}
매개변수가 Product타입의 참조변수라는 것은 메소드의 매개변수로 Product클래스의 자식타입의 참조변수면 어느 것이나 매개변수로 받아들일 수 있다는 의미다.
그리고 Product클래스에 price, bonusPoint가 선언되어 있기 때문에 참조변수 p로 인스턴스의 price와 bonusPoint를 사용할 수 있기 때문에 이와 같이 할 수 있다.
앞으로 다른 제품 클래스를 추가할 때 Product클래스를 상속하기만 하면, buy(Product p)메소드의 매개변수로 받아들여질 수 있다.
Buyer b = new Buyer();
Tv t = new TV();
Computer com = new Computer();
b.buy(t); //b.buy = new Tv()); 와 같다.
b.buy(c);
Tv클래스와 Computer클래스는 Product클래스의 자식이므로 위 코드와 같이 buy(Product p)메소드에 매개변수로 Tv인스턴스와 Computer인스턴스를 제공하는 것이 가능하다.
Buyer(고객)이 buy()를 이용하여 Tv와 Computer를 구매하고 잔여 금액과 포인트를 출력하는 예제)
class Product {
int price; // 제품의 가격
int bonusPoint; // 제품 구매시 주어지는 보너스 포인트
Product(int price) {
this.price = price;
bonusPoint = (int) (price / 10.0); // 보너스점수는 제품의 10%
}
}
class Tv extends Product {
Tv() {
// 부모 클래스의 생성자 price를 호출
super(100); // Tv의 가격을 100원으로 지정
}
// Object의 생성자 Product(int price)를 호출한다
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 (p.price > money) {
System.out.println("금액이 부족하여 구매할 수 없습니다.");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p + "를 구매하였습니다.");
//참조변수 + 문자열은 참조변수.toString()과 같다.
//System.out.println(p.toString() + "를 구매하였습니다.");
}
}
public class PolymorphismArgument {
public static void main(String[] args) {
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
System.out.println("현재 남은 금액은" + b.money +"원 입니다.");
System.out.println("현재 잔여 포인트는" + b.bonusPoint +"점 입니다.");
}
}
------------------------
//결과
Tv를 구매하였습니다.
Computer를 구매하였습니다.
현재 남은 금액은700만원입니다.
현재 잔여 포인트는30점입니다.
'Java > Basic' 카테고리의 다른 글
인터페이스(interface) (0) | 2021.04.15 |
---|---|
추상클래스(abstract class) (0) | 2021.04.08 |
다형성(polymorphism) - 참조변수와 인스턴스의 연결 (0) | 2021.04.01 |
다형성(polymorphism) - instanceof 연산자 (0) | 2021.03.31 |
다형성(polymorphism) (0) | 2021.03.30 |
댓글