다음과 같은 코드가 있다고하자
//카페 손님
public class CafeCustomer {
public String CafeCustomerName;
public void setCafeCustomerName(String cafeCustomerName) {
this.CafeCustomerName = cafeCustomerName;
}
}
//CafeCustomer 클래스로부터 단골손님A와 단골손님B 상속
public class CafeCustomerA extends CafeCustomer {
}
public class CafeCustomerB extends CafeCustomer {
}
//카페 사장님
public class CafeOwner {
public void giveItem(CafeCustomerB cafeCustomerB) {
System.out.println("give a glass of strawberry latte to CafeCustomer B");
}
public void giveItem(CafeCustomerA cafeCustomerA) {
System.out.println("give a glass of iced americano to CafeCustomer A");
}
}
//메뉴 주문
public class OrderExample {
public static void main(String[] args) throws Exception {
CafeOwner cafeowner = new CafeOwner();
CafeCustomerA a = new CafeCustomerA();
CafeCustomerB b = new CafeCustomerB();
cafeowner.giveItem(a);
cafeowner.giveItem(b);
}
}
- 카페 오너 입장에서 보면 CafeCustomer(A~Z)가 늘어날때마다 giveItem이라는 메서드를 새로 만들어 줘야할 것이다.
- 만약이게 수천개라면? ---> 답이없다.
- 그래서 인터페이스를 이용하여 CafeOwner랑 묶어주고 CafeCustomer들이 그 인터페이스를 참조하게 만들면된다.
- 이렇게되면 CafeOwner입장에서는 단순히 인터페이스만 참조변수로 받아오고 나머지일은 인터페이스가 다하게되는것이다.
- 마치 인터페이스를 중간 매니져로 두는 것과 같다.
interface Customer {
String getOrder();
}
class CafeCustomerA implements Customer {
public void sss(){
System.out.println("ㅇㅇ");
}
public String getOrder(){
return "a glass of iced americano";
}
}
class CafeCustomerB implements Customer {
public String getOrder(){
return "a glass of strawberry latte";
}
}
class CafeOwner {
public void giveItem(Customer customer) {
System.out.println("Item : " + customer.getOrder());
}
}
public class OrderExample {
public static void main(String[] args) throws Exception {
CafeOwner cafeowner = new CafeOwner();
Customer cafeCustomerA = new CafeCustomerA();
Customer cafeCustomerB = new CafeCustomerB();
cafeowner.giveItem(cafeCustomerA);
cafeowner.giveItem(cafeCustomerB);
}
}
- CafeOwner의 giveItem 메서드를 보면 무조건 Customer만 참조변수로 받게되어있다.
- 따라서 CafeOwner입장에서는 CafeCustomer가 100개가생기던 1000개가 생기던 관심이없다.
- 실행 메서드에 보면
Customer cafeCustomerA = new CafeCustomerA();로 하위 클래스인 CafeCustomerA가 상위 클래스인 Customer에 참조변수로 할당되는것을 볼 수 있는데, 이는 다형성의 적용이다.- 이제 CafeCustomerA는 상위클래스에 있는 getOrder()만 쓸 수 있게 된다.
- 실제로 아래 실행에서
cafeCustomerA.sss()메서드는 쓸 수 없게되어있다.