오전/오후 구분하기
디지털 벽시계 추가

Clock 을 상속받는 건 명확함

위 3개 기능은 디지털 벽시계 전용 기능
“시간 맞추는 방식”
- 다이얼 돌리는게 아니라, 세팅 버튼으로 설정
디지털 벽시계 전용 기능 구현하기: 오전/오후 구분 및 출력

아날로그 벽시계는 12시간 체제

“AM/PM을 기억하는 별도의 불리언 변수를 추가하는” 1번의 방법
DigitalClock클래스에 새 멤버변수를 추가해야함
2번의 방법은 새로운 멤버 변수를 추가하지 않고 부모 클래스 Clock의 seconds를 사용하기 때문에 1번 방법보다 관리하기 유리함
- 일반화 개념
- 24시간 체제가 더 일반적인 개념
- 12시간 체제는 24시간 체제의 특별한 경우

2번 방법 채택

“더 큰 변화”는 다음과 같음
Clock클래스의 시간 체제를 24시간 체제로 변경
참고로 이 예시가 자식 클래스를 추가하면서 부모 클래스가 변할 수 있음을 보여주는 예
- 부모 클래스
Clock의 시간 체제가 변했음
인간의 추상화 능력
자식 클래스를 추가하다 보면 패턴에 따라 공통 분모를 뽑아내는 추상화를 수행하고, 부모 클래스가 변할 수 있음
처음에 몰랐던 공통의 개념이 자식을 추가하다 보면 보임

부모 클래스인 Clock이 변경되어 AnalogClock도 변경됨
주의 사항
부모 클래스 변경에 조심해야 함
이번 예시처럼 부모 클래스가 바뀌어 자식 클래스를 모조리 변경하는 상황이 생기면 협업하는 입장에서 곤란하겠지? 특히 외부에 제공하는 제품일 때

부모 클래스 Clock에서 시를 보여줄 때는 여전히 12시간 체제로 반환
- 시간을 저장할 때 만 24시간 체제로 저장하도록 변햠
public class Clock {
protected static final int DAY_IN_SECONDS = 60 * 60 * 24;
protected int seconds;
public byte getHours() {
int hours = this.seconds / 60 / 60;
return hours == 0 ? 12 : (byte) hours;
}
public byte getMinutes() {
return (byte) (this.seconds / 60 % 60);
}
public byte getSeconds() {
return (byte) (this.seconds % 60);
}
public void tick() {
this.seconds = (this.seconds + 1) % DAY_IN_SECONDS;
}
public void mount() {
// 벽에 시계를 검
}
}public class AnalogClock extends Clock {
public short getSecondHandAngle() {
return (short) (getSeconds() * 6);
}
public short getMinuteHandAngle() {
return (short) (getMinutes() * 6);
}
public short getHourHandAngle() {
final int ANGLE_PER_HOUR = 360 / 12;
int hours = getHours() % 12;
return (short) (hours * ANGLE_PER_HOUR + getMinutes() * ANGLE_PER_HOUR / 60);
}
public void addSeconds(short seconds) {
int value = super.seconds + seconds;
while (value < 0) {
value += HALF_DAY_IN_SECONDS;
}
super.seconds = value % DAY_IN_SECONDS;
}
}public class DigitalClock extends Clock {
public boolean isBeforeMidday() {
return super.seconds / (DAY_IN_SECONDS / 2) == 0; // super.seconds < DAY_IN_SECONDS / 2
}
}DigitalClock 클래스
