– 다형성
자바에서 다형성(Polymorphism)은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 같은 인터페이스나 상위 클래스 타입을 통해 여러 다른 하위 클래스 객체를 동일하게 다룰 수 있는 기능을 의미합니다. 다형성을 통해 코드의 유연성과 재사용성을 높일 수 있습니다.
– 다형성의 주요 개념
- 상위 클래스 참조 변수로 하위 클래스 객체를 참조: 상위 클래스나 인터페이스 타입의 변수로 여러 하위 클래스 객체를 참조할 수 있습니다.
- 동적 바인딩(Dynamic Binding): 메서드 호출이 컴파일 시점이 아닌 런타임 시점에 실제 객체의 타입에 따라 적절한 메서드가 호출되는 방식입니다.
- 메서드 재정의(Overriding): 상위 클래스의 메서드를 하위 클래스에서 재정의하여 각기 다른 동작을 수행할 수 있습니다.
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
- 같은 코드에서 여러 다른 실행 결과가 나옴
- 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나임
- 다형성을 잘 활용하면 유연하고 확장성 있고, 유지보수가 편리한 프로그램을 만들수 있음
public class Customer {
protected int customerId;
protected String customerName;
protected String customerGrade;
int bonusPoint;
double bonusRatio;
// public Customer(){
// customerGrade = "SILVER";
// bonusRatio = 0.01;
// System.out.println("Customer() Call");
// }
public Customer(int customerId, String customerName){
this.customerId = customerId;
this.customerName = customerName;
customerGrade = "SILVER";
bonusRatio = 0.01;
System.out.println("Customer(int, String) Call");
}
public int calcPrice(int price){
bonusPoint += price * bonusRatio;
return price;
}
public int getCustomerId() {
return customerId;
}
public void setCustomerId(int customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getCustomerGrade() {
return customerGrade;
}
public void setCustomerGrade(String customerGrade) {
this.customerGrade = customerGrade;
}
public String showCustomerInfo(){
return customerName + "님의 등급은" + customerGrade + "이며, 보너스 포인트는"
+ bonusPoint + "입니다.";
}
}
public class GoldCustomer extends Customer{
protected int agentID;
double salesRatio;
public GoldCustomer(int customerId, String customerName) {
super(customerId, customerName);
customerGrade = "Gold";
salesRatio = 0.1;
bonusRatio = 0.02;
}
@Override
public int calcPrice(int price) {
bonusPoint += price * bonusRatio;
return price - (int)(price * salesRatio);
}
}
public class VIPCustomer extends Customer {
protected int agentID;
double salesRatio;
public VIPCustomer(int customerId, String customerName, int agentID){
super(customerId, customerName);
customerGrade = "VIP";
salesRatio = 0.1;
bonusRatio = 0.05;
this.agentID = agentID;
System.out.println("VIPCustomer()");
}
@Override
public int calcPrice(int price) {
bonusPoint += price * bonusRatio;
return price - (int)(price * salesRatio);
}
public int getAgentID(){
return agentID;
}
@Override
public String showCustomerInfo() {
return super.showCustomerInfo() + "상담원 아이디는 " + agentID;
}
}
public class CustomerTest {
public static void main(String[] args) {
ArrayList<Customer> customerList = new ArrayList<Customer>();
Customer customerLee = new Customer(10010, "이순신");
Customer customerShin = new Customer(10020, "신사임당");
Customer customerHong = new GoldCustomer(10030, "홍길동");
Customer customerYul = new GoldCustomer(10040, "이율곡");
Customer customerKim = new VIPCustomer(10050, "김유신", 12345);
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.getCustomerName() +" 님의 현재 보너스 포인트는 " + customer.bonusPoint + "점입니다.");
}
}
}