더북(TheBook)

따라서 struct tm을 앞에서처럼 초기화하면 이 구조체의 일관성이 깨지게 된다. tm_wdaytm_yday 멤버는 다른 멤버와 연결되는 값을 가지지 못한다. 다음과 같이 함수를 만들면 이 멤버의 값을 일관성 있게 설정할 수 있다.

 

yday.c

19 struct tm time_set_yday(struct tm t) {
20   // tm_mdayssms 1부터 시작한다.
21   t.tm_yday += DAYS_BEFORE[t.tm_mon] + t.tm_mday - 1;
22   // 윤년을 처리하는 로직
23   if ((t.tm_mon > 1) && leapyear(t.tm_year+1900))
24     ++t.tm_yday;
25   return t;
26 }

이 함수는 이전 달의 날수와 tm_mday 멤버와 윤년을 반영한 값을 이용해서 올해의 날을 계산한다. 이 함수는 현재 수준(레벨 1)에서 주목할 부분이 있다. 즉, 함수의 매개변수 중에서도 t의 멤버만 수정할 뿐 원본 오브젝트(t 자체)는 건드리지 않는다.

TAKEAWAY 6.25 struct 타입 매개변수는 값 전달 방식(pass-by-value)으로 전달된다.

변경 내역을 추적하도록 함수의 결과를 원본에 다시 대입한다.

 

yday.c

39   today = time_set_yday(today);
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.