ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 인터페이스(인터페이스와 다형성)2
    개발언어/JAVA 2023. 11. 4. 09:32

    인터페이스와 다형성

    인터페이스의 역할

    인터페이스는 클라이언트 프로그램에 어떤 메서드를 제공하는지 미리 알려주는 명세(specification)또는 약속의 역할을 한다. 예를 들어 Abc 인터페이스를 구현한 A클래스가 있다. 이 클래스를 사용하는 Z프로그램이 있다고 가정하자. Abc 인터페이스에는 구현할 추상 메서드가 모두 선어되어 있고, 어떤 매개변수가 사용되는지, 어떤 자료형 값이 반환되는지 선언되어 있다. 즉 Z프로그램에서는 A클래스의 구현 코드 전체를 살펴보지 않고 Abc인터페이스 선어부만 봐도 이 A클래스를 어떻게 사용할지 알 수 있는 것이다.

     

    Abc abc;
    
    abc = new A();
    abc = new B();
    abc = new C();

     

    만약 Z프로그램에서 Abc 인터페이스를 구현한 다른 클래스인 B를 사용하고 싶다면, 인터페이스 명세에 따라 A클래스에서 B클래스로 교체해서 사용할 수 있다. A,B,C 클래스가 모두 Abc 인터페이스를 구현했으므로 위 코드와 같이 Z프로그램에서는 Abc를 타입으로 선언하여 코드를 작성할 수 있다.

     

    Z프로그램에서 각 클래스를 사용할 때 클래스에서 구현한 내용은 몰라도 Abc 인터페이스에서 선언한 메서드의 매개변수 자료형과 반환 값만 알면 Abc 인터페이스를 구현한 어떤 클래스이든 사용할 수 있다.

     

    정리하자면, 인터페이스의 역할은 인터페이스를 구현한 클래스가 어떤 기능의 메서드를 제공하는지 명시하는 것이다. 그리고 클라이언트  프로그램은 인터페이스에서 약속한 명세대로 구현한 클래스를 생성해서 사용하면 된다.

     

    먼저 상담원에게 전화 업무를 배분하는 기능을 구현하기 위해 Scheduler 인터페이스를 만든다.Scheduler 인터페이스에는 시나리오 1~3에서 모두 공통으로 사용하는 메서드를 선언한다.

     

    Scheduler 인터페이스 정의하기

    package scheduler;
    
    public interface Scheduler{
        //다음 전화를 가져오는 기능
        public void getNextCall();
        //상담원에게 전화를 배분하는 기능
        public void sendCallToAgent();
    }

     

    RoundRobin 클래스 구현하기

    package scheduler;
    
    //상담원 한 명씩 돌아가며 동일하게 상담 업무 배분
    public class RoundRobin implements Scheduler{
       @Override
       public void getNextCall(){
          System.out.println("상담 전화를 순서대로 대기열에서 가져온다.");
       }
       
       @Override
       public void sendCallToAgent(){
          System.out.println("다음 순서 상담원에게 배분한다.");
       }
    }

     

    LeastJob 클래스 구현하기

    package scheduler;
    
    //현재 상담 업무가 없거나 상담 대기가 가장 적은 상담원에게 배분
    public class LeastJob implements Scheduler{
       @Override
       public void getNextCall(){
          System.out.println("상담 전화를 순서대로 대기열에서 가져온다.");
       }
       
       @Override
       public void sendCallToAgent(){
          System.out.println("현재 상담 업무다 없거나 대기가 가장 적은 상담원에게 할당한다.");
       }
    }

     

    PriorityAllocation 클래스 구현하기

    package scheduler
    
    //고객 등급이 높은 고객의 전화부터 대기열에서 가져와 업무 능력이 높은 상담원 우선 분배
    public class PriorityAllocation implements Scheduler{
       @Override
       public void getNextCall(){
          System.out.println("고객 등급이 높은 고객의 전화를 먼저 가져온다.");
       }
       
       @Override
       public void sendCallToAgent(){
          System.out.println("업무 skill 값이 높은 상담원에게 우선적으로 배분한다.");
       }
    }

     

     

    클라이언트가 클래스를 사용하는 방법

    scheduler.getNextCall();
    scheduler.sendCallToAgent();

     

    앞에서 정의한 상담 전화 배부 정책은 언제든지 바뀔 수 있다. 예를 들어 어느 회사에 이고객 상담 전화 배분 프로그램으 ㄹ팔려고 소개하러 갔더니 그 회사 당담자가 "우리 회사는 상담원에게 상담 전화를 자동으로 배분하는 방식이 아닌, 상담원이 전화를 직접 가져오는 방식을 사용하고 싶습니다."라든가 "우리는 회사 VIP 전담 상담원을 따로 관리하여 VIP는 대기 없이 바로 상담을 받을 수 있게 하고 싶습니다" 등 여러 요구를 할 수 있다. 이런 경우 새로운 전화 배분 정책은 Scheduler 인터페이스를 이용하여 새로운 클래스를 구현하는 식으로 하면된다. 어떤 클래스를 구현하건 클라이언트가 인터페이스를 구현한 클래스를 사용하는 방법위 위 코드와 같다.

     

     

    클라이언트 프로그램은 각 클래스이 구현 방법은 몰라도 인터페이스에서 선언된 매개 변수, 반환 값을 보고 클래스를 사용할 수 있다.

     

     

    [출저 - Do it! 자바 프로그래밍 입문 , 박은종]

    http://www.easyspub.co.kr/20_Menu/BookView/A001/267/PUB

     

    http://www.easyspub.co.kr/20_Menu/BookView/A001/267/PUB

     

    www.easyspub.co.kr

     

    댓글

Designed by Tistory.