Hello, Dino
추상화(abstract) 클래스를 활용한 예제 (Scheduler Program) 본문
지난번에 포스팅한 예제 소스에 추상화 클래스를 활용해보며 추상화 클래스를 이해해보자 😤
다형성(Polymorphism)을 활용한 예제 (Scheduler Program)
Scheduler 프로그램을 개발해보자 👩💻 1. 기능 이벤트 등록 (Add Event) 이벤트 리스트 조회 (List) 이벤트 검색 (Show) 프로그램 종료 (Exit) 2. 이벤트 종류 OneDay Duration Deadline 세 종류의 Event..
di-no.tistory.com
특정 날짜 값을 기준으로 이벤트를 조회하는 기능은 어떻게 구현해야할까?
OneDay / Duration / Deadline 이벤트 모두 특정 날짜 값을 기준으로 이벤트를 조회하는 기능이 구현되어야한다.
그렇기때문에 상위 클래스인 Event 클래스에 특정 날짜 값을 매개변수로 받아 해당 이벤트 날짜와 매개변수 날짜와의 관련 여부 값을 boolean타입으로 return해주는 method를 구현해보자.
public class Event {
public String title;
public Event(String title) {
this.title = title;
}
public boolean isRelevant(MyDate date) {
???
return false;
}
...
}
하지만 해당 method에는 문제가 있다.
바로 OneDay / Duration / Deadline 이벤트 모두 특정 날짜 값과 이벤트 날짜와 관련 여부를 return 해주는
기능은 동일하지만, 관련 여부를 판단하는 기준이 제각기 다르다.
- OneDay : 이벤트 날짜 == 매개변수 날짜
- Duration : 이벤트 시작 날짜 <= 매개변수 날짜 && 이벤트 종료 날짜 >= 매개변수 날짜
- Deadline : 이벤트 종료 날짜 >= 매개변수 날짜
하위 클래스에서 Override를 해서 각 이벤트 클래스에서 구현을 하면 되겠지만,
상위 클래스인 Event 클래스의 isRelevant() method의 구현 부분은 무의미한 코드가 된다.
이럴때는 추상화 method를 사용하면 상위 클래스에는 무의미한 코드를 제거할 수 있고,
하위 클래스에서 상위 클래스의 method를 Override하여 구현할 수 있다.
public abstract class Event {
public String title;
public Event(String title) {
this.title = title;
}
public abstract boolean isRelevant(MyDate date);
...
}
추상 method 선언 방법은 아래와 같다.
추상 method를 선언하기 위해서는 abstract 키워드를 사용하여 해당 클래스를 추상 클래스로 선언하고 추상 method를 선언해야한다. 추상 method의 특징은 선언부만 있고 구현부는 없다. 이 구현부는 각 하위 클래스에서 상속 받아 구현해야한다.
public class OneDay extends Event{
...
@Override
public boolean isRelevant(MyDate date) {
return this.date.compareTo(date) == 0;
}
}
public class Duration extends Event {
...
@Override
public boolean isRelevant(MyDate date) { // begin <= date <= end
return this.begin.compareTo(date) <= 0 && end.compareTo(date) >= 0;
}
}
public class Deadlined extends Event {
...
@Override
public boolean isRelevant(MyDate date) {
return this.deadline.compareTo(date) >= 0;
}
}
public class Scheduler {
...
private void handleShow() throws Exception {
String dateStr = scanner.next();
MyDate date = parseDateString(dateStr);
for(int i=0; i<eventsCount; i++) {
if(events[i].isRelevant(date)) {
System.out.println(events[i].toString());
}
}
}
}
만약 위에서 설명한 방법이 아닌, 상위 클래스인 Event 클래스에 isRelevant() method를 선언하지 않고 개별적으로 서브 클래스에만 isRelevant() method를 선언했다면 Scheduler클래스에서 컴파일러 에러가 발생할 것이다.
왜냐하면 상위 클래스가 자식 클래의 타입의 객체를 참조하는 경우에는 하위 클래스의 member에는 접근할 수 없기 때문이다.
'JAVA' 카테고리의 다른 글
인터페이스(Interface)를 활용한 예제 (Scheduler Program) (1) | 2020.03.18 |
---|---|
다형성(Polymorphism)을 활용한 예제 (Scheduler Program) (1) | 2020.03.17 |
상속 (Inheritance) & 다형성 (Polymorphism) (0) | 2020.03.11 |
String.format() 자리수 맞추기 (1) | 2020.03.11 |
JDK 설치 / 환경 변수 설정 / Eclipse 설치 (0) | 2019.03.12 |