여러 타입의 객체를 배열로 다루기
예시
package com.Hazel; public class Main { public static void main(String[] args) { Buyer b = new Buyer(); b.buy(new TV()); b.buy(new Computer()); b.buy(new Audio()); b.summary(); } } class Product { int price; int bonuspoint; Product(int price) { this.price = price; bonuspoint = (int)(price / 10.0); } Product() {} } 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"; } } class Buyer { int money = 1000; int bonuspoint = 0; Product[] item = new Product[10]; int i = 0; void buy(Product p) { if(money < p.price) { System.out.println("잔액이 부족하여 물건을 살 수 없습니다."); return; } else { money -= p.price; bonuspoint += p.bonuspoint; item[i++] = p; // ++ 연산자가 뒤에 있어서 저장하고 +1 System.out.println(p + "을 구매하셨습니다."); } } void summary() { int sum = 0; String itemList = ""; for(int i = 0; i < item.length ; i++) { if(item[i] == null) { break; } sum += item[i].price; itemList += item[i] + ", "; } System.out.println("구입하신 물품의 총금액은 " + sum + "입니다."); System.out.println("구입하는 제품은 " + itemList + "입니다."); } }
여기서 중요한 부분은
item[i++] = p;
이다. 매개변수로 전달된 인스턴스를 item 배열에 저장하는데, ++연산자가i
뒤에 오기 때문에 배열에 먼저 저장을 하고 i는 증가된다. 그래서 0번째 인덱스부터 인스턴스를 저장할 수 있다.그리고 또,
p
자체를System.out.println
으로 출력하는 것이 특이하다.p.toString()
으로 접근해야 원하는 문자열이 출력될 것이라고 생각했다. 검색해보니toString()
은 자바에서 특별 취급하는 메소드이며,toString()
을 메소드를 사용하면 그 클래스의 인스턴스 자체를 출력해도toString()
메소드의 문자열을 반환하도록 약속되어 있다고 한다. 즉,p.toString()
과p
출력 결과가 같다고 한다.