7강

함수 기초

4 조회 1

함수 선언식과 표현식의 차이, 매개변수 기본값·rest 파라미터·arguments 객체를 이해한다. 순수 함수 개념과 함수를 일급 객체로 다루는 방법을 배운다.

함수 — 재사용 가능한 코드 블록

함수는 특정 작업을 수행하는 코드를 묶어 이름을 붙인 것입니다. 자바스크립트에서 함수는 일급 객체(First-class Object)입니다. 변수에 담고, 인수로 전달하고, 반환값으로 쓸 수 있습니다. 이 특성이 함수형 프로그래밍의 근간입니다.

함수 선언식 vs 함수 표현식

// 함수 선언식 (Function Declaration)
function add(a, b) {
  return a + b;
}

// 함수 표현식 (Function Expression)
const multiply = function(a, b) {
  return a * b;
};

// 핵심 차이: 호이스팅
console.log(add(2, 3));      // 5 — 선언 전 호출 가능 (호이스팅)
console.log(multiply(2, 3)); // 에러 — 표현식은 호이스팅 안 됨

// 이름 있는 함수 표현식 (재귀에 유용)
const factorial = function fact(n) {
  return n <= 1 ? 1 : n * fact(n - 1);
};

매개변수(Parameter)와 인수(Argument)

function greet(name, greeting) { // name, greeting이 매개변수
  return `${greeting}, ${name}!`;
}
greet("Kim", "안녕하세요"); // "Kim", "안녕하세요"가 인수

// 인수 부족 → undefined
greet("Kim"); // "undefined, Kim!" → greeting이 undefined

// 인수 초과 → 무시됨 (arguments 객체로는 접근 가능)
greet("Kim", "Hello", "extra"); // "extra" 무시

매개변수 기본값 (Default Parameter)

// ES6 이전 방식
function greet(name, greeting) {
  greeting = greeting || "안녕하세요"; // || 방식 (0, "" 문제)
  return `${greeting}, ${name}!`;
}

// ES6 기본값
function greet(name, greeting = "안녕하세요") {
  return `${greeting}, ${name}!`;
}
greet("Kim");            // "안녕하세요, Kim!"
greet("Kim", "Hello");   // "Hello, Kim!"
greet("Kim", undefined); // "안녕하세요, Kim!" (undefined도 기본값 사용)
greet("Kim", null);      // "null, Kim!" (null은 기본값 무시!)

// 기본값으로 함수 호출도 가능
function createId(prefix = generatePrefix()) { ... }

rest 파라미터 — 가변 인수

// 나머지 인수를 배열로 수집
function sum(...numbers) {
  return numbers.reduce((acc, n) => acc + n, 0);
}
sum(1, 2, 3);        // 6
sum(1, 2, 3, 4, 5);  // 15

// 일반 파라미터와 함께 사용 (rest는 반드시 마지막)
function log(level, ...messages) {
  console.log(`[${level}]`, ...messages);
}
log("INFO", "서버 시작", "포트:", 3000);
// [INFO] 서버 시작 포트: 3000

// arguments 객체 (구식 방법, 화살표 함수에서 사용 불가)
function oldStyle() {
  console.log(arguments); // Arguments [1, 2, 3, ...]
  // 배열이 아님! Array.from(arguments)로 변환 필요
}

반환값(Return)

// return 없으면 undefined 반환
function noReturn() {
  const x = 1 + 1;
}
console.log(noReturn()); // undefined

// 여러 값 반환 — 배열 또는 객체 활용
function getMinMax(arr) {
  return {
    min: Math.min(...arr),
    max: Math.max(...arr)
  };
}
const { min, max } = getMinMax([3, 1, 4, 1, 5, 9]);
console.log(min, max); // 1, 9

// 조기 반환
function divide(a, b) {
  if (b === 0) return null; // 조기 반환으로 방어
  return a / b;
}

순수 함수 (Pure Function)

같은 입력에 항상 같은 출력을 내고, 외부 상태를 바꾸지 않는 함수입니다. 테스트하기 쉽고 예측 가능합니다.

// 순수 함수 ✅
function add(a, b) {
  return a + b; // 외부 상태 변경 없음, 동일 입력 → 동일 출력
}

// 순수 함수가 아님 ❌ — 외부 상태에 의존
let count = 0;
function increment() {
  count++; // 외부 변수 변경 (Side Effect)
  return count;
}

// 순수 함수가 아님 ❌ — 랜덤/날짜 등 외부 요소
function getTimestamp() {
  return Date.now(); // 같은 입력이지만 출력이 달라짐
}

함수를 값으로 — 일급 객체

// 변수에 저장
const sayHello = function() { return "Hello!"; };

// 다른 함수에 인수로 전달 (콜백)
function runTwice(fn) {
  fn();
  fn();
}
runTwice(() => console.log("실행!")); // "실행!" 두 번

// 함수에서 함수 반환
function multiplier(factor) {
  return function(number) {
    return number * factor;
  };
}
const double = multiplier(2);
const triple = multiplier(3);
double(5);  // 10
triple(5);  // 15

// 배열에 함수 저장
const operations = [
  (x) => x + 1,
  (x) => x * 2,
  (x) => x ** 2,
];
operations.forEach(fn => console.log(fn(3))); // 4, 6, 9

함수 설계 원칙

// 1. 한 가지 일만 하기 (Single Responsibility)
// 나쁨: 여러 일을 한 함수에
function validateAndSaveAndNotify(user) { ... }

// 좋음: 각각 분리
function validateUser(user) { ... }
function saveUser(user) { ... }
function notifyUser(userId) { ... }

// 2. 10~20줄 이내로 유지
// 함수가 길어지면 분리를 고려

// 3. 함수명은 동사로 시작
// getUser, calculateTotal, validateEmail, handleClick

관련 검색어  ·  자바스크립트 함수, 함수 선언식 표현식 차이, rest 파라미터, 매개변수 기본값, 순수 함수란, 일급 객체

채용정보
공지사항
인사이트
MY