각진 세상에 둥근 춤을 추자

[Java] 인터페이스와 다형성 본문

Java

[Java] 인터페이스와 다형성

circle.j 2022. 9. 23. 10:32

인터페이스를 사용하면 다형성을 구현하는 확장성 있는 프로그램을 만들 수 있다. 

즉 클라이언트 프로그램을 많이 수정하지 않고 기능을 추가하거나 다른 기능을 사용할 수 있다. 

 

이를 이해하는 예제 프로그램을 만들어 본다.

 

 
[예제 시나리오]

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

1. 순서대로 배분하기: 모든 상담원이 동일한 상담 건수를 처리하도록 들어오는 전화 순서대로 상담원에게 하나씩 배분한다.
2. 짧은 대기열 먼저 배분하기: 고객 대기 시간을 줄이기 위해 상담을 하지 않는 상담원이나 가장 짧은 대기열을 보유한 상담원에게 배분한다.
3. 우선 순위에 따라 배분하기: 고객 등급에 따라 등급이 높은 고객의 전화를 우선 가져와서 업무 능력이 좋은 상담원에게 우선 배분한다.

 

 

먼저, 상담원에게 전화 업무를 배분하는 기능을 구현하기 위해 Scheduler 인터페이스를 만든다. 

Scheduler 인터페이스에는 시나리오 1~3에서 모두 공통으로 사용하는 메서드를 선언한다. 

 

 

 

Scheduler 인터페이스를 구현하는

RounRobin(순서대로), LeastJob(짧은 대기열 먼저), PriorityAllocation(우선순위에 따라) 클래스를 만들어 본다.

 

Scheduler 인터페이스는 추상 메서드 2개를 선언했다. 

따라서 Scheduler 인터페이스를 구현하는 각 클래스도 모두 추상 메서드 2개를 구현해야 한다. 

 

 

(1) Scheduler 인터페이스 정의하기

package ch10_2;

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

 

 

(2) RoundRobin: 순서대로 배분하기 (시나리오 1)

package ch10_2;

// 상담원 한 명씩 돌아가며 동일하게 상담 업무 배분

public class RoundRobin implements Scheduler{

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

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

 

 

(3) LeastJob: 짧은 대기열 먼저 배분하기 (시나리오 2)

package ch10_2;

// 현재 상담 업무가 없거나 상담 대기가 가장 적은 상담원에게 배분 

public class LeastJob implements Scheduler{

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

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

}

 

 

(4) PriorityAllocation: 우선 순위에 따라 배분하기 (시나리오 3)

package ch10_2;

// 고객 등급이 높은 고객의 전화부터 대기열에서 가져와 업무 능력이 높은 상담원 우선 배분

public class PriorityAllocation implements Scheduler{

	@Override
	public void getNextCall() {
		System.out.println("고객 등급이 높은 고객의 전화를 먼저 가져옵니다.");
	}

	@Override
	public void sendCallAgent() {
		System.out.println("업무 skill 값이 높은 상담원에게 우선적으로 배분합니다.");
	}

}

 

이제 사용자가 콘솔 화면에서 문자를 하나 입력하면 그 입력 문자에 따라 위 배분 정책을 정하고 실행하는 프로그램을 구현해 본다.

 

package ch10_2;

import java.io.IOException;

public class SchedulerTest {
	public static void main(String[] args) throws IOException {
		// 문자를 입력받는 System.in.read()를 사용하려면 IOException에서 오류를 처리해야 한다.
		
		System.out.println("전화 상담 할당 방식을 선택하세요.");
		System.out.println("------------------------------------");
		System.out.println("R: 한 명씩 차례로 할당됩니다.");
		System.out.println("L: 대기가 가장 적은 상담원에게 할당됩니다.");
		System.out.println("P: 우선 순위가 높은 고객 먼저 할당됩니다.");
		System.out.println("------------------------------------");
		
		// 할당 방식을 입력받아 ch 변수에 대입
		int ch = System.in.read();
		Scheduler scheduler = null;
		
		// 입력받은 값이 R 또는 r이면 RoundRobin 클래스 생성
		if ( ch == 'R' || ch == 'r' ) {
			scheduler = new RoundRobin();
		}
		
		// 입력받은 값이 L 또는 l이면 LeastJob 클래스 생성
		else if ( ch == 'L' || ch == 'l' ) {
			scheduler = new LeastJob();
		}
		
		// 입력받은 값이 P 또는 p이면 PriorityAllocation 클래스 생성
		else if ( ch == 'P' || ch == 'p' ) {
			scheduler = new PriorityAllocation();
		}
		
		// 외의 값을 입력했을 때
		else {
			System.out.println("지원되지 않는 기능입니다.");
			return;
		}
		
		scheduler.getNextCall();
		scheduler.sendCallAgent();
		
	}
}

 

'Java' 카테고리의 다른 글

[Java] String 클래스  (0) 2022.09.23
[Java] Object 클래스  (0) 2022.09.23
[Java] 인터페이스  (0) 2022.09.21
[Java] final 예약어  (0) 2022.09.21
[Java] 템플릿 메서드 - 게임 캐릭터레벨 기능 구현하기  (0) 2022.09.20