디지털 벽시계 시간 맞추기

디지털 벽시계 전용 기능 구현하기: 시/분/초를 따로 설정하기

디지털시계는 크게 두 가지 방법이 있음

  • 현실에 존재하는 동작 참고하기

디지털 벽시계 시간 맞추는 방법1: 시간을 더하고, set버튼을 누르는 방식

“SET” 버튼으로 시/분/초 중에 선택

“up” 버튼으로 값 증가

추가가 예상되는 메서드는 슬라이드처럼 3개

디지털 벽시계 시간 맞추는 방법2: 숫자를 직접 입력

결론적으로 방법2 선택

setTime 도우미 함수도 부활 이라고 표현한 이유는 시간적 결합을 해결한 시간 바꾸기에서 모든 setter 을 제거했기 때문

  • 구현 방법은 자유
    • Wrap
      • setIsBeforeMidday 호출 순서를 주의해야함 (받아올림)
        • 시간적 결합에 따라 호출 순서가 생김
        • 나머지 setHours, setMinutes, setSeconds 순서는 상관없음
    • Clamp

public class DigitalClock extends Clock {
    public boolean isBeforeMidday() {
        return super.seconds / (DAY_IN_SECONDS / 2) == 0;   // super.seconds < DAY_IN_SECONDS / 2
    }
 
    public void setIsBeforeMidday(boolean isAm) {
        if (isAm) {
            super.seconds += (DAY_IN_SECONDS / 2);
            return;
        }
        super.seconds -= (DAY_IN_SECONDS / 2);
    }
 
    public void setHours(byte hours) {
        // super.seconds에서 시에 해당하는 부분만 매개변수로 받은 hours로 변경, 나머지 분, 초는 그대로 유지
        int currentSecondsAndMinutesWithoutHours = super.seconds % (60 * 60);
        super.seconds = hours * 60 * 60 + currentSecondsAndMinutesWithoutHours;
    }
 
    public void setMinutes(byte minutes) {
        // super.minutes에서 분에 해당하는 부분만 매개변수로 받은 minutes로 변경, 나머지 시, 초는 그대로 유지
        int currentHours = super.seconds / (60 * 60);   // [0,11]
        int currentSeconds = super.getSeconds();
        assert (minutes >= 0 && minutes <= 59);
        super.seconds = currentHours * 60 * 60 + minutes * 60 + currentSeconds;
    }
 
    public void setSeconds(byte seconds) {
        // super.seconds에서 초에 해당하는 부분만 매개변수로 받은 seconds로 변경, 나머지 시, 분은 그대로 유지
        int currentHours = super.seconds / (60 * 60);
        int currentMinutes = super.getMinutes();
        assert (seconds >= 0 && seconds <= 59);
        super.seconds = currentHours * 60 * 60 + currentMinutes * 60 + seconds;
    }
 
    public void setTime(byte hours, byte minutes, byte seconds, boolean isAm) {
        setHours(hours);
        setMinutes(minutes);
        setSeconds(seconds);
        setIsBeforeMidday(isAm);    // 반드시 마지막에 호출해야함
    }
}

0건의 항목