Back-End/자바의 정석

자바의 정석 - 매개 변수의 다형성

호강하는 지해 2023. 12. 18. 00:22
728x90

 

참조형 매개변수는 메서드 호출 시 , 자신과 같은 타입 또는 자손 타입의 인스턴스를 넘겨줄 수 있다.

 

 

장점

1) 다형적 매개변수

2) 하나의 배열로 여러 종류 객체 다루기 (객체 마다 메소드를 만들어주지 않아도 됨)

 

Product p = new Tv1();

// 아래 두 줄은 같은 의미임

b.buy(p);

b.buy(new Tv1());

 

 

 

상속 할 부모 클래스

public class Product {
    int price; 			// 제품의 가격
    int bonusPoint;		// 제품 구매 시 주어지는 포인트

    Product(int price){
        this.price = price;
        bonusPoint = (int)(price/10.0);		// 보너스 포인트는 제품의 10%
    }
}

 

 

 

상속 받을 자식 클래스

public class Tv1 extends Product {		// Product에서 상속 받는다.
    Tv1(){
        super(100);		// 조상클래스의 생성자를 호출하여 100을 입력한다.
    }

    public String toString(){	// Object클래스의 toString을 오버라이딩 한다.
        return "TV";
    }
}


public class Computer1 extends Product {
    Computer1(){
        super(100);
    }
    public String toString(){
        return "Computer";
    }
}


public class iPhone13 extends Product {
    
    iPhone13(){
        super(600);
    }

    public String toString() {
        return "iPhone13";
    }
}

 

 

구매자 클래스

public class buyer {		// 제품을 구매할 구매자 클래스
    int money = 1000;		// 구매자의 보유 금액
    int bonusPoint = 0;		// 구매자의 보유 포인트

    public void buy(Product p){
        if(money < p.price){
            System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
            return;
        }
        money -= p.price;							// 보유 금액에서 제품의 가격을 뺀다.
        bonusPoint += p.bonusPoint;					// 보유 포인트에서 제품 포인트를 더한다.
        System.out.println(p + "을/를 구입하셨습니다.");	
        
    }
}

 

 

실행

public static void main(String[] args) {
        buyer b = new buyer();

        // Tv1 t = new Tv1();
        // b.buy(t);
        b.buy(new Tv1());
        b.buy(new Computer1());
        b.buy(new iPhone13());

        System.out.println("현재 남은 돈은 " + b.money + "입니다.");
        System.out.println("현재 보너스 점수는 " + b.bonusPoint + "입니다.");
    }

 

 

콘솔창에 찍히는 결과

// TV을/를 구입하셨습니다.
// Computer을/를 구입하셨습니다.
// iPhone13을/를 구입하셨습니다.
// 현재 남은 돈은 200입니다.
// 현재 보너스 점수는 80입니다.
728x90