본문 바로가기
JAVA

221012 다형성 실습

부모

package quiz12;

public class Product {
	//상품의 부모클래스 - 수정x
	private int price;
	private String name;
	
	public Product(int price, String name) {
		this.price = price;
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	
}

자식

package quiz12;

public class Tv extends Product {
	//가격 400원 이름은 tv
	//get, set메서드는 자동으로 상속됩니다
	public Tv() {
		super(400,"tv");
	}
	

}

super(int,String)을 통해 부모클래스의 생성자를 받아옴

 

package quiz12;

public class Radio extends Product {

	//Radio의 생성자는 기본생성자로 만들고, super를 통해서 가격 500원, 이름은 radio로 저장
	//get, set메서드는 자동으로 상속됩니다
	public Radio() {
		super(500,"radio");
	}
	
}

 

package quiz12;

public class Computer extends Product {
	//가격 600원 이름은 com
	//get, set메서드는 자동으로 상속됩니다
	public Computer() {
		super(600, "com");
	}
}

 

 

사용자클래스

package quiz12;

public class MyCart {
	/*
	철수는 TV객체, Radio객체, Computer객체를 전달받아서 계산하는 Cart클래스를 만드려고한다.
	Product클래스는 부모클래스 이다.
	Tv, Radio, Computer는 자식클래스 이다.
	Product클래스에는 필요한 변수가 선언되어 있고 getter, setter가 생성되어 있다.
	 */
	private int money;
	private Product[] cart = new Product[1]; //상품을 저장할 배열
	private int i = 0;

	//2. MyCart의 생성자는 money만 받아서 초기화
	public MyCart(int money) {
		this.money=money;
	}

	/*
	 * 3. buy(모든 상품을 받도록 선언)
	 * ************객체의 getter메서드의 활용*************
	 * 가진돈과 전달된 물건객체의 가격을 비교해서 돈이 적으면 "금액부족" 출력후에 종료하세요.
	 * 가진돈이 충분하면 물건의 가격을 money에서 차감하고 add(상품) 메서드를 호출합니다.
	 */ 	


	public void buy(Product product) {
		if(money<product.getPrice()) {
			System.out.println("금액부족");
            return;
		}else {
			money-=product.getPrice();
			this.add(product);
		}
	}

	/*
	 * 4. add(모든 상품을 받도록 선언)
	 * *************배열의 복사**************
	 * 만약 i의 값이 장바구니의 크기보다 같거나 크다면
	 * 기존의 장바구니보다 크기가 * 2큰 배열을 생성.
	 * 기존의 장바구니 값을 새로운 배열에 복사.
	 * 새로운 장바구니를 기존의 장바구니와 바꾼다.
	 * 
	 * 상품(매개변수)을 장바구니(배열)에 담는다.
	 * 
	 * info()메서드 호출
	 */

	private void add(Product product) {

		if(i>=cart.length) {
			Product[] cart2 = new Product[cart.length*2];
			for(int j=0;j<cart.length;j++) {
				cart2[j]=cart[j];
			}
			this.cart=cart2;
		}
		
		cart[i]=product;
		i++;
		
		info();
	}
	/*
	 * 5.info()
	 * - 장바구니 안에 담긴 물건의 목록(name)을 출력한다.
	 * - 남은금액 출력
	 * 출력예시: TV TV Computer Radio ......
	 * 		  남은금액: 500
	 * 메인에서 buy메서드 실행 
	 * 
	 */

	public void info() {
		for(int k=0;k<cart.length;k++) {
			if(cart[k]==null) break;
		System.out.print(cart[k].getName());
		System.out.print(" ");
		}
		
		System.out.println();
		System.out.println("남은금액:"+money);
	}

}

연결되고 연결되고 연결되는 문제. 어디에 뭘 넣으며 어떤 매개변수를 받냐 아니냐를 잘 구분하면 쉬워진다.

add메서드에서, 우선! 일단! 장바구니를 만들고 바꾼다. 그 뒤에 장바구니에 물건을 넣는 것!

 

(멤버변수 배열의 크기가 다른데도 바뀔 수 있다는 것을 이해하지 못했는데, 쉽게 String으로 생각하면 

2글자짜리를 10글자짜리로 바꾸는 것이 가능하니, 이것도 가능! 주소값이 바뀌는 것이다.)

 

if(cart[k]==null) break;를 거는 것도 수업에서 한 이유와 같다. 물건을 3개 넣으려 해도 장바구니는 2배씩 커지니 4개를 담는 장바구니가 생성될 것이고, 마지막 칸은 null일 수밖에 없다. 때문에 break를 걸어주는 것

 

 

 

main

package quiz12;

public class MainClass {
	public static void main(String[] args) {
		
		MyCart mycart = new MyCart(5000);
		
		Radio radio = new Radio();
		Tv tv = new Tv();
		Computer com = new Computer();
		
		mycart.buy(tv);
		mycart.buy(radio);
		mycart.buy(com);
		mycart.buy(com);
		mycart.buy(tv);
		mycart.buy(com);
		mycart.buy(com);
		mycart.buy(radio);
		mycart.buy(com);
		mycart.buy(radio);
		
		
		
	}

}
tv 
남은금액:4600
tv radio 
남은금액:4100
tv radio com 
남은금액:3500
tv radio com com 
남은금액:2900
tv radio com com tv 
남은금액:2500
tv radio com com tv com 
남은금액:1900
tv radio com com tv com com 
남은금액:1300
tv radio com com tv com com radio 
남은금액:800
tv radio com com tv com com radio com 
남은금액:200
금액부족

메인에서 라디오, 티비, 컴퓨터 객체를 생성해 주고, 그다음에 매개변수로 집어넣기.