[Java] 인터페이스 - 인터페이스를 활용한 다형성 구현

나영원·2020년 8월 30일
0

Java_basic

목록 보기
50/60

인터페이스의 역할은?

인터페이스는 클라이언트 프로그램에 어떤 메서드를 제공하는지 알려주는 명세(specification) 또는 약속입니다. 그 이유는 어떤 객체가 어떤 인터페이스 타입이라는 것은 그 메서드들을 다 구현했다는 의미이기 때문입니다. 그렇기 때문에 클라이언트 프로그램은 실제 모듈이나 클래스의 구현내용을 몰라도 인터페이스의 정의만 알면 그 객체를 사용할 수 있게 됩니다.

인터페이스와 다형성 구현하기

고객 센터에는 전화 상담을 원하는 상담원들이 있습니다. 일단 고객 센터로 전화가 오면 대기열에 저장됩니다. 상담원이 지정되기 전까지 대기 상태가 됩니다. 각 전화가 상담원에게 배분되는 정책은 다음과 같이 여러방식으로 구현될 수 있습니다.

  • 상담원 순서대로 배분하기
  • 대기가 잛은 상담원 먼저 배분하기
  • 우선수위가 높은(숙련도가 높은) 상담원에게 먼저 배분하기

위와 같은 다양한 정책이 사용되는 경우 interface를 정의하고 다양한 정책을 구현하여 실행하세요.

코드를 작성하기 전에 설계단계에서 어떤 메서드가 필요한지 구상해서 그것을 인터페이스로 만드는 것이 선결과제입니다. 과제 해결을 위해 위와 같이 먼저 코드 관계도를 그려보는 단계가 필요합니다. 그 다음 관계도를 바탕으로 코드를 작성합니다.

public interface Scheduler {
	public void getNextCall();
	public void sendCallToAgent();
}

인터페이스 Scheduler를 생성해서 getNextCall();과 sendCallToAgent() 메서드를 작성합니다. 간단해 보이는 코드이지만 설계단계에서 어떤 메서드들이 필요한지 미리 선언하는 것은 어려운과제가 될 수 있습니다.

public class RoundRobin implements Scheduler {

	public void getNextCall() {
		System.out.println("상담 전화를 순서대로 대기열에서 가져옵니다.");
	}

	public void sendCallToAgent() {
		System.out.println("다음 순서의 상담원에게 배분합니다.");
	}

}
public class LeastJob implements Scheduler {

	@Override
	public void getNextCall() {
		System.out.println("상담 전화를 순서대로 대기열에서 가져옵니다.");
	}

	@Override
	public void sendCallToAgent() {
		System.out.println("현재 상담업무가 없거나 상담대기가 가장 적은 상담원에게 할당합니다");
	}

}
public class PriorityAllocation implements Scheduler {

	@Override
	public void getNextCall() {
		System.out.println("고객등급이 높은 고객의 call을 먼저 가져옵니다.");
	}
	@Override
	public void sendCallToAgent() {
		System.out.println("업무 숙련도가 높은 상담원에게 먼저 배분합니다.");
	}

}
  • Scheduler 인터페이스를 각각의 방식으로 구현한 3가지 클래스를 작성합니다.

  • 다른 방식의 도입이 필요하다면 하나의 클래스를 더만들어서 implement를 통해 언제든지 확장이 가능합니다.

import java.io.IOException;

public class SchedulerTest {

	public static void main(String[] args) throws IOException {

		System.out.println("전화 상담원 할당 방식을 선택하세요");
		System.out.println("R : 한명씩 차례대로");
		System.out.println("L : 대기가 적은 상담원 우선");
		System.out.println("P : 우선순위가 높은 고객운선 숙련도 높은 상담원");

		int ch = System.in.read();
		Scheduler scheduler = null;
		
		if(ch == 'R'|| ch== 'r') {
			scheduler = new RoundRobin();
		}
		else if( ch == 'L' || ch =='l') {
			scheduler = new LeastJob();
		}
		else if( ch == 'P' || ch =='p') {
			scheduler = new PriorityAllocation();
		}
		else {
			System.out.println("지원되지 않는 기능입니다.");
			return;
		}
		
		scheduler.getNextCall();
		scheduler.sendCallToAgent();
	}	
}
  • Scheduler 객체를 실행하기 위한 Test클래스를 만듭니다. 이부분이 실제 클라이언트들이 사용하게 되는 부분입니다.

  • 먼저 어떤 입력값이 입력값이 될 수 있을지 출력문을통해 안내를 하고 System.in.read()를 통해 입력값을 받습니다. 그후 if 문을 통해 각 입력값 별로 어떤 클래스의 인스턴스를 생성해야되는지를 구현하고 마지막으로 .getNExcall()와 sendCallToaAent를 실행합니다.

  • 간단한 예를 통해 인터페이스를 활용하여 다양한 정책이나 알고리즘을 프로그램의 큰 수정 없이 적용하고 확장할 수 있음을 배웠습니다. 반대로 하나의 정책이나 알고리즘으로 구현되는 프로그램을 여러개의 정책이나 알고리즘을 선택할 수 도있도록 인터페이스를 작성하는 경우도 있습니다.

profile
배우는 개발 일기

0개의 댓글