관리 메뉴

나구리의 개발공부기록

자바의 정석 기초편 ch7 - 27 ~ 30[매개변수다형성,여러종류의 객체를 배열로 다루기] 본문

유튜브 공부/JAVA의 정석 기초편(유튜브)

자바의 정석 기초편 ch7 - 27 ~ 30[매개변수다형성,여러종류의 객체를 배열로 다루기]

소소한나구리 2023. 11. 27. 16:45

1) 다형성의 장점

  • 다형적 매개변수
  • 하나의 배열로 여러종류 객체 다루기

2) 매개변수의 다형성 (다형적 매개변수)

  • 참조형 매개변수는 메서드 호출시 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있음
  • 메서드의 매개변수에 매개변수의 다형성을 활용하여 조상타입의 참조형 매개변수로 정의해두면 해당 메서드를 호출하여 사용할 때 매개변수의 타입의 자손 타입을 모두 입력할 수 있어 메서드의 활용도가 높아짐

 

(1) 예제

class Product {
	int price;	// 제품의 가격
	int bonusPoint;	// 제품구매 시 제공하는 보너스점수

	Product(int price) {
		this.price = price;
		bonusPoint = (int)(price/10.0);	// 보너스점수는 제품가격의 10%
	}
}

class Tv1 extends Product {
	
	Tv1() { // Tv1의 생성자
		// 조상클래스의 생성자 Product(int price)를 호출
		super(100); // Tv의 가격 100만원, 보너스포인트는 10만원
	}

	// Object클래스의 toString()을 오버라이딩
	public String toString() { return "Tv"; }
}

class Computer extends Product {
	Computer() { super(500); }

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

class Buyer {	// 고객, 물건을 사는 사람
	int money = 1000;	// 소유금액
	int bonusPoint = 0;	// 보너스점수

	void buy(Product p) {	// 다형적 매개변수
		if(money < p.price) {
			System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
			return;
		}

		money -= p.price;            // Buyer가 가진 돈에서 구입한 제품의 가격을 뺌
		bonusPoint += p.bonusPoint;  // Buyer의 보너스포인트를 추가
        
        // 아래의 둘은 같은 코드
		System.out.println(p + "을/를 구입하셨습니다.");
//		System.out.println(p.toString() + "을/를 구입하셨습니다.");	
	}
}

class ex7_8 {
	public static void main(String args[]) {
		Buyer b = new Buyer();
		
        // Tv1 객체를 생성하여 Product 타입 참조변수에 할당
        // b.buy()의 인자에 p를 입력하여 메서드 호출
//		Product p = new Tv1();	
//		b.buy(p);
		
        // 위의 2줄의 코드를 한줄로 표현, 동작은 동일함
		b.buy(new Tv1());	    
		b.buy(new Computer());	// 위와 동일

		System.out.println("현재 남은 돈은 " + b.money + "만원입니다.");
		System.out.println("현재 보너스점수는 " + b.bonusPoint + "점입니다.");
	}
}

3) 여러종류의 객체를 배열로 다루기

  • 조상타입의 객체 배열은 그의 자손의 참조값을 담을 수 있어 여러 객체를 다룰 수 있음

 

(1) 예제

  • 아래의 예제에서는 구입할 상품을 미리 담아두는 장바구니의 기능을 객체 배열로 표현하였음
  • 객체 배열의 타입을 조상타입으로 설정하여 자손의 객체타입을 모두 담을 수 있도록 설정함
class Product2 {
	int price;	// 제품의 가격
	int bonusPoint;	// 제품구매 시 제공하는 보너스점수

	Product2(int price) {
		this.price = price;
		bonusPoint = (int)(price/10.0);
	}

	Product2() {} // 기본 생성자
}

class Tv2 extends Product2 {
	Tv2() {  super(100);	 }

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

class Computer2 extends Product2 {
	Computer2() { super(200); }
	public String toString() { return "Computer"; }
}

class Audio2 extends Product2 {
	Audio2() { super(50); }
	public String toString() { return "Audio"; }
}

class Buyer2 {	// 고객, 물건을 사는 사람
	int money = 1000;   // 소유금액
	int bonusPoint = 0; // 보너스점수
	Product2[] cart = new Product2[10]; // 구입할 제품을 저장하기 위한 배열(장바구니)
	int i =0;	// Product배열에 사용될 카운터

	void buy(Product2 p) {
		if(money < p.price) {
			System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
			return;
		}
		money -= p.price;	// 가진 돈에서 구입한 제품의 가격을 뺌
		bonusPoint += p.bonusPoint;	// 제품의 보너스 점수를 추가
		cart[i++] = p;	// 제품을 Product[] cart에 저장
		System.out.println(p + "을/를 구입하셨습니다.");
	}

	void summary() {	// 구매한 물품에 대한 정보를 요약해서 보여줌
		int sum = 0;	// 구입한 물품의 가격합계
		String itemList ="";	// 구입한 물품목록

		// 반복문을 이용해서 구입한 물품의 총 가격과 목록을 만듦
		for(int i=0; i<cart.length;i++) {
			if(cart[i]==null) break; // 기본값인 경우 반복문 종료
			sum += cart[i].price;
			// 배열의 문자열과 컴마를(,) itemList 변수에 저장
			itemList += cart[i] + ", ";
//			itemList += cart[i].toString()과 같음 + ", ";
		}
		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();
	}
}

 

** 참고

  • vector클래스는 가변 배열 기능을 가지고 있음 - 11장에서 배움
  • 배열의 길이를 관리할 필요 없이 알아서 메모리의 용량에 따라 길이를 조정해 줌 -> 배열의 길이를 직접 관리하지 않아도 됨
  • object[ ] (오브젝트배열)을 멤버로 가지고 있으며 모든 종류의 객체를 저장할 수 있음(최고 조상)

 

** 출처 : 남궁성의 정석코딩_자바의정석