-
자바의 정석 Ex7_9 (하나의 배열에 여러종류의 객체 저장)Java/자바의정석 2023. 2. 20. 16:54반응형
package Chap07; class Product2 { int price; int bonusPoint; Product2(int price) { this.price = price; bonusPoint = (int)(price/10.0); } } class Tv2 extends Product2 { Tv2() { super(100); } @Override public String toString() { return "Tv"; } } class Computer2 extends Product2 { Computer2() { super(200); } @Override public String toString() { return "Computer"; } } class Audio2 extends Product2 { Audio2() { super(50); } @Override public String toString() { return "Audio"; } //ToString메소드 오버라이딩 //반환값 String으로 하여 "Audio"반환 } class Buyer2 { int money = 1000; int bonusPoint = 0; Product2[] cart = new Product2[10]; int i =0; void buy(Product2 p) { if(money < p.price) { System.out.println("잔액이 부족하여 물건을 살 수 없습니다."); return; } money -= p.price; bonusPoint += p.bonusPoint; cart[i++] = p; //cart의 배열에 toString의 반환값 -> 상품 구매이름을 반환 System.out.println(p + "을/를 구입하셨습니다."); System.out.println("cart===>" + cart); System.out.println("cart[0].price? ==>" +cart[0].price); } void summary() { int sum = 0; String itemList =""; for(int i=0; i<cart.length;i++) { if(cart[i]==null) break; sum += cart[i].price; //객체 주소를 toString으로 반환하여서 각항목에 접근가능 itemList += cart[i] + ", "; } System.out.println("구입하신 물품의 총금액은 " + sum + "만원입니다."); System.out.println("구입하신 제품은 " + itemList + "입니다."); } } class Ex7_9 { public static void main(String args[]) { Buyer2 b = new Buyer2(); b.buy(new Tv2()); // 부모에서 자식 b.buy(new Computer2()); b.buy(new Audio2()); b.summary(); } }
========실행결과===========
Tv을/를 구입하셨습니다.
cart===>[LChap07.Product2;@1b6d3586
cart[0].price? ==>100
Computer을/를 구입하셨습니다.
cart===>[LChap07.Product2;@1b6d3586
cart[0].price? ==>100
Audio을/를 구입하셨습니다.
cart===>[LChap07.Product2;@1b6d3586
cart[0].price? ==>100
구입하신 물품의 총금액은 350만원입니다.
구입하신 제품은 Tv, Computer, Audio, 입니다.Product2 int price int bonusPointProduct2(int pirce)Product2는 위 그림과 같다.
그리고 이런 Product2를 상속받는 Tv2, Computer2, Audio2 클래스가 있다.
내부에는 동일하게
@Override public String toString() { return "Audio"; } //ToString메소드 오버라이딩
toString()메서드를 오버라이딩하여 객체의 주소값을 toStringI() 으로 반환한다
class Buyer2 { int money = 1000; int bonusPoint = 0; Product2[] cart = new Product2[10]; int i =0; void buy(Product2 p) { if(money < p.price) { System.out.println("잔액이 부족하여 물건을 살 수 없습니다."); return; } money -= p.price; bonusPoint += p.bonusPoint; cart[i++] = p; //cart의 배열에 toString의 반환값 -> 상품 구매이름을 반환 System.out.println(p + "을/를 구입하셨습니다."); System.out.println("cart===>" + cart); System.out.println("cart[0].price? ==>" +cart[0].price); }
Buyer2 클래스에는 money,와 bonusPoint 인스턴스 변수가 선언되어있고
Product2[] cart = new Product2[10] 길이가 10인 객체 배열이 선언되어있다.
그리고 buy(Product2 p) 메서드를 통하여 앞서 선언하였던 class들을 호출한다.
여기서 (Product2 p)의 경우는 buy메서드는 Product2의 참조형만 받을수있도록 우선 선언해두었다고 이해하면 된다.
Product2에 맞는 객체를 넘겨 buy메서드가 실행이된다면 i는 매번 증가할것이고
cart[i++] 이 되며 cart[0] -> cart[1] ... cart[10]이 된다.
객체의 값으로는 넘겨받아온 Product2의 참조변수p의 주소를 담는다.
cart===>[LChap07.Product2;@1b6d3586
실로 객체의 주소를 찍어보면 이해가 더더욱 쉽다.
void summary() { int sum = 0; String itemList =""; for(int i=0; i<cart.length;i++) { if(cart[i]==null) break; sum += cart[i].price; //객체 주소를 toString으로 반환하여서 각항목에 접근가능 itemList += cart[i] + ", "; } System.out.println("구입하신 물품의 총금액은 " + sum + "만원입니다."); System.out.println("구입하신 제품은 " + itemList + "입니다."); }
다음으로 summary()메서드이다.
sum += cart[i].price 해당부분에서 cart[i] : i의 객체주소
객체주소를 통해 해당 해당객체가 참조하는 곳의 변수 호출이 가능하다.
class Ex7_9 { public static void main(String args[]) { Buyer2 b = new Buyer2(); b.buy(new Tv2()); // 부모에서 자식 b.buy(new Computer2()); b.buy(new Audio2()); b.summary(); } }
마지막으로 main을 보면
Buyer2참조형의 b참조변수를 선언하고
b.buy메서드에 new Tv2() 객체를 넘겨준다.
그럼 b.buy(Product2 p)에서 newTv2()를 전달받아 Product2 p 에 대입이 되어진다.
Computer2 와 Audio2도 동일하다.
반응형'Java > 자바의정석' 카테고리의 다른 글
자바의정석 Ex7_11 인터페이스 (0) 2023.02.21 자바의정석 Ex7_10 추상 클래스, 추상 메서드 (0) 2023.02.21 자바의정석 Ex7_7(다형성) (0) 2023.02.20 자바의 정석 (this, super)의 이해 (0) 2023.02.20 자바의 정석 Ex7_2 (this, super) (0) 2023.02.20