05. 다형성과 다형성을 사용하는 이유

0

Java 공부

목록 보기
5/18

다형성(polymorphism) 이란?

  • 다형성이란 같은 자료형에 여러 가지 객체를 대입하여 다양한 결과를 얻어내는 성질을 의미한다.
  • 하나의 타입으로 다양한 실행 결과를 얻을 수 있으며 객체를 부품화하여 유지 보수를 용이하게 한다.

Animal

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

class Human extends Animal{
	
	public void move() {
		System.out.println("사람이 두발로 걷습니다.");
	}
	
	public void readBooks() {
		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("독수리가 날개를 쭉 펴고 멀리 날아갑니다");
	}
}

AnimalTest

public class AnimalTest {

	public static void main(String[] args) {

		Animal hAnimal = new Human();
		Animal tAnimal = new Tiger();
		Animal eAnimal = new Eagle();
		
		AnimalTest test = new AnimalTest();
		test.moveAnimal(hAnimal);
		test.moveAnimal(tAnimal);
		test.moveAnimal(eAnimal);
    }
        public void moveAnimal(Animal animal) {
		animal.move();
	}

사람이 두발로 걷습니다.
호랑이가 네 발로 뜁니다.
독수리가 하늘을 날아갑니다.


다형성을 사용하는 이유?

  • 다른 동물을 추가하는 경우
  • 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있다.
  • 그렇지 않는 경우 많은 if-else if문이 구현되고 코드의 유지보수가 어려워진다.
  • 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있음

다형성을 활용한 멤버십 프로그램 확장

  • 일반 고객과 VIP 고객 중간 멤버십 만들기(GOLD 고객)
  1. 제품을 살때는 10프로를 할인해준다
  2. 보너스 포인트는 2%를 적립해준다

GoldCustomer

public class GoldCustomer extends Customer {

	double salesRatio; // 할인 비율
	
	public GoldCustomer(int customerID, String customerName) {
		super(customerID, customerName);
		salesRatio = 0.1;
		bonusRatio = 0.02;
		customerGrade = "GOLD";
	}

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

CustomerTest

public class CustomerTest {

	public static void main(String[] args) {
		
		ArrayList<Customer> customersList = new ArrayList<>();
		
		Customer customerT = new Customer(0001, "Tomas");
		Customer customerJ = new Customer(0002, "James");
		Customer customerP = new GoldCustomer(0003, "Park");
		Customer customerK = new GoldCustomer(0004, "Kim");
		Customer customerL = new VIPCustomer(0005, "Lee");
		
		customersList.add(customerT);
		customersList.add(customerJ);
		customersList.add(customerP);
		customersList.add(customerK);
		customersList.add(customerL);
		
		System.out.println("고객 정보 출력");
		
		for( Customer customer : customersList) {
			System.out.println(customer.showCustomerInfo());
		}
		
		int price = 10000; // 10000원 상품
		for (Customer customer : customersList) {
			int cost = customer.calcPrice(price);
			System.out.println(customer.getCustomerName() + "님이" + cost +"원 지불 하셨습니다.");
			System.out.println(customer.getCustomerName() + "님의 현재 보너스 포인트는" + customer.bonusPoint + "입니다." );
		}
		
		if (customerK instanceof GoldCustomer) { // customerK가 GoldCustomer인지 확인 시켜줘 => true값이면 아래코드 실행!!
			GoldCustomer vc = (GoldCustomer)customerK;
			System.out.println(customerK.showCustomerInfo());
		}
	}
}

고객 정보 출력
Tomas님의 등급은 SILVER이며, 보너스 포인트는0입니다.
James님의 등급은 SILVER이며, 보너스 포인트는0입니다.
Park님의 등급은 GOLD이며, 보너스 포인트는0입니다.
Kim님의 등급은 GOLD이며, 보너스 포인트는0입니다.
Lee님의 등급은 VIP이며, 보너스 포인트는0입니다.
Tomas님이10000원 지불 하셨습니다.
Tomas님의 현재 보너스 포인트는100입니다.
James님이10000원 지불 하셨습니다.
James님의 현재 보너스 포인트는100입니다.
Park님이9000원 지불 하셨습니다.
Park님의 현재 보너스 포인트는200입니다.
Kim님이9000원 지불 하셨습니다.
Kim님의 현재 보너스 포인트는200입니다.
Lee님이9000원 지불 하셨습니다.
Lee님의 현재 보너스 포인트는500입니다.
Kim님의 등급은 GOLD이며, 보너스 포인트는200입니다.

0개의 댓글