LHJ

I'm a FE developer.

13.1 서브루틴으로서의 함수

19 May 2020 » js_lj

13.1 서브루틴으로서의 함수

서브루틴(subroutine)은 아주 오래 된 개념이며 복잡한 코드를 간단하게 만드는 기초적인 수단입니다.
서브루틴이 없었다면 프로그래밍은 아주 지루한 반복의 연속이었을 겁니다.
서브루틴은 반복되는 작업의 일부를 떼어내서 이름을 붙이고, 언제든 그 이름을 부르기만 하면 실행합니다.

NOTE_
서브루틴은 프로시저(procedure), 루틴(routine), 서브프로그램(subprogram), 매크로(macro) 등 다양한 이름으로 불립니다.
이들은 모두 매우 단순하고 범용적인, 호출할 수 있는 한 단위를 일컫는 말입니다.
물론 자바스크립트에서는 서브루틴이라는 용어를 쓰지 않습니다.
함수는 함수(또는 메서드)라고 부를 뿐이죠.
여기서 서브루틴이라는 용어를 쓰는 이유는 함수의 가장 간단한 사용 형태를 강조하기 위해서입니다.

서브루틴은 대개 어떤 알고리즘을 나타내는 형태입니다.
알고리즘이란, 주어진 작업을 수행하는 방법이죠.
오늘이 윤년(leap year)인지 아닌지 판단하는 알고리즘을 봅시다.

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

프로그램 안에서 이 코드를 10번, 100번 실행해야 한다고 생각해 봅시다.
그런데 콘솔이 기록하는 메시지를 바꿔야 한다면?
이 코드를 쓰는 부분을 일일이 찾아다니며 바꿔야 합니다!
서브 루틴은 바로 그런 문제를 해결합니다.
자바스크립트에서는 함수가 해결합니다.

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에 대해 생각해 봅시다.
getLeapYearStatus나, 간결한 leapYearStatus, 또는 더 간단한 leapYear 같은 이름을 쓰지 않은 이유는 무엇일까요?
그런 이름은 더 짧기는 하지만, 중요한 사실을 놓칩니다.
이 함수가 오늘이 윤년인지를 콘솔에 기록(print)하는 함수라는 사실 말입니다.

함수의 이름을 정하는 건 아주 중요한 일입니다.
함수의 이름은 자바스크립트를 위한 것이 아닙니다.
자바스크립트는 당신이 함수 이름에 한 글자를 쓰든 천 글자를 쓰든 신경 쓰지 않습니다.
함수의 이름은 다른 사람, 또는 나중에 이 코드를 다시 볼 당신을 위해 정하는 겁니다.
함수의 이름을 정할 때는 다른 사람이 함수 이름만 봐도 함수에 대해 이해할 수 있도록 주의 깊게 생각하십시오.

이상적인 경우는 함수가 하는 일을 이름만으로 완벽하게 나타내는 것이겠지만, 그렇게 하면 지나치게 번거로울 수 있습니다.
예를 들어 오늘이 윤년인지를 계산해서 콘솔에 기록한다 같은 이름을 쓴다면(즉, calculateCurrentLeapYearStatusAndPrintToConsole 등으로 쓴다면) 더 많은 정보를 얻을 수 있겠지만, 너무 길어서 의미가 없습니다.