그럼 이렇게 기능이 줄어드는데 어떻게 장점이 될 수 있을까??
tv리모콘으로 스마트 티비를 다룬다? => 어떤 장점이 있을까(2가지 장점)이 있다!!
첫번째. 참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
class Product{
int price; // 제품가격
int bounsPoint; // 보너스포인트
}
class Tv extends Product{}
class Computer extends Product{}
class Audio extends Product{}
class Buyer {
int money = 1000; // 소유금액
int bounsPoint = 0; // 보너스포인트
}
//Buyer 추가
void buy(Tv t) { //new Tv();
money -= t.price;
bonusPoint += t.bonusPoint;
}
//Buyer 추가
void buy(Computer c) {
money -= c.price;
bonusPoint += c.bonusPoint;
}
//Buyer 추가
void buy(Audio a) {
money -= a.price;
bonusPoint += a.bonusPoint;
}
↓
//변경
void buy(Product p) { // new Product();
money -= p.price;
bonusPoint += p.bonusPoint;
}
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
이렇게 메서드를 변경하면 3개의 메서드를 다형적 참조를 이용해 하나의 메서드로 줄일 수 있다.
메서드를 여러개 만들필요 없고, 이 메서드를 하나로 모든 물건들을 살 수 있다.
이 메서드 하나로 여러 물건을 살 수 있다는 점!!!
Buyer b = new Buyer();
//Product p = new Tv();
//b.buy(p)
b.buy(new Tv());
b.buy(new Computer());
주석과 아래의 b.buy(new Tv()); 는 똑같다.
예시 코드
package ex.oop.polo;
public class Product {
int price;
int bonusPoint;
Product(int price) { // 4. 전달받은 100으로 인스턴스 멤버를 초기화
this.price = price;
this.bonusPoint = (int)(price/0.1);
}
}
package ex.oop.polo;
public class Computer extends Product{
Computer() {
super(200);
}
@Override
public String toString(){
return "컴퓨터";
}
}
package ex.oop.polo;
public class Tv extends Product{
Tv() {
super(100); // 3. 기본 생성자를 호출하니 부모 생성자를 호출하고 매개변수로 100을 전달
}
@Override
public String toString(){
return "TV";
}
}
package ex.oop.polo;
public class Buyer {
int money = 1000;
int bonusPoint = 0;
void buy(Product p) { // 7. 전달 받은 p의 인스턴스 멤버 값을 사용
if (p.price > money) {
System.out.println(" 진액이 부족하여 구매불가");
return; // 부족할 경우 리턴해서 빠져나감
}
money -= p.price; // 구매가 성공할 경우 구매자의 돈을 차감
bonusPoint += p.bonusPoint; // 자신의 구매포인트 멤버에 구매가의 10%인 보너스포인트 추가
System.out.println(p + "를 구매했다."); // toString으로 정의해놓은 "TV"를 반환
}
}
package ex.oop.polo;
public class ProductMain {
public static void main(String[] args) {
Buyer b = new Buyer(); // 1. 구매자 객체를 만든다.
Product p = new Tv(); // 2. Tv 객체를 만들고 기본생성자를 호출한다.
// 5. 부모의 타입 변수에 대입(주소값)
b.buy(p); // 6. 구매자 객체에 매개변수로 p를 전달
b.buy(new Tv());
b.buy(new Computer());
System.out.println("현재 남은 돈: " + b.money + " 보너스 점수: " + b.bonusPoint);
}
}
두번째. 조상 타입의 배열에 자손들의 객체를 담을 수 있다.
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();
package ex.oop.polo;
public class Buyer {
int money = 1000;
int bonusPoint = 0;
Product[] cart = new Product[10];
int i = 0;
void buy(Product p) {
if (p.price > money) {
System.out.println(" 진액이 부족하여 구매불가");
return;
money -= p.price;
bonusPoint += p.bonusPoint;
cart[i++] = p;
System.out.println(p + "를 구매했다.");
}
void summary() { // 구매한 물품에 대한 정보를 요약해서 보여준다.
int sum = 0; // 구입한 물품의 가격합계
String itemList = ""; // 구입한 물품 목록
// 반복문을 이용해서 구입한 물품의 총 가격과 목록을 만든다.
for(int i = 0; i < cart.length; i++) {
if(cart[i] == null) {
break;
}
sum += cart[i].price;
itemList += cart[i] + ", ";
}
System.out.println("구입하신 물품 총 금액: " + sum);
System.out.println("구입하신 제품 목록: " + itemList);
}
}
package ex.oop.polo;
public class ProductMain {
public static void main(String[] args) {
Buyer b = new Buyer();
Product p = new Tv();
b.buy(p);
b.buy(new Tv());
b.buy(new Computer());
b.summary();
System.out.println("현재 남은 돈: " + b.money + " 보너스 점수: " + b.bonusPoint);
}
}
'복습' 카테고리의 다른 글
[Java 복습] 예외처리 (1) | 2024.05.02 |
---|---|
[Java 복습] 내부 클래스 (0) | 2024.05.02 |
[Java 복습] 인터페이스의 장점 (0) | 2024.05.02 |
[Java 복습] 상속, 캡슐화, 다형성 (0) | 2024.04.30 |
[Java 복습] 클래스와 메서드 (0) | 2024.04.28 |