Interface를 이용한 다형성 구현

이정연·2023년 7월 4일

자바기초

목록 보기
18/25

다음과 같은 코드가 있다고하자

//카페 손님
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입장에서는 단순히 인터페이스만 참조변수로 받아오고 나머지일은 인터페이스가 다하게되는것이다.
  • 마치 인터페이스를 중간 매니져로 두는 것과 같다.
  • Code
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() 메서드는 쓸 수 없게되어있다.
profile
반갑습니다.

0개의 댓글