Day 3함수

JS에서 함수는 값이다 — 변수에 담고, 인자로 넘기고, 리턴할 수 있다. 이 사실 하나가 이후 모든 것(콜백, Promise, 배열 메서드)의 기반이다.

1. 선언식 vs 화살표 함수

function add(a, b) {
  return a + b;
}

const add2 = (a, b) => a + b;              // 표현식 하나면 중괄호/return 생략 가능
const square = (n) => n * n;
const greet = () => console.log("hi");      // 인자 없어도 괄호는 필요

// 블록이 필요하면 화살표 함수도 중괄호+return
const classify = (temp) => {
  if (temp >= 80) return "위험";
  return temp >= 65 ? "경고" : "정상";
};
화살표 함수는 자기만의 this가 없다(바깥 스코프의 this를 그대로 씀). 객체 메서드로 쓸 땐 선언식/축약 메서드 문법을 쓰는 게 안전하다 — Day 12 클래스에서 다시 나온다.

2. 기본값과 rest 파라미터

function retry(fn, times = 3) {          // 기본값
  // ...
}

function sum(...nums) {                    // rest — 나머지를 배열로 모음
  return nums.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3)     // 6
sum()             // 0

3. 콜백과 고차함수

함수를 다른 함수의 인자로 넘기는 패턴. Rust의 클로저를 함수 인자로 넘기는 것과 개념은 똑같다.

function withRetry(fn, times) {
  for (let i = 0; i < times; i++) {
    try {
      return fn();          // 성공하면 바로 리턴
    } catch (e) {
      if (i === times - 1) throw e;   // 마지막 시도까지 실패하면 에러 전파
    }
  }
}

withRetry(() => JSON.parse(rawInput), 3);

4. 클로저 한 줄 요약

function makeCounter() {
  let count = 0;                 // 이 변수는 바깥에서 직접 접근 불가
  return () => ++count;          // 리턴된 함수가 count를 "기억"함
}
const counter = makeCounter();
counter()   // 1
counter()   // 2

🎯 실습 과제 — _submissions/day03.js

과제 1. 가동시간 포맷터

function formatUptime(seconds) {
  // TODO: 초 단위를 "N일 N시간" 형태 문자열로 변환
  // 1일 미만이면 "N시간"만, 1시간 미만이면 "N분"만 표시
}
// formatUptime(276543) → "3일 4시간"
// formatUptime(7200)     → "2시간"
// formatUptime(180)       → "3분"

과제 2. clamp

function clamp(n, min, max) {
  // TODO: n이 min~max 범위를 벗어나면 경계값으로 잘라서 리턴
}
// clamp(120, 0, 100) → 100
// clamp(-5, 0, 100)  → 0
// clamp(50, 0, 100)  → 50

과제 3. 재시도 유틸
Day 3의 예제를 참고해 retry(fn, times = 3)을 직접 구현한다 (기본값 파라미터 사용). fn이 계속 실패하면 마지막 에러를 던져야 한다.

과제 4 (도전). 카운터 팩토리
makeCounter(start = 0)를 작성한다. 호출할 때마다 { next, reset } 객체를 리턴하는데, next()는 호출할 때마다 1씩 증가한 값을, reset()start 값으로 되돌리는 함수여야 한다. (클로저 응용)

✅ 다 작성했으면:
cd ~/Documents/javascript-2주완성
bun _grade.ts day03