함수


장바구니에 담긴 상품의 가격을 계산한다고 해봅시다. 숫자를 받아서 세금을 더하고, 반올림하고, 통화 기호를 붙여 형식을 맞춥니다. 그런데 다음 상품에서도 똑같은 과정을 반복해야 하고, 그다음 상품에서도 마찬가지입니다. 이 네 단계를 곳곳에 복사해두면 버그가 생기기 딱 좋습니다. 반올림 방식을 한 곳에서 고쳐도 다른 세 군데는 여전히 잘못된 채로 남기 때문입니다. 함수를 쓰면 이런 일련의 단계에 이름을 붙여 한 번만 정의해두고, 필요할 때마다 실행할 수 있습니다. 이번 장에서는 이런 코드 블록을 작성하고, 입력값을 전달하고, 결과값을 돌려받는 방법을 다룹니다.
함수 선언과 호출
**함수**란 원할 때마다 실행할 수 있도록 이름을 붙인 코드 블록입니다. 단계들을 한 번만 작성해서 이름을 붙여두면, 그 이름으로 원하는 만큼 여러 번 실행할 수 있습니다.
function 키워드로 함수를 만듭니다:
function greet() {
console.log("Hi there");
}이것이 함수 정의의 전부이지만, 아직 아무 일도 일어나지 않았습니다. 함수를 작성하는 것은 단계를 저장해두는 것일 뿐, 실행하는 것이 아닙니다. 실제로 실행하려면 함수 이름 뒤에 괄호를 붙여서 호출해야 합니다:
greet(); // Hi there
greet(); // Hi there두 줄에서 인사가 두 번 나온 것은 하나의 코드 블록에서 나온 결과입니다. 정의하는 것과 호출하는 것은 별개의 일이며, 이 둘을 헷갈리는 것이 처음에 가장 많이 겪는 실수입니다.
함수가 하는 일을 잘 드러내는 동사 형태의 이름(greet, logDivider)을 붙이세요. 변수 이름을 지을 때 기울였던 것과 같은 정성이 필요합니다. 열 군데에서 호출하는 함수라도 이름이 명확하지 않으면 읽기 좋은 코드가 될 수 없습니다.
greet()처럼 괄호를 붙여 이름으로 호출해야 합니다. 처음엔 이 구분이 헷갈렸는데, 정의는 레시피이고 호출은 실제로 요리를 하는 것이라고 생각하면 됩니다. 같은 함수를 원하는 만큼 여러 번 호출할 수 있습니다. 매개변수와 반환값
함수는 무언가를 전달받을 수 있을 때 훨씬 쓸모가 커집니다. 이렇게 전달하는 값을 **매개변수(parameters)**라고 부릅니다. 괄호 안에 나열된 이름으로, 호출할 때 전달하는 값을 대신 나타냅니다.
function greet(name) {
console.log("Hi " + name);
}
greet("민준"); // Hi 민준
greet("서연"); // Hi 서연name이 매개변수입니다. greet("민준")을 호출하면 그 실행 동안 name에 "민준"이라는 텍스트가 들어갑니다. 함수는 하나지만, 전달하는 값에 따라 결과가 달라집니다.
지금까지 본 함수들은 무언가를 출력할 뿐입니다. 하지만 나중에 사용할 수 있도록 함수가 값을 돌려주었으면 할 때가 많습니다. 이때 쓰는 것이 return입니다:
function double(number) {
return number * 2;
}
const result = double(5);
console.log(result); // 10return은 함수 밖으로 값을 내보냅니다. double(5)는 10이 되고, 이 값을 저장하거나 출력하거나 다른 곳으로 넘길 수 있습니다. 출력은 값을 화면에 보여주는 것이고, 반환은 그 값을 코드에서 계속 사용할 수 있도록 돌려주는 것입니다.
return은 값을 돌려주어 나중에 코드에서 쓸 수 있게 해줍니다. console.log로 출력하는 것은 화면에 값을 보여주는 것이고, 반환은 값을 실제로 돌려주는 것입니다. 저도 이 차이를 체감하는 데 시간이 좀 걸렸습니다. 화살표 함수
함수를 더 짧게 쓰는 방법이 있는데, 이를 **화살표 함수(arrow function)**라고 부릅니다. 변수에 저장하고, function 키워드 대신 => 화살표를 사용합니다:
const add = (a, b) => {
return a + b;
};
console.log(add(2, 3)); // 5이렇게 함수 본문이 하나의 표현식으로만 이루어져 있다면, 중괄호와 return을 생략해도 화살표가 알아서 값을 돌려줍니다:
const add = (a, b) => a + b;
console.log(add(2, 3)); // 5둘 다 같은 동작을 합니다. 최신 JavaScript 코드에서는 화살표 함수를 어디서든 볼 수 있으므로, 그 형태를 알아보는 것이 도움이 됩니다. 이름, =, 입력값, 화살표, 그리고 본문 순서로 이루어져 있습니다.
function 키워드 대신 =>를 써서 변수에 저장하는, 함수를 더 짧게 쓰는 방법입니다. 본문이 하나의 표현식이라면 중괄호와 return을 생략할 수 있고, 화살표가 알아서 값을 돌려줍니다. 이 형태는 정말 자주 보게 되므로, 익숙해지면 빠르게 도움이 됩니다. 함수, 그다음은
함수는 같은 일을 반복하지 않게 해주는 도구입니다. 일련의 단계에 이름을 붙이고, 입력값을 전달하고, 결과값을 돌려받습니다. 이 개념이 이해되고 나면, 여러분이 작성하는 코드 대부분이 각자 명확한 하나의 역할을 맡은 작은 함수들이 서로를 호출하는 형태가 됩니다.
여기서부터 함수는 어디서든 등장합니다. 배열 메서드에 함수를 전달해 데이터 목록을 변형하게 될 것이고, 조건문의 분기 로직을 정리하는 데 함수를 활용하게 될 것이며, 변수에서 익힌 이름 짓기 원칙도 계속 이어가게 될 것입니다. 다음에 코드 블록을 복사하고 있는 자신을 발견한다면, 그것이 바로 함수로 감싸야 할 신호입니다.

