LHJ

I'm a FE developer.

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

19 May 2020 » js_lj

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

function printLeapYearStatus() {
    const year = new Date().getFullYear();
    if (year % 4 !== 0) console.log(`${year} is NOT a leap year`)
    else if(year % 100 != 0) console.log(`${year} is a leap year`)
    else if (year % 400 != 0) console.log(`${year} is NOT a leap year`)
    else console.log(`${year} is a leap year`);
}

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

printLeapYearStatus 함수는 잘 동작하지만, 프로그램이 커지면 콘솔에 기록하는 것은 곧 쓸모없어집니다.
이제 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;
}

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

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');

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