[JAVA][패스트캠퍼스]인터페이스 응용

김주현·2021년 4월 23일
0

인터페이스 역할

  • 인터페이스는 클라이언트 프로그램에 어떤 메서드를 제공하는지 알려주는 명세(specification) 또는 약속
  • 인터페이스에서 강제하는 메소드를 구현하지 않으면 프로그램은 컴파일조차 되지 않음
  • 한 객체가 어떤 인터페이스의 타입이라 함은 그 인터페이스의 메서드를 구현했다는 의미
  • 클라이언트 프로그램은 실제 구현내용을 몰라도 인터페이스의 정의만 알면 그 객체를 사용할 수 있음
  • 인터페이스를 구현해 놓은 다양한 객체를 사용함 - 다형성
    :JDBC를 구현한 오라클, MSSQL 라이브러리 등

인터페이스 구현


Scheduler.java

package scheduler;
//Scheduler인터페이스를 만들어서 두개의 메서드를 선언
public interface Scheduler {
	public void getNextCall();
	public void sendCallToAgent();
}

RoundRobin.java

package scheduler;
//Scheduler인터페이스를 불러와서 RoundRobin클래스 구현
public class RoundRobin implements Scheduler{

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

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

}

LeastJob.java

package scheduler;
//Scheduler인터페이스를 불러와서 LeastJob클래스 구현
public class LeastJob implements Scheduler{

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

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

}

PriorityAllocation.java

package scheduler;
//Scheduler인터페이스를 불러와서 PriorityAllocation클래스 구현
public class PriorityAllocation implements Scheduler{

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

	@Override
	public void sendCallToAgent() {
		System.out.println("업무 숙련도가 높은 상담원에게 먼저 배분합니다.");
		
	}
	

}

SchedulerTest.java

package scheduler;

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 : 우선순위가 높은 고객우선 숙련도 높은 상담원");
		
		//System.in.read(); : 콘솔창에서 사용자로부터 값을 입력받는 함수
		//정수형을 입력받아서 ch변수로 출력
		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();
	}

}

여러개의 인터페이스 구현

인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스를 구현 할 수 있음
디폴트 메서드의 이름이 중복되는 경우에는 재정의함

인터페이스 상속

인터페이스 간에도 상속이 가능함
구현이 없으므로 extends 뒤에 여러 인터페이스를 상속받을 수 있음
구현 내용이 없으므로 타입 상속(type inheritance)라고 함

X.java

package interfaceex;

public interface X {
	void x();
}

Y.java

package interfaceex;

public interface Y {
	void y();
}

MyInterface.java

package interfaceex;
//인터페이스간에도 상속이 가능함
public interface MyInterface extends X,Y{

	void myMethod();
}

MyClass.java

package interfaceex;
//인터페이스간에도 상속이 가능함
public class MyClass implements MyInterface{

	@Override
	public void x() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void y() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void myMethod() {
		// TODO Auto-generated method stub
		
	}


}

인터페이스 구현과 클래스 상속 함께 사용

Shelf.java

package bookshelf;

import java.util.ArrayList;

public class Shelf {

	//상속받을때 사용할 수 있는 protected 접근제어자 선언
	protected ArrayList<String> shelf;
	
	public Shelf() {
		shelf=new ArrayList<String>();
	}

	public ArrayList<String> getShelf() {
		return shelf;
	}

	public int getCount() {
		return shelf.size();
	}
	
	
}

Queue.java

package bookshelf;

public interface Queue {
	
	void enQueue(String title);
	String deQueue();
	
	int getSize();

}

BookShelf.java

package bookshelf;

//Shelf클래스 상속받아옴, Queue인터페이스 정의
public class BookShelf extends Shelf implements Queue{

	@Override
	public void enQueue(String title) {
		shelf.add(title);
	}

	@Override
	public String deQueue() {
		//remove명령어를 이용해 맨앞에 있는 선반 반환
		return shelf.remove(0);
	}

	@Override
	public int getSize() {
	//Shelf클래스의 getCount메서드 반환
		return getCount();
	}
	

}

BookShelfTest.java

package bookshelf;

public class BookShelfTest {
	public static void main(String[] args) {
		Queue bookQueue = new BookShelf();
		bookQueue.enQueue("태백산맥1");
		bookQueue.enQueue("태백산맥2");
		bookQueue.enQueue("태백산맥3");
		
		//queue방식대로 들어간순서대로 먼저꺼내짐 (first-in-out)
		System.out.println(bookQueue.deQueue());
		System.out.println(bookQueue.deQueue());
		System.out.println(bookQueue.deQueue());
	}
}

0개의 댓글