다형성 활용 예제

최수정·2022년 9월 30일
0

자바프로그래밍

목록 보기
4/15

문제

다음은 물건을 구입하는 사람을 정의한 Buyer클래스이다. 이 클래스는 멤버변수로 돈(money)과 장바구니(cart)를 가지고 있다. 제품을 구입하는 기능의 buy메서드와 장바구니에 구입한 물건을 추가하는 add메서드, 구입한 물건의 목록과 사용금액, 그리고 남은 금액을 출력하는 summary메서드를 완성하시오.

  • 메서드명 : buy

기능 : 지정된 물건을 구입한다. 가진 돈(money)에서 물건의 가격을 빼고, 장바구니(cart)에 담는다.

만일 가진 돈이 물건의 가격보다 적다면 바로 종료한다.
반환타입 : 없음
매개변수 : Product p - 구입할 물건

  • 메서드명 : add

기능 : 지정된 물건을 장바구니에 담는다.
만일 장바구니에 담을 공간이 없으면, 장바구니의 크기를 2배로 늘린 다음에 담는다.

반환타입 : 없음
매개변수 : Product p - 구입할 물건

  • 메서드명 : summary

기능 : 구입한 물건의 목록과 사용금액, 남은 금액을 출력한다.

반환타입 : 없음
매개변수 : 없음

[지정된 main함수]

public static void main(String[] args) {

		Buyer b = new Buyer();
		b.buy(new Tv());
		b.buy(new Computer());
		b.buy(new Tv());
		b.buy(new Audio());
		b.buy(new Computer());
		b.buy(new Computer());
		b.buy(new Computer());

		b.summary();

	}

[실행결과]

잔액이 부족하여 Computer을/를 살 수 없습니다.
구입한 물건 : Tv, Computer, Tv, Audio, Computer, Computer,

사용한 금액 : 850
남은 금액 : 150

문제구현

public class PolyTest {

	public static void main(String[] args) {

		Buyer b = new Buyer();
		b.buy(new Tv());
		b.buy(new Computer());
		b.buy(new Tv());
		b.buy(new Audio());
		b.buy(new Computer());
		b.buy(new Computer());
		b.buy(new Computer());

		b.summary();

	}
}

class Buyer {

	int money = 1000;
	Product[] cart = new Product[3]; // 구입한 제품을 저장하기 위한 배열
	int i = 0; // Product배열 cart에 사용될 index
	int sum; // 장바구니 안의 가격을 더해줄 변수

	void buy(Product p) {
		if (money < p.price) {
			System.out.println("잔액이 부족하여 " + p + " 을/를 살 수 없습니다. ");

		} else {
			money = money - p.price;
			add(p);
			sum += p.price;
		}

	}

	void add(Product p) {
		if (i >= cart.length) {

			Product[] newCart = new Product[(cart.length * 2)];

			for (int i = 0; i < cart.length; i++) {
				newCart[i] = cart[i];
				}
			cart = newCart;
            //System.out.println("cart 주소: " + cart);
            //System.out.println("newcart 주소: " + newCart);
			cart[i] = p;
			i++;
		} else {
			cart[i] = p;
			i++;
		}

	}

	void summary() {
		// System.out.print("구입한 물건: ");
		// for (i=0; i < cart.length; i++) {
		// System.out.print( cart[i] + " , ");
		// } 이 코드를 간결하게 표현 가능한 toString()
		System.out.println("구입한 물건: " + Arrays.toString(cart));

		System.out.println("사용한 금액 : " + sum);
		System.out.println("남은 금액: " + money);

	}

}

class Product {

	int price; // 제품의 가격

	public Product(int price) {

		this.price = price;
	}

}

class Tv extends Product {

	Tv() {
		super(100);
	}

	public String toString() {
		return "Tv";
	}
}

class Computer extends Product {

	Computer() {
		super(200);
	}

	public String toString() {
		return "Computer";
	}
}

class Audio extends Product {
	Audio() {
		super(50);
	}

	public String toString() {
		return "Audio";
	}

}

에러사항 및 알게된거

배열의 복사와 배열에서 = 연산자의 의미

void add(Product p) {
		if (i >= cart.length) {
			Product[] temp = cart;
			cart = new Product[i * 2];
			cart = temp;
		} else {
			cart[i] = p;
			i++;	
		}

	}

나는 위 코드를 Buyer class 안에 상품을 장바구니에 담는 메서드로 구현을 한것인데,

  • expected case : temp을 이용해 기존 cart
    의 값을 옮겨 놓고, 크기를 늘린 새로운 cart에 값을 옮겨넣는다.
  • actual case: temp는 cart와 같은 주소값을 갖는 참조변수로 선언되었고, cart는 새로운 객체의 주소값을 갖게 되고 다시 temp에 있던 기존 cart의 주소값을 옮겨받았기 때문에 그냥 코드는 쓸데없이 주소값만을 왔다갔다 하다가 새로운 객체만 생성하고 버려버렸다.

actual case에서 볼 수 있듯이 배열에서의 = 연산자는 그저 주소값을 참조한다는 뜻이다. 그래서 실제 배열값을 복사하기 위해선 자바에서 만들어 놓은 배열복사 함수를 사용하거나, 코드로 구현해주어야한다.

  • 코드구현 ex
void add(Product p) {
		if (i >= cart.length) {

			Product[] newCart = new Product[cart.length * 2];

			for (int i = 0; i < cart.length; i++) {
				newCart[i] = cart[i];
				}
                cart = newCart;

		} else {
			cart[i] = p;
			i++;
		}

	}

0개의 댓글