Java 다형성 활용과 다운캐스팅(4)

13111 단어 JavaJava

다형성 활용

실습

단골 고객 혜택

Gold 고객 추가
10 프로 할인
2프로 적립
전문 상담원은 없음

GoldCustomer

package witharraytest;

public class GoldCustomer extends Customer {
	
	double saleRatio;
	
	public GoldCustomer(int customerID, String customerName) {
		super(customerID, customerName);
		customerGrade ="GOLD";
		bonusRatio = 0.02;
		saleRatio = 0.1;
		
	}

	@Override
	public int calcPrice(int price) {
		bonusPoint +=price*bonusRatio;
		return price - (int)(price*saleRatio);
	}
	
}

CustomerTest

package witharraytest;

import java.util.ArrayList;

public class CustomerTest {

	public static void main(String[] args) {
		
		ArrayList<Customer> customerList = new ArrayList<Customer>();
		
		Customer customerLee = new Customer(10010,"이순신");
		Customer customerShin = new Customer(10011,"신사임당");
		GoldCustomer customerHong = new GoldCustomer(10012,"이순신");
		GoldCustomer customerYul = new GoldCustomer(10013,"이율곡");
		VIPCustomer customerKim = new VIPCustomer(10014,"김유신",12345);
		//type이 달라도 묵시적 형변환 때문에 ArrayList에 담을 수 있다.
		
		customerList.add(customerLee);
		customerList.add(customerShin);
		customerList.add(customerHong);
		customerList.add(customerYul);
		customerList.add(customerKim);
		
		System.out.println("==========출력=====");
		for(Customer customer:customerList) {
			System.out.println(customer.ShowCustomerInfo());
		}
		
		System.out.println("========= 할인율과 보너스 포인트 결과======");
		
		int price =10000;
		for(Customer customer : customerList) {
			int cost= customer.calcPrice(price);
			
			System.out.println(customer.getCustomerName()+"님이 "+cost +"를 지불하셨습니다.");
			System.out.println(customer.ShowCustomerInfo());
		}
		
	}

}


다운캐스팅


주로 overriding 으로 해결하는것이 좋음.
->
실습

package inheritance;

class Animal{
	public void move() {
		System.out.println("동물이 움직입니다.");
	}
}

class Human extends Animal{
	public void move() {
		System.out.println("사람이 두발로 걷습니다.");
	}
	
	public void readBook() {
		System.out.println("사람이 책을 읽습니다.");
	}
}

class Tiger extends Animal{
	public void move() {
		System.out.println("호랑이가 네발로 뜁니다.");
	}
	
	public void hunting() {
		System.out.println("호랑이가 사냥을 합니다.");
	}
}

class Eagle extends Animal{
	public void move() {
		System.out.println("독수리가 하늘로 날읍니다.");
	}
	
	public void flying() {
		System.out.println("독수리가 쥐를 잡습니다.");
	}
}

public class AnimalTest {

	public static void main(String[] args) {
		AnimalTest test = new AnimalTest();
		test.moveAnimal(new Human());
		test.moveAnimal(new Tiger());
		test.moveAnimal(new Eagle());
		
		
		//Animal animal = new Human();
		//위와 같이 생성한것과 같은 것임
		
	}
	
	public void moveAnimal(Animal animal) {
		animal.move();
		//전의 인스턴스를 추적하기 위해 instanceof 사용
		
		if(animal instanceof Human) {
			Human human = (Human)animal;
			human.readBook();
		}
		else if(animal instanceof Tiger) {
			Tiger tiger = (Tiger)animal;
			tiger.hunting();
		}
		else if(animal instanceof Eagle) {
			Eagle eagle = (Eagle)animal;
			eagle.flying();
		}
		else {
			System.out.println("지원되지 않는 기능입니다.");
		}
		
	}

}

하위 클래스에 추가 메소드가 있을 수 있음.
들어온 animal 이 Human 인가를 확인 (원래 인스턴스 타입을 확인)
instanceof

좋은 웹페이지 즐겨찾기