애플 숏컷에서 루프 빠져나가기

심심해서 팀에서 가볍게 운영하는 슬랙에 출퇴근을 기록하는 규칙을 자동화 하는 숏컷을 만들다가 심심함의 범위가 넓어져 기능을 조금씩 추가하고 있습니다. 이번에는 출퇴근 시각과 자리 비운 시간을 기록해 매일 노동시간을 계산하고 이 값을 쌓았다가 주간, 월간 평균을 구하면 재미있을 것 같아 출퇴근과 자리 비움 때마다 시간을 기록하도록 했습니다. 그런데 이렇게 기록한 값을 가져와 평균을 구하려고 보니 약간 난처한 상황에 처했습니다.

처음 떠올린 요구사항은 계산을 하는 오늘을 기준으로 지난 5근무일 동안의 노동시간 평균과 지난 20근무일 동안의 노동시간 평균을 구하는 것입니다. 그래서 오늘을 기준으로 하루씩 뒤로 이동하며 그 날에 노동시간 기록이 있는지 확인해 기록이 있으면 가져오고 기록을 총 다섯 개 가져오면 반복을 멈추고 평균을 낼 생각이었습니다. 값을 데이터베이스나 스프레드시트에 기록한 다음 가져와 계산하면 더 편했을텐데 숏컷은 로컬에서 사용할 만한 데이터베이스 앱이 없고 - 있는데 모르는 것일 수도 있음 - 넘버즈 앱을 사용하자니 너무 복잡해졌습니다.

그래서 노동시간을 JSON 모양으로 기록해 놓고 오늘 날짜를 기준으로 하루씩 뒤로 가며 각 날짜에 해당하는 키를 읽어 거기 기록된 값을 가져오도록 만들었습니다. 그런데 중간에 휴가나 휴일이 끼어 있을 수 있는데 날짜가 휴가인지, 휴일인지 판단하는 것 보다는 그냥 값이 없으면 하루 더 뒤로 가서 값이 있는지 확인하기를 반복하게 만들면 어쨌든 5근무일치 값을 가져올테니 훨씬 간단할 것 같았습니다. 그래서 오늘을 기준으로 하루씩 뒤로 이동하며 유효한 노동시간 기록을 가져오기를 반복해 5근무일 또는 20근무일 치 값을 가져오면 멈추고 멈추기 전에는 총 30번 반복하도록 만들기로 합니다.

그런데 찾아보니 애플 숏컷에는 루프를 빠져나오는 구문이 없습니다. 생각한 방법으로 만들 수 없게 되어 어쩌나 싶었지만 다른 방법을 고안하기 전에 혹시 애플 숏컷에서 루프를 빠져나올 방법이 없을지 검색해보니 이미 같은 문제에 맞닥뜨린 사람이 있었는데 이런 해결 방법을 상상하지도 못해 따라하면서도 무척 흥미로웠고 또 즐거웠습니다.

그래프

결과

설명

그래프

결과

설명

 

a는 더 많은 루프 횟수 도중 더하다가 루프 중간에 빠져나갈 때 조건으로 사용할 변수.

 

ExitLoop는 루프를 빠져나갈지 말지를 결정하는데 사용할 변수. 0이면 루프 계산을 계속하고 1이면 루프 계산을 중단시키려고 함.

 

  • 루프 시작. 루프는 총 20번 반복하는데 이 중 계산을 다섯 번 수행하면 루프를 빠져나가려고 함.

  • ExitLoop를 관찰하며 이 값이 1이면 루프를 돌 때마다 할 계산을 수행하지 않고 아무 것도 안 한 채로 루프를 다음으로 넘기기만 함.

 

ExitLoop1이 아니면, 그러니까 0이면 루프에 해당하는 계산을 수행함.

 

  • 매 루프마다 a에 1을 더하다가 5가 되면 루프를 나갈 텐데 루프를 나가는 구문이 없으니 여기서는 위에서 정의한 ExitLoop1로 만들기만 함.

  • 그러면 위에서 이 값을 관찰해 1이 됐으니 루프를 돌기만 하고 그 안에서 하던 계산은 더이상 수행하지 않음.

그렇게 전체 루프 20회를 돌았지만 계산은 다섯 번만 수행해 결과 5가 나옴.

루프를 빠져나가는 구문의 근본적인 형태를 알아본 적은 없지만 마음 속에서는 루프를 빠져나가는 구문은 일종의 Goto와 비슷한 점프 형태라고 생각해 왔습니다. 반복하다가 조건을 만족하면 반복이 끝나는 지점 바로 다음으로 이동해 실행을 계속하는 거니까요. 그런데 이렇게 만들어 놓고 보니 비슷한 역할을 하지만 루프를 빠져나가는 구문은 점프가 아니라 조건으로도 나타낼 수 있었습니다. 더 투박하게 기억하자면 루프를 빠져나가는 구문은 점프가 아니라 조건이라고도 할 수 있을 것 같습니다.

다만 점프라면 즉시 루프를 빠져나가 의미 없는 반복을 수행하지 않겠지만 이런 모양으로 만들면 반복 횟수가 늘어나면 수행시간이 더 길어지는 문제는 있습니다. 이건 애플 숏컷으로 뭘 만드는 한계라고 인식해야 할 것 같습니다.