09009

[Java] 매개변수의 다형성 본문

Back-End/JAVA
[Java] 매개변수의 다형성
09009

아래의 소스코드와 같이 Product, noteBook, IPad, computer 클래스가 정의되어 있다고 가정하자.

class Product {
    int price; // 제품의 가격
    int bonusPoint; // 제품 구매시 제공하는 보너스 점수
}

class noteBook extends Product {}
class IPad extends Product {}
class computer extends Product {}

class Buyer { // 구매자
    int money = 1000; // 현재 소유한 금액
    int bonusPoint = 0; // 보너스 점수
}

 

Product 클래스는 noteBook, IPad, computer 클래스의 조상이며,  제품(Product) 구매자는 Buyer 클래스로 표현하였다.

 

Buyer 클래스에 물건을 구입하는 기능의 메서드를 추가한다고 가정하자.

구입할 대상이 필요하기 때문에 매개변수로 구입할 제품을 넘겨받아야 한다.

그러므로 일단 noteBook을 구매할 수 있도록 매개변수를 noteBook 타입으로 하였다.

class Buyer { // 구매자
    int money = 1000; // 현재 소유한 금액
    int bonusPoint = 0; // 보너스 점수

    void buy(noteBook n) {
        money -= n.price; // 구매자가 현재 가진 금액(money)에서 제품의 가격(n.price)을 뺀다.
        bonusPoint += n.bonusPoint; // 구매자의 보너스 점수(bonusPoint)에 제품의 보너스 점수(b.bonusPoint)를 더한다.
    }
}

buy(noteBook n)으로는 노트북밖에 살 수 없으므로 다른 제품들을 구입할 수 있는 메서드도 추가해보았다.

class Buyer { // 구매자
    int money = 1000; // 현재 소유한 금액
    int bonusPoint = 0; // 보너스 점수

    void buy(noteBook n) {
        money -= n.price; // 구매자가 현재 가진 금액(money)에서 제품의 가격(n.price)을 뺀다.
        bonusPoint += n.bonusPoint; // 구매자의 보너스 점수(bonusPoint)에 제품의 보너스 점수(b.bonusPoint)를 더한다.
    }

    void buy(IPad i) {
        money -= i.price;
        bonusPoint += i.bonusPoint;
    }

    void buy(computer c) {
        money -= c.price;
        bonusPoint += c.bonusPoint;
    }
 }

위와 같은 방식으로 코드를 작성하면, 제품의 종류가 여러 개 늘어날 때마다

Buyer 클래스에는 새로운 buy 메서드를 추가해야하는 번거로움이 발생한다.

매개변수의 다형성을 이용하면 아래와 같이 하나의 메서드로 간단히 작성할 수 있다.

class Buyer { // 구매자
    int money = 1000; // 현재 소유한 금액
    int bonusPoint = 0; // 보너스 점수

    void buy(Product p) {
        money -= p.price;
        bonusPoint += p.bonusPoint;
    }
}

noteBook, IPad, computer 클래스의 조상 클래스인 Product 클래스의 참조변수를 매개변수로 받는 메서드로 작성하면 되는 것이다.

 

매개변수가 Product 타입의 참조변수라는 것은 메서드의 매개변수로 Product 클래스의 자손타입의 참조변수이면 어느 것이나

매개변수로 받아들일 수 있다는 것을 의미한다.

Product p = new noteBook();
Product p = new IPad();
Product p = new computer();

 

위에서 작성한 내용을 바탕으로 소스코드를 정리하면 아래와 같다.

 

 입력

class Product {
	int price;
	int bonusPoint;
	
	Product(int price) {
		this.price = price;
		bonusPoint = (int) (price / 10.0);
	}
}

class noteBook extends Product {
	noteBook() {
		super(100);
	}
	@Override
	public String toString() {
		return "noteBook";
	}
}

class IPad extends Product {
	IPad() {
		super(200);
	}
	@Override
	public String toString() {
		return "IPad";
	}
}

class computer extends Product {
	computer() {
		super(100);
	}
	@Override
	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 ProductEx {
    public static void main(String[] args) {
        Buyer b = new Buyer();

        b.buy(new noteBook());
        b.buy(new IPad());
        b.buy(new computer());

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

💻 출력

noteBook을/를 구입하셨습니다.
IPad을/를 구입하셨습니다.
computer을/를 구입하셨습니다.
현재 남은 돈은 600만원입니다.
현재 보너스 점수는 40점입니다.

 

noteBook, IPad, computer 클래스는 Product 클래스의 자손이기 때문에 위의 소스코드와 같이 buy(Product p) 메서드에

매개변수로 noteBook 인스턴스와 IPad 인스턴스, computer 인스턴스를 제공하는 것이 가능해진다.

 

앞으로 다른 제품 클래스를 추가할 경우, Product 클래스를 상속받으면 buy(Product p)의 메서드의

매개변수로 받아들여질 수 있는 것이다.

 

 

 

/

5/7