자바의 정석

매개변수의 다형성

야생늑대 2022. 8. 22. 01:57
반응형

(다형성의 장점 : 1. 다형적 매개변수 2.하나의 배열로 여러종류 객체 다루기 )

 

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

 

다형성 

1.  Tv t = new SmartTv();

     조상  =   자손

2. 참조변수의 형변환 = 사용가능한 멤버갯수조절

3. instanceof  연산자 (형변환 가능여부확인)

 

class Product {
int price;			// 제품가격
int bonusPoint;		// 보너스점수
}

class Ty extends Product {}
class Computer extends Product {}
class Audio extends Porduct {}

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

void buy(Tv t) {
money -= t.price;
bonusPoint += t.bonusPoint;
}
// 메소드 오버로딩

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

void buy(Audio a){
money -= a.point;
bonusPoint += a.bonusPoint;
}

 메소드 오버로딩을 통해 매개변수(상품)에 따라 실행되는 메소드가 지정되도록 할 수 있지만, 상품이 많아 질수록 

 메소드 오버로딩해야할 것들이 많아 지고 코드중복도 발생하게 된다.

그럴 때 메소드에 매개변수로 조상 타입인 Product 를 사용하면 메소드 하나로 여러 상품을 구매해도 하나의 메소드로 

처리 가능해진다.

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

Tv tv = new Tv();
Computer com = new Computer();

b.buy(tv);
b.buy(com);

 

 

 

사용예제

package book;

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

	Product(int price) {
		this.price = price;
		bonusPoint = (int) (price / 10.0); // 보너스 점수
	}
}

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.toString() + "을/를 구입하셨습니다.");
		System.out.println(p + "을/를 구입하셨습니다.");
	}
}

public class Ex7_8 {

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

		b.buy(new Tv1()); // buy(Product p)
		b.buy(new Computer()); // buy(Product p)

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

	}

}

결과 값

 

Product p = new Tv1();
b.buy(p);

이 코드와  아래의 코드는 같다.

b.buy(new Tv1);

 

반응형

'자바의 정석' 카테고리의 다른 글

상속  (0) 2022.05.23
인스턴스 멤버와 정적 멤버  (0) 2022.04.15
메소드 Method  (0) 2022.04.12
생성자 Constructor  (0) 2022.04.12
필드 Field  (0) 2022.04.11