본문 바로가기

복습

[Java 복습] 다형성의 장점

그럼 이렇게 기능이 줄어드는데 어떻게 장점이 될 수 있을까??

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