프로그래밍 언어/JAVA

JAVA 입문 - 인터페이스와 다형성

개발 초보 2022. 5. 27. 18:46

지난 글: [프로그래밍 언어/JAVA] - JAVA 입문 - 인터페이스

 

인터페이스의 역할

인터페이스는 디폴트 메서드와 메서드와 정적 메서드 구현부가 없다면 그저 빈 껍데기이다. 그러면 메서드 선언부만 있는 인터페이스는 어디에 사용할까?

 

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

 

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

 

인터페이스와 다형성

인터페이스를 사용하면 다형성을 구현하여 확장성 있는 프로그램을 만들 수 있다. 클라이언트 프로그램을 많이 수정하지 않고 기능을 추가하거나 다른 기능을 사용할 수 있다는 것이다. 예제 시나리오를 코드로 구현해보자.

 

시나리오:

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

 

1. 순서대로 배분 : 모든 상담원이 동일한 상담 건수를 처리하도록 들어오는 전화 순서대로 상담원에게 하나씩 배분.

2. 짧은 대기열 찾아 배분 : 고객 대기 시간을 줄이기 위해 상담을 하지 않는 상담원이나 가장 짧은 대기열을 보유한 상담원에게 배분.

3. 우선순위에 따라 배분 : 고객 등급에 따라 등급이 높은 고객의 전화를 우선 가져와 업무 능력이 좋은 상담원에게 배분.

============================================================================================예제를 통해 '고객 상담 전화 배분 프로그램'을 생각할 수 있다. 우선 상담원에게 전화 업무를 배분하는 기능을 구현하기 위해 Scheduler 인터페이스를 만든다. Scheduler 인터페이스에는 시나리오 1~3에서 모두 공통으로 사용하는 메서드를 선언한다.

Scheduler 인터페이스를 구현하는 RoundRobin(순서대로), LeastJob(짧은 대기열 먼저), PriorityAllocation(우선순위에 따라) 클래스를 직접 만들며 세 클래스를 어떻게 활용하는지 알아보자. 

 

Scheduler 클래스

 

RobinRound 클래스

 

LeastJob 클래스

 

PriorityAllocation 클래스

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

 

SchedulerTest 클래스

public static void main(String[ ] args) 뒤에 선언한 throws IOException 은 문자를 입력받는 System.in.read( )를 사용하기 위해 오류를 처리하는 기능이라고 한다. 12행에서 문자를 입력받으면 입력 문자에 해당하는 배분 정책 클래스를 생성하여 대입한다. 콘솔 화면을 보면 입력 커서가 생성되었는데, 화면에 R,r,L,l,P,p 문자 중 하나를 입력하고 Enter를 누르면 해당 정책이 수행된다.

입력창에 p를 입력했기에 PriorityAllocation 클래스가 실행되었다. 위 6개의 문자가 아닌 다른 문자를 입력하면 '지원하지 않는 기능입니다.'를 출력한다.

 

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

앞에서 정의한 상담 전화 배분 정책은 언제든지 바뀔 수 있다. 예로 어느 회사에 이 프로그램을 팔러 소개하러 갔더니 그 회사 담당자가 "우리 회사는 상담원이 직접 가져오는 방식을 사용하고 싶습니다"라든가 "우리 회사는 VIP 전담 상담원을 따로 관리하여 VIP는 대기 없이 바로 상담을 받을 수 있게 하고 싶습니다" 등 여러 요구를 할 수 있다. 이런 경우 Scheduler 인터페이스를 구현하는 클래스를 추가로 만들기만 하면 된다. 이처럼 인터페이스는 구현된 클래스를 사용하는 클라이언트 코드와 기능을 제공하는 코드 사이의 약속이다.

 

참고 서적: 자바 프로그래밍 입문 - 박은종