[자바] 매개변수의 다형성 연습

오늘·2021년 3월 15일
0

문제풀기

목록 보기
17/24

1) Tv or Pc 구매하고, 잔금과 포인트 출력

요구사항
: 포인트 = 제품가격의 10%
: 'Tv / PC 을(를) 구매했습니다' 출력
: 기본금 1000 으로 시작

1. 상위 클래스인 Product 클래스 작성

-기본 필드 값으로 제품가격과 보너스포인트 선언
-생성자의 매개 값으로 값을 받아와 초기화

public class Product {
	// 제품의 가격
	int price;
	// 제품 구매시 제공하는 보너스 점스
	int bonusPoint;
	
	
	// 생성자
	public Product(int price) {
		this.price = price;
		// 보너스 점수는 제품가격의 10%
		bonusPoint = (int) (price/10.0);
	}
	public Product() {	}
}

2. Product 를 상속받는 PC클래스

-기본 생성자 작성해준 후 상위클래스에 200 넣어주기,
int를 매개값으로 받는 public Product(int price)에 작성 값이 넘겨진다
-toString은 Object클래스에서 받아온 내용으로, 출력시 호출하면 "PC" 라는 String 내용을 리턴해준다

public class Pc extends Product {	
	// 기본 생성자를 만들고
	public Pc() {
		// 상위 클래스에 200 값 넘겨주기
		super(200);
	}
	
	// 오브젝트 클래스에서 가져와
	// 오버라이딩 해준 것
	@Override
	public String toString() {
		return "Pc";
	}
}

4. Product 를 상속받는 TV클래스

-역시나 int를 값으로 받는 public Product(int price) 에 super() 속 값이 넘어간다.
-toString 값으로 "TV" 가 리턴된다.

public class Tv extends Product{
	public Tv() {
		// 부모 생성자 호출해서 100 으로 가격을 던진다
		super(100);
	}
	
	// (기본적으로 들어있는 최상위 클래스인)
	// 오브젝트 클래스의 것을 가져와 오버라이딩
	@Override
	public String toString() {
		return "TV";
	}
}

5. 고객 클래스

-기본 소유금 1000으로 설정, 구매시 차감하는 방식으로 진행
-상위 클래스인 Product를 매개값으로 받게끔 설정(그리하면 Product를 상속받는 하위 클래스도 값으로 집어넣을 수 있게된다.

// 고객 클래스
public class Buyer {
	// 소유금액
	int money = 1000;
	int bonusPoint = 0;
	
	// 상위 클래스였던 Product 속 생성자(매개변수)를 사용
	void buy(Product p) {
		if(money < p.price) {
			System.out.println("잔액이 부족합니다 물건을 살 수 없습니다");
			// void 메소드이기 때문에 return; 의 의미는
			// 값을 전달하지 말고 메소드에서 빠지라는 뜻이다
			return;
		}
		
		// 가진 돈으로 구입한 제품의 가격을 빼준다
		money -= p.price;
		bonusPoint += p.bonusPoint;
		
		System.out.println(p.toString() + "을/를 구매하셨습니다");
	}
}

6. 출력 클래스

-스캐너로 직접 입력받지 않는다
-구매 후 잔금과 쌓인 포인트를 확인할 수 있게 한다
-매개값이 들어가는 곳에 상속된 자식 클래스가 들어간 모습을 확인할 수 있다

public class PolyArgumentTest {
	public static void main(String[] args) {
		// 객체 생성
		Buyer buyer = new Buyer();
		
		// 제품 클래스 객체 생성
		Tv tv = new Tv();
		Pc pc = new Pc();
		
		// 매개 변수 값으로 제품 객체 집어넣기
		buyer.buy(tv);
		System.out.println("현재 잔금 : " + buyer.money);
		System.out.println("현재 보너스포인트 : " + buyer.bonusPoint);
		System.out.println("-----------------------------");
		
		buyer.buy(pc);
		System.out.println("현재 잔금 : " + buyer.money);
		System.out.println("현재 보너스포인트 : " + buyer.bonusPoint);
		
	}
}

실행결과


2) 비즈니스 로직에서 객체를 배열로 처리

요구사항
: 구매액이 기본금을 초과한 상황도 출력해보기
: 객체를 배열로 처리하기

1. 상위 클래스인 Product 클래스 생성

public class Product {
	// 제품의 가격
	int price;
	// 제품 구매시 제공하는 보너스 점스
	int bonusPoint;
	
	
	// 생성자
	public Product(int price) {
		this.price = price;
		// 보너스 점수는 제품가격의 10%
		bonusPoint = (int) (price/10.0);
	}
	public Product() {	}
}

