[Java의 정석]Chapter7.객체지향 프로그래밍2(27~28)

Hello_Wendy·2022년 5월 19일
0

자바의 정석

목록 보기
58/61
post-thumbnail

Chapter 7. 객체지향 프로그래밍 2

27. 매개변수의 다형성

  • 참조변수의 다형적인 특징은 메서드의 매개변수에도 적용됨
Product, Tv, Computer, Buyer 클래스가 정의되어 있다고 가정해보자

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

class buyer { //고객,물건을 사는 사람
	int money = 1000; //소유금액
    int bonusPoint = 0; //보너스 점수
}

→ Product클래스는 Tv와 Computer클래스의 조상이며, Buyer클래스는 제품(Product)을 구입하는 사람을 클래스로 표현한 것
→ Buyer클래스에 물건을 구입하는 기능의 메서드를 추가해보자. 구입할 대상이 필요하므로 매개변수로 구입할 제품을 넘겨받아야 함. Tv를 살 수 있도록 매개변수를 Tv타입으로 함

void buy(Tv t) {
	//Buyer가 가진 돈(Money)에서 제품의 가격(t.price)만큼 뺀다.
    money = money - t.price;
    
    //Buyer의 보너스점수(bonusPoint)에 제품의 보너스점수(t.bonusPoint)를 더한다.
    bonusPoint = bonusPoint + t.bonusPoint;
}

제품구입시 돈에서 가격만큼 빼고, 보너스 점수를 더하는 작업을 했다.
그런데 buy(Tv t)로는 Tv밖에 살 수 없기 때문에 아래와 같이 다른 제품들도 
구입할 수 있는 메서드가 추가로 필요하다.

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

이렇게 되면, 제품의 종류가 늘어날 때마다 Buyer클래스에는 새로운 buy메서드를 추가해야 할 것이다.

▶ 메서드의 매개변수에 다형성을 적용하면, 아래와 같이 하나의 메서드로 간단히 처리 가능

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

▶ 매개변수가 Product타입의 참조변수라는 것은, 메서드의 매개변수로 Product클래스의 자손타입의 참조변수면 어느 것이나 매개변수로 받아들일 수 있다는 뜻

▶ Product클래스에 price와 bonusPoint가 선언되어 있기 때문에 참조변수 p로 인스턴스의 price와 bonusPoint를 사용할 수 있기에 이와 같이 할 수 있음

다른 제품 클래스를 추가할 때 Product클래스를 상속받기만 하면, buy(Product p)메서드의 매개변수로 받아들여질 수 있음

Buyer b = new Buyer();
Tv t = new Tv();
Computer c = new Computer();
b.buy(t);
b.buy(c);Tv t = new Tv(); b.buy(t);를 한 문장으로 줄이면 b.buy(new Tv());가 됨

28. 매개변수의 다형성 예제

package 자바의정석;

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

	Product(int price) {
		this.price = price;
		bonusPoint = (int) (price / 10.0); // 보너스 점수는 제품가격의 10%
	}
}

class Tv1 extends Product {
	Tv1() {
		// 조상클래스의 생성자 Product(int price)를 호출한다
		super(100); // Tv의 가격을 100만원으로 한다
	}

	// Object클래스의 toString()을 오버라이딩한다.
	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 (money < p.price) {
			System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
			return;
		}
		money -= p.price; // 가진 돈에서 구입한 제품의 가격을 뺀다.
		bonusPoint += p.bonusPoint; // 제품의 보너스 점수를 추구한다.
		System.out.println(p + "을/를 구입하셨습니다.");
	}
}

class Ex7_8 {

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

		b.buy(new Tv1());
		b.buy(new Computer());

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

'참조변수+문자열'은 '참조변수.toString()+문자열'로 처리된다

profile
안녕 나의 새로운 세상

0개의 댓글