-
Java - 상속 다형성(다형성 활용하기)6-1개발언어/JAVA 2023. 11. 3. 11:17
다형성 활용하기
일반 고객과 VIP 고객의 중간 등급 만들기
예제 시나리오
고객이 늘어 VIP 고객만큼 물건을 많이 구매하지는 않지만, 그래도 단골인 고객에게 해택을 주고 싶다. 그래서 GOLD고객 등급을 하나 추가한다. GOLD 고객의 혜택은 다음과 같다.
- 제품을 살 때는 항상 10%할인을 준다.
- 보너스 포인트를 2% 적립해 준다.
- 담당 전문 상담원은 없다.새로운 고객 등급 추가하기
GoldCustomer.java
package polymorphism; public class GoldCustomer extends Customer{ double saleRatio; public GoldCustomer(int customerID, String customerName){ super(customerID, customerName); customerGrade = "GOLD"; bonusRatio = 0.02; saleRatio = 0.1; } //재정의한 메서드 public int calcPrice(int price){ bonusPoint += price * bonusRatio; return price - (int)(price * saleRatio); } }
GoldCustomer 클래스는 지불 가격과 보너스 포인트를 계산하는 calcPrice()메서드만 재정의했다. 이처럼 상속을 사용하면 새로운 기능이 추가되더라고 쉽게 구현할 수 있다.
배열로 고객 5명 구현하기
여러 등급의 고객을 한번에 관리할 수 있도록 구현해 보자
예제 시나리오
이 회사의 고객은 현재 5명이다. 5중 VIP 1명, GOLD 2명, SILVER 2명이다. 이 고객들이 각각 10,000원 짜리 상품을 구매했을 때의 결과를 출력한다.Customer.java
package polymorphism; import java.util.ArrayList; public class CustomerTest{ public static void main(String[] arg){ ArrayList<Customer> customerList = new ArrayList<Customer>(); Customer customerLee = new Customer(10010,"이지훈"); Customer customerShin = new Customer(10020,"신지수"); Customer customerHong = new GoldCustomer(10030,"홍영희"); Customer customerChio = new GoldCustomer(10040,"최유진"); Customer customerKim = new VIPCustomer(10050,"김가을",2000); customerList.add(customerLee); customerList.add(customerShin); customerList.add(customerHong); customerList.add(customerChoi); customerList.add(customerKim); } //고객 정보 출력 for(Customer customer : customerList){ System.out.println(customer.showCustomerInfo()); } //이지훈 님의 등급은 SILVER이며, 보너스 포인트는 0입니다. //신지수 님의 등급은 SILVER이며, 보너스 포인트는 0입니다. //홍영희 님의 등급은 GOLD이며, 보너스 포인트는 0입니다. //최유진 님의 등급은 GOLD이며, 보너스 포인트는 0입니다. //김가을 님의 등급은 VIP이며, 보너스 포인트는 0입니다. 담당 상담원은 번호는 2000입니다. //할인율과 보너스 포인트 계산 int price = 10000; // 다형성 구현 for(Customer customer : customerList){ int cost = customer.calcPrice(price); System.out.println(customer.getCustomerName() + "님이" + cost + "원 지불하셨습니다."); System.out.println(customer.getCustomerName() + "님의 현재 보너스 포인트는" + customer.bonusPoin + "점입니다."); } //이지훈 님이 10000원 지불하셨습니다. //이지훈 님의 현재 보너스 포인트는 100점입니다. //신지수 님이 10000원 지불하셨습니다. //신지수 님의 현재 보너스 포인트는 100점입니다. //홍영희 님이 9000원 지불하셨습니다. //홍영희 님의 현재 보너스 포인트는 200점입니다. //최유진 님이 9000원 지불하셨습니다. //최유진 님의 현재 보너스 포인트는 200점입니다. //김가을 님이 9000원 지불하셨습니다. //김가을 님의 현재 보너스 포인트는 500점입니다. }
위 코드에서 for(Customer customer: customerList)문장은 customerList 배열의 요소를 하나씩 가져와서 Customer형 변수에 넣었다. 고객의 정보를 ArrayList 배열에 저장할 때 Customer형으로 형 변환을 하여 추가했기 때문에 배열 요소를 하나씩 가져올 때도 Customer형으로 가져오게 된다. 그리고 각 인스턴스가 calcPrice()메서드를 호출하면 현재 이 변수의 실제 인스턴스가 무엇이냐에 따라 재정의한 메서드를 각각 호출하여 계산한다. 이것이 다형성이다.
만약 재정의한 메서드가 가상 메서드 방식에 의해 자동으로 호출되지 않는다면 if-else문을 사용하여 각 자료형에 적합한 코드를 따로 구현해야 한다. 게다가 새로운 등급의 고객이 추가로 필요한 경우에는 또 다른 조건을 구현해야 하므로 코드의 유지 보수가 어려워진다. 이런 경우 상속과 다형성을 잘 활용하면 복잡한 코드를 간결하게 줄일 수 있고 확장 있는 프로그램을 구현한 수 있다.
[출저 - Do it! 자바 프로그래밍 입문 , 박은종]
http://www.easyspub.co.kr/20_Menu/BookView/A001/267/PUB
'개발언어 > JAVA' 카테고리의 다른 글
Java - 추상 클래스(추상 클래스)1-1 (0) 2023.11.03 Java - 상속 다형성(다형성 활용하기:IS-A 관계, HAS-A 관계)6-2 (1) 2023.11.03 Java - 상속과 다형성(다형성)5 (1) 2023.11.01 Java - 상속과 다형성(super)2 (0) 2023.10.17 Java - 상속과 다형성(상속)1 (1) 2023.10.17