2. Product를 상속받는 냉장고, 핸드폰, 에어컨 클래스 생성

// 냉장고
public class Refrigerator extends Product {
	public Refrigerator() {
		super(300);
	}
	
	@Override
	public String toString() {
		return "냉장고";
	}
}


// 핸드폰
public class Phone extends Product {
	public Phone() {
		super(120);
	}
	
	@Override
	public String toString() {
		return "핸드폰";
	}
}



// 에어컨
public class AirConditioner extends Product {
	public AirConditioner() {
		super(500);
	}
	
	@Override
	public String toString() {
		return "에어컨";
	}
}

3. 객체를 배열로 처리하는 Buyer 클래스

-객체를 배열로 담아주기 위해 Product[] item = new Product[]
-Product 배열에 사용할 카운터 선언 및 초기화

public class Buyer {

	int money = 1000;
	int bonusPoint = 0;
	
	// 객체를 배열로 담아주기 위함
	// 구입한 제품을 저장하기 위한 배열
	Product[] item = new Product[10];
	// Product 배열에 사용할 카운터
	int i = 0;
	
	
	void buy(Product p) {
		if (money < p.price) {
			System.out.println("잔액이 부족합니다 물건을 살 수 없습니다");

			return;
		}

		money -= p.price;
		bonusPoint += p.bonusPoint;
		
		// p에 담기는 것은 주소
		// 인덱스가 하나씩 늘어나며 주소가 담긴다
		// PolyArgument 에서 들어온 buyer.buy(값);
		// 저 값을 item 배열에 저장하는 것
		item[i++] = p;

		System.out.println(p.toString() + "을/를 구매하셨습니다");
	}
	
	
	// 구매한 제품의 정보를 요약하는 메소드
	void summary() {
		// 물품의 총 구매 가격
		int sum = 0;
		// 구입한 물품 리스트
		String itemList = " ";
		// 보너스 포인트
		int bonusPoint = 0;
		
		//반복문을 사용하여 물풍의 가격 합과 리스트 출력
		for (int i=0; i<item.length; i++) {
			if(item[i] == null) {
				break;
			}
			// item 에 저장되어있는 가격과 물품 내역을
			// 변수에 누적
			sum += item[i].price;
			itemList += item[i].toString() + " ";
			bonusPoint += item[i].bonusPoint;
		}
		System.out.println("총 구매 금액 : " + sum);
		System.out.println("쌓인 포인트 내역 : " + bonusPoint);
		System.out.println("구입하신 물품 내역 :"+ itemList);
		System.out.println("좋은 하루 보내세요");
	}
}

4. 출력 클래스

-입력을 스캐너로 받는다
-while문을 이용하여 사용자가 종료하기 전에는 종료시키지 않는다

import java.util.*;

public class PolyArgumentTest {
	public static void main(String[] args) {

		// 객체 생성
		Scanner sc = new Scanner(System.in);
		Buyer buyer = new Buyer();

		// 제품 클래스 객체 생성
		Refrigerator re = new Refrigerator();
		AirConditioner air = new AirConditioner();
		Phone ph = new Phone();

		boolean a = true;
		while (a) {
			// 매개 변수 값으로 제품 객체 집어넣기
			System.out.println("제품을 입력해주세요");
			System.out.print(">>");
			String input = sc.next();

			if (input.equals("에어컨")) {
				buyer.buy(air);
				System.out.println("현재 잔금 : " + buyer.money);
				System.out.println("현재 보너스포인트 : " + buyer.bonusPoint);
				System.out.println("-----------------------------");

			} else if (input.equals("냉장고")) {
				buyer.buy(re);
				System.out.println("현재 잔금 : " + buyer.money);
				System.out.println("현재 보너스포인트 : " + buyer.bonusPoint);
				System.out.println("-----------------------------");
			} else if (input.equals("핸드폰")) {
				buyer.buy(ph);
				System.out.println("현재 잔금 : " + buyer.money);
				System.out.println("현재 보너스포인트 : " + buyer.bonusPoint);
				System.out.println("-----------------------------");
			} else {
				a = false;
			}
		}

		buyer.summary();
	}
}

실행모습


3) 추가기능 : 환불

-미처리상황 : 구매하지 않은 제품을 환불처리 했을 때, '구매하신 제품이 아닙니다' 출력 미구현

1. 상위 클래스 Product

