본문 바로가기
Java/Basic

다형성(polymorphism) - 매개변수의 다형성

by 최로이 2021. 4. 3.

다형성의 장점

① 다형적 매개변수

② 하나의 배열로 여러 종류 객체 다루기

 

참조변수의 다형적 특성은 메소드의 매개변수에도 적용된다. 만약 우리가 전자 제품을 사러 가는 것을 코드를 통해 표현하면 다음과 같다.

//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점입니다.

댓글