JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter3

인터페이스 - 클래스 상속과 인터페이스 구현 함께 쓰기+복습예제

giggs 2022. 1. 9. 18:51

클래스 상속과 인터페이스 구현 함께 쓰기

 

  • 실무에서 프레임워크나 오픈소스와 함께 연동되는 구현을 하게 되면 클래스 상속과 인터페이스의 구현을 같이 사용하는 경우가 많음

  • 책이 순서대로 대여가 되는 도서관 구현
  • 책을 보관하는 자료 구조가 Shelf에 구현됨 (ArrayList)
  • Queue 인터페이스를 구현함
  • Shelf 클래스를 상속받고 Queue를 구현한다.

 


 

 

Shelf class 구현 -

책을 보관하는 자료 구조 - ArrayList 방식으로 사용

 

 


 

Queue 인터페이스를 구현

 

 


 

Shlef 클래스를 상속받고  Queue 인터페이스를 구현한 - BookShelf 클래스 

 

 


 

Test ---

 

 

 

 

이미 잘 만들어진 자기보다 좀 더 일반적인 클래스에서 상속을 받고

자기가 구현해야 할 기능이 선언되어있는 인터페이스를 구현하는 구도로 많이 사용한다.

 

 


 

복습해보세요

 

복습 1 예제 ) 추상 클래스와 템플릿 메서드

 

Player가 있고 Player는 GameLevel 속성을 가집니다. 각 GameLevel 단계마다 run(), jump(), turn() 세 가지 기능이 업그레이드됩니다.

 

초보자 레벨 : 천천히 달립니다. run()만 가능

중급자 레벨 : 빠르게 달리고, 점프할 수 있습니다. run(), jump() 가능

고급자 레벨 : 엄청 빠르게 달리고, 높게 점프하고, 턴 할 수 있습니다. run(), jump(), turn() 가능

 

Player는 한 번에 하나의 레벨 상태만을 가질 수 있습니다.

 

Player가 play() 중에 레벨에 있는 go(int count)라는 메서드를 호출하면

① -> run() 하고 ②count 횟수만큼 jump() 하고 ③turn() 합니다.

 

다음 클래스 다이어그램을 참고하여 각 레벨에서 go()가 호출될 때 다음과 같이 출력되도록 하세요

 

 

 

 


 

1. 템플릿 메서드를 활용하여 추상 클래스 PlayerLevel 생성

 

템플릿 메서드 : 추상 메서드나 구현된 메서드를 활용하여 코드의 흐름(시나리오)을 정의하는 메서드

                   final로 선언하여 하위 클래스에서 재정의 할 수 없게 함 -

 


 

2. PlayerLevel 상속받아서 각 레벨에 맞는 조건으로 재정의

 

BeginnerLevel 클래스

 

AdvancedLevel 클래스

SuperLevel 클래스

 

 

 


 

3. 추상 클래스 PlayerLevel을 포함하는 Player 클래스 생성

 

 


 

4. 메인보드 테스트 - 출력 확인

 

 

 

레벨 업그레이드도 잘되고 출력도 잘되는 것을 확인 GOOD :)

 

Player 가 변화하는 레벨들 중에서 한 번에 하나의 레벨만을 가지도록 하기 위해서 그 부분을 추상 클래스로 참조하여 쓴 부분이 핵심인 것 같다.  그렇지 않다면 Player 부분에 if-elseif 등을 계속 써야 하겠지.. 레벨마다 조건마다 어우. :(

 


 

복습 2 예제) 인터페이스를 활용한 정책 프로그래밍

 

고객 센터에 전화 상담을 하는 상담원들이 있습니다. 일단 고객에게서 전화가 오면 대기열에 저장되고 각 상담원에게 배분이 됩니다.

 

배분이 되는 정책은 크게 세 가지가 있습니다.

  1. 모든 상담원이 동일한 상담 건수를 처리하도록 상담원 순서대로 배분합니다.
  2. 쉬고 있거나 상담원에게 할당된 통화 수가 가장 적은 상담원에게 배분합니다.
  3. 고객의 등급에 따라 등급이 높은 고객은 업무능력이 우수한 상담원에게 배분합니다.

 

세 가지 정책은 필요에 따라 바뀌어 운영될 수 있습니다. 다음 클래스 다이어그램을 참고하여 각 배분 규칙이 적용되도록 구현해 보세요

 

 

테스트 프로그램은 다음과 같습니다. 문자를 입력받아 입력되는 문자에 따라 배분 규칙을 수행하도록 합니다.

 

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();
	}

}

 


1. 인터페이스 Scheduler 생성

 

 

 


 

2. 인터페이스 조건에 맞게 구현한 Scheduler implements 클래스들 생성

 

 

RoundRobin

 

 

LeastJob

 

 

PriorityAllocation

 

 


 

3. 메인 테스트 - 출력 확인

 

 


 

 

review

클래스 상속과 인터페이스 구현을 함께 사용하기!
각각 배운 내용들을 한 곳에 같이 사용해보았다.

이미 잘 만들어진 자기보다 좀 더 일반적인 클래스에서 상속을 받고
자기가 구현해야 할 기능이 선언되어있는 인터페이스를 구현하는 구도로 많이 사용된다!
선반이라는 일반적인 더 넓은 의미 클래스에서 책 선반이라고 상속을 받고
그 안에서 넣고 빼는 기능을 하는 인터페이스 Queue를 구현한 책 선반 클래스

WoW 배웠던 두 가지 개념을 하나로 합쳐서 사용해보는 거라서 어렵지는 않았다.
이제 이런 방식들을 어떻게 활용하는지를 더 많은 예제로 만나보아야겠다는 생각이 들었다.

복습 예제에서는 추상 클래스를 상속받아 사용하는 예제와 인터페이스를 구현해서 사용하는 예제를 해보았는데
추상 클래스 상속 예제 - Player에서는 upgradeLevel 해주는 부분
인터페이스 구현 예제 - Scheduler에서는 스캐너가 아닌 다른 방법으로 입력받는 부분
한 번 더 체크해 놓으면 좋을 거 같다!
GOOD :)