클래스 상속과 인터페이스 구현 함께 쓰기
- 실무에서 프레임워크나 오픈소스와 함께 연동되는 구현을 하게 되면 클래스 상속과 인터페이스의 구현을 같이 사용하는 경우가 많음
- 책이 순서대로 대여가 되는 도서관 구현
- 책을 보관하는 자료 구조가 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 예제) 인터페이스를 활용한 정책 프로그래밍
고객 센터에 전화 상담을 하는 상담원들이 있습니다. 일단 고객에게서 전화가 오면 대기열에 저장되고 각 상담원에게 배분이 됩니다.
배분이 되는 정책은 크게 세 가지가 있습니다.
- 모든 상담원이 동일한 상담 건수를 처리하도록 상담원 순서대로 배분합니다.
- 쉬고 있거나 상담원에게 할당된 통화 수가 가장 적은 상담원에게 배분합니다.
- 고객의 등급에 따라 등급이 높은 고객은 업무능력이 우수한 상담원에게 배분합니다.
세 가지 정책은 필요에 따라 바뀌어 운영될 수 있습니다. 다음 클래스 다이어그램을 참고하여 각 배분 규칙이 적용되도록 구현해 보세요
테스트 프로그램은 다음과 같습니다. 문자를 입력받아 입력되는 문자에 따라 배분 규칙을 수행하도록 합니다.
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 :)
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter3' 카테고리의 다른 글
인터페이스 - 메서드, 구현, 상속 (0) | 2022.01.04 |
---|---|
인터페이스(interface) (0) | 2022.01.04 |
추상 클래스(abstract class) 와 템플릿 메서드 패턴 (0) | 2022.01.04 |
다운 캐스팅과 instanceof (0) | 2022.01.04 |
다형성과 다형성을 사용하는 이유 (0) | 2022.01.03 |