[Java] tip: 구매 프로그램 만들기 (자료형의 다형성)

febCho·2024년 1월 8일
0

Java

목록 보기
50/53
package kr.s24.object2.poly;

//부모 클래스
class Product{
	int price; //제품 가격
	int bonusPoint;//제품 구매 시 제공하는 보너스 점수
	
	//인자가 있는 생성자
	public Product(int price) {
		this.price = price;
		bonusPoint = price/10;
	}
	
	//제품의 이름을 반환하는 메서드
	public String getName() {
		return "상품";
	}
}

class Tv extends Product{
	public Tv() {
		super(100);
	}
	//메서드 오버라이딩(재정의)
	@Override
	public String getName() {
		return "Tv";
	}
}

class Computer extends Product{
	public Computer() {
		super(200);
	}
	//메서드 오버라이딩(재정의)
	@Override
	public String getName() {
		return "컴퓨터";
	}
}

class Audio extends Product{
	public Audio() {//오디오의 가격 세팅
		super(300);
	}
	//메서드 오버라이딩(재정의)
	@Override
	public String getName() {
		return "오디오";
	}
}

class Buyer{
	private int money = 1000;//구매자 보유 금액
	private int bonusPoint = 0;//보너스 점수
	
	//public void buy(Tv t) {}
	//public void buy(Computer c) {}
	
	//상품 구매
	public void buy(Product p){
		if(money < p.price) {
			System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
			return;
		}
		money -= p.price;//차감
		bonusPoint += p.bonusPoint;//누적
		
		System.out.println(p.getName() + "을/를 구입하셨습니다.");
		System.out.println("현재 남은 돈은 " + money + "만 원입니다.");
		System.out.println("현재 보너스 점수는 " + bonusPoint + "점입니다.");
		
	}
}
public class PolyMain04 {
	public static void main(String[] args) {
		Buyer b = new Buyer();
		Tv tv = new Tv();
		Computer com = new Computer();
		Audio au = new Audio();
		
		//Tv 구매
		b.buy(tv);//tv -> Product 업캐스팅, 자동 형변환
		//Product p = tv;
		//컴퓨터 구매
		b.buy(com);//컴퓨터 -> Product 업캐스팅, 자동 형변환
		//Product p = com;
		//오디오 구매
		b.buy(au);//오디오 -> Product 형변환
	}
}
  • Product
  1. 부모 클래스인 Product는 int형 멤버변수 price와 bonusPoint를 갖는다.

  2. 그리고 인자가 있는 생성자를 활용해 전달받은 제품 가격을 price에 대입, 그에 맞는 보너스 점수를 계산해 bonusPoint에 대입한다.

  3. 그리고 제품의 이름을 반환하는 메서드 getName()을 생성한다.


  • Tv
  1. 자식 클래스로, Product 클래스를 상속 받는다.

  2. 기본 생성자에서 super()를 활용, 부모 클래스의 생성자를 통해 Tv 객체 생성 시 Tv의 가격이 세팅되도록 한다.
    ex. super(100);

  3. 또한, getName() 메서드를 오버라이딩하여 제품의 이름인 Tv를 반환하도록 한다.


  • Computer
  1. Tv와 같은 자식 클래스로, Product 클래스를 상속 받는다.

  2. 마찬가지로 Product의 생성자를 활용해 객체 생성 시 컴퓨터의 가격이 세팅되고, 오버라이딩한 메서드 호출 시 제품의 이름인 컴퓨터가 반환되도록 한다.


  • Buyer
  1. 제품 구매자는 보유 금액(money)와 보너스 점수(bonusPoint)를 멤버변수로 갖는다.

  2. 이때, 제품 구매하는 메서드 buy()를 구매하고자 하는 제품의 개수마다 오버로딩하여 만드는 것은 한계가 있다. 지금과 같이 구매하고자 하는 제품이 2개가 아닌, 100개라면 어떨지 생각해 보자.
    ex. public void buy(Tv T) {}, public void buy(Computer c){} ...
    따라서 자료형의 다형성을 활용해 (업캐스팅) 부모 타입으로 형변환하여 구매할 수 있도록 상품 구매 메서드를 하나만 만든다. 상속 관계 덕에 각 제품들이 Product 클래스의 멤버변수인 price와 bonusPoint를 가져다 쓸 수 있기 때문이다.
    ex. public void buy(Product p){}

  3. 제품을 구매할 수 있는 경우는 제품의 가격보다 보유한 금액이 클 때이다. 따라서 잔액이 부족하여 구매할 수 없는 경우는 if문으로 처리해준다.
    ex. if(money < p.price){}

  4. 그리고 if문으로 진입하였을 경우, 하위에 있는 코드가 진행되지 않도록(잔액 차감/보너스 점수 누적이 되지 않도록) return; 해준다.

  5. 만약 잔액이 제품 가격보다 많아서 정상 구매가 가능하다면 잔액은 차감하고, 보너스 점수는 누적한다.
    ex. money -= p.price;, bonusPoint += p.bonusPoint;

  6. 구매가 완료되면 오버라이딩한 getName()을 호출하여 제품 이름을 반환하도록 한다. 메서드는 재정의한 경우 더 강력하기 때문이다.


  • PolyMain04
  1. 메인 메서드에서 Buyer, Tv, Computer 객체를 생성한다.

  2. 그 다음 구매를 위해 Buyer 객체 b의 참조 자료형을 활용, buy() 메서드를 호출하고 인자로 제품 객체를 넘긴다.
    ex. b.buy(tv);
    위 과정에서 tv는 Product 타입으로 형변환이 되어 구매가 진행된다.

  3. 그렇게 TV와 컴퓨터를 구매할 경우, 다음과 같이 출력된다.

출력)
Tv을/를 구입하셨습니다.
현재 남은 돈은 900만 원입니다.
현재 보너스 점수는 10점입니다.
컴퓨터을/를 구입하셨습니다.
현재 남은 돈은 700만 원입니다.
현재 보너스 점수는 30점입니다.

  • Audio
  1. 이렇게 자료의 다형성을 활용하면, 새로운 제품을 구매하게 되었을 때 그 과정이 매우 간편해진다. Product만 상속 받으면 되기 때문이다.

  2. Audio 역시 Tv, Computer 클래스와 마찬가지로 작업을 해주고, 메인 메서드 내에서 객체 생성 후 buy() 메서드의 인자로 넘기게 되면 구매가 진행된다.
    출력 내용은 다음과 같다.

출력)
Tv을/를 구입하셨습니다.
현재 남은 돈은 900만 원입니다.
현재 보너스 점수는 10점입니다.
컴퓨터을/를 구입하셨습니다.
현재 남은 돈은 700만 원입니다.
현재 보너스 점수는 30점입니다.
오디오을/를 구입하셨습니다.
현재 남은 돈은 400만 원입니다.
현재 보너스 점수는 60점입니다.
profile
Done is better than perfect.

0개의 댓글