public class Product {
	// 제품의 가격
	int price;
	// 제품 구매시 제공하는 보너스 점스
	int bonusPoint;
	
	
	// 생성자
	public Product(int price) {
		this.price = price;
		// 보너스 점수는 제품가격의 10%
		bonusPoint = (int) (price/10.0);
	}
	public Product() {	}
}

2. 하위 클래스 커피, 바닐라, 초코

// choco
public class Choco extends Product{
	public Choco() {
		super(2000);
	}
	
	@Override
	public String toString() {
		return "초코스무디";
	}
}



// Coffee
public class Coffee extends Product {
	public Coffee() {
		super(1500);
	}
	
	@Override
	public String toString() {
		return "아메리카노";
	}
}



// Vanilla
public class Vanilla extends Product {
	public Vanilla() {
		super(2500);
	}

	@Override
	public String toString() {
		return "바닐라_라떼";
	}
}

3. 기능 처리 클래스 Buyer

-객체는 배열로 처리
-환불 기능 구현

public class Buyer {

	int money = 10000;
	int bonusPoint = 0;

	// 클래스 내 어느 생성자에서도 사용할 수 있게끔 밖으로 빼내었다
	int sum = 0;
	String itemList = " ";

	Product[] item = new Product[10];
	int i = 0;

	void buy(Product p) {
		if (money < p.price) {
			System.out.println("잔액이 부족합니다. 물건을 구매하실 수 없습니다");
			return;
		}

		money -= p.price;
		bonusPoint += p.bonusPoint;

		item[i++] = p;

		System.out.println(p.toString() + "을/를 구매하셨습니다");
	}

	// 구매한 제품을 환불하는 메소드
	void refund(Product p) {
		for (int i = 0; i < item.length; i++) {
			if (item[i] == null) {
				break;
			}
			sum += item[i].price;
		}
		// 환불 요구한 제품의 인덱스 찾가
		for (i = 0; i < item.length; i++) {
			if (p == item[i]) {
				// 저장되어 내려온 item[i] 칸에서
				// 저장된 요소들을 꺼내 계산한다
				sum -= item[i].price;
				bonusPoint -= item[i].bonusPoint;

				System.out.println("\n*********************************");
				System.out.println("환금 제품 : " + item[i].toString());
				System.out.println("환불 가격 : " + item[i].price);
				System.out.println("삭제된 포인트 : " + item[i].bonusPoint);
				System.out.println("구매내역");
				break;
			} else {
				System.out.println();
				System.out.println("환불 내역을 찾는 중입니다..");
			}
		}
	}

	void summary() {
		for (int i = 0; i < item.length; i++) {
			if (item[i] == null) {
				break;
			}

			sum += item[i].price;
			itemList += item[i].toString() + ", ";
			bonusPoint += item[i].bonusPoint;
		}
		System.out.println("총 구매 금액 : " + sum);
		System.out.println("쌓인 포인트 내역 : " + bonusPoint);
		System.out.println("구입하신 물품 내역 :" + itemList);
		System.out.println("좋은 하루 보내세요");
	}
}

4. 출력 클래스

public class Total {
	public static void main(String[] args) {
		
		// 객체 생성
		Buyer buyer = new Buyer();
		
		// 제품 클래스 객체 생성
		Coffee coffee = new Coffee();
		Vanilla vanilla = new Vanilla();
		Choco choco = new Choco();
		
		// 매개 변수 값으로 제품 객체 집어넣기
		buyer.buy(coffee);
		System.out.println("현재 잔금 : " + buyer.money);
		System.out.println("현재 보너스포인트 : " + buyer.bonusPoint);
		System.out.println("-----------------------------");
		
		buyer.buy(vanilla);
		System.out.println("현재 잔금 : " + buyer.money);
		System.out.println("현재 보너스포인트 : " + buyer.bonusPoint);
		System.out.println("-----------------------------");
		
		buyer.buy(choco);
		System.out.println("현재 잔금 : " + buyer.money);
		System.out.println("현재 보너스포인트 : " + buyer.bonusPoint);
		System.out.println("-----------------------------");
		
		buyer.buy(coffee);
		System.out.println("현재 잔금 : " + buyer.money);
		System.out.println("현재 보너스포인트 : " + buyer.bonusPoint);
		System.out.println("-----------------------------");

		
		// 환불
		buyer.refund(choco);
		buyer.refund(choco);
		
		System.out.println("-----------------------------");
		System.out.println("총 구매 금액 : " + buyer.sum);
		System.out.println("쌓인 포인트 내역 : " + buyer.bonusPoint);
		System.out.println("좋은 하루 보내세요");
	}
}

실행결과


0개의 댓글