munifico.github.io

munifico's anything page

Follow me on GitHub

값을 반환하는 서브루틴으로서의 함수

이전 예제의 printLeapYearStatus는 재사용하기 편리하도록 어떤 동작을 하나로 묶었고, 그 이상은 아무 것도 하지 않았으니 서브루틴이라는 용어를 잘 반영했다고 할 수 있습니다. 하지만 이렇게 단순한 함수를 사용하는 일은 별로 없을 테고, 복잡하고 추상적인 문제에 도전하게 되면 더 줄어들 겁니다. 한 단계 더 추상화해서 함수를 ‘값을 반환하는 서브루틴’으로 생각해 봅시다.

printLeatYearStatus 함수는 잘 동작하지만, 프로그램이 커지면 콘솔에 기록하는 것은 곧 쓸모없어집니다. 이제 HTML에 결과를 출력하거나, 파일에 저장하거나, 다른 계산에 사용해야 할 수도 있는데 지금 가진 서브루틴은 그렇게 활용할 수 없습니다. 하지만 지금이 윤년인지 아닌지 알아야 할 때마다 그에 맞게 알고리즘을 고칠 수도 없습니다.

다행히 함수가 값을 반환하는 서브루틴이 되도록 고쳐쓰기는 쉽습니다.

function isCurrentYearLeapYear() {
    const year = new Date().getFullYear();

    if(year % 4 !== 0) return false;
    else if(year % 100 !== 0) return true;
    else if(year % 400 !== 0) return false;
    else return true;
}

이제 새로 만든 함수의 반환값을 활용하는 예제를 생각해 봅시다.

const daysInMonth = [31, isCurrentYearLeapYear() ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

if(isCurrentYearLeapYear()) console.log('It is a leap year');

더 진행하기 전에 이 함수의 이름에 대해 생각해 봅시다. boolean을 반환하거나, boolean이 필요한 컨텍스트에서 사용하도록 만든 함수는 is로 시작하는 이름을 붙이는게 일반적입니다. 함수 이름에는 current도 들어있습니다. 이건 왜일까요? 이 함수는 항상 현재 날짜를 기준으로 하기 때문입니다. 달리 말해, 이 함수는 2016년 12월 31일에 호출했을 때와 다음날인 2017년 1월 1일에 호출했을 때 결과가 다릅니다.


이전 : 서브루틴으로서의 함수
다음 : 함수로서의 함수
목차