JS
[JS] 함수 기본 개념
coco030030
2025. 4. 4. 17:51
자바스크립트 함수 완벽 개념 정리
1. 함수의 기본 개념
함수의 정의: 특정 작업을 수행하기 위해 설계된 코드 블록으로, 호출될 때만 실행됩니다.
// 기본 함수 구조
function 함수이름(매개변수1, 매개변수2) {
// 실행할 코드
return 결과값; // 선택사항
}
함수 범위: 중괄호 {}
안에 작성된 모든 코드가 함수의 본문입니다. 함수는 이 중괄호가 끝나는 곳에서 종료됩니다.
2. 매개변수와 인자값
매개변수(Parameter): 함수 정의에서 사용되는 변수
인자값(Argument): 함수 호출 시 전달하는 실제 값
// name은 매개변수
function 인사(name) {
console.log(`안녕하세요, ${name}님!`);
}
// "홍길동"은 인자값
인사("홍길동");
매개변수 규칙:
- 매개변수 이름은 변수 이름 규칙을 따름
- 쉼표로 구분하여 여러 개 정의 가능
- 기본값 설정 가능:
function 함수(이름 = "무명")
3. 함수 정의 방법들
3.1 함수 선언문 (Function Declaration)
function 더하기(a, b) {
return a + b;
}
특징:
- 호이스팅(Hoisting)됨: 코드에서 함수 선언 전에도 호출 가능
- 가장 기본적인 함수 정의 방법
3.2 함수 표현식 (Function Expression)
const 빼기 = function(a, b) {
return a - b;
};
특징:
- 변수에 함수를 할당
- 호이스팅되지 않음 (선언 전에 호출 불가)
- 익명 함수(무명 함수)로 주로 사용
3.3 화살표 함수 (Arrow Function)
const 곱하기 = (a, b) => a * b;
// 본문이 여러 줄인 경우
const 나누기 = (a, b) => {
if (b === 0) return "0으로 나눌 수 없습니다";
return a / b;
};
특징:
- 더 간결한 문법
this
바인딩 방식이 일반 함수와 다름- 한 줄 코드는
return
생략 가능 - 매개변수가 하나면 괄호 생략 가능:
x => x * 2
3.4 즉시 실행 함수 (IIFE: Immediately Invoked Function Expression)
(function() {
console.log("즉시 실행됨");
})();
// 매개변수를 전달할 수도 있음
(function(이름) {
console.log(`안녕, ${이름}!`);
})("홍길동");
특징:
- 정의되자마자 즉시 실행됨
- 전역 스코프를 오염시키지 않는 독립적인 환경 제공
- 라이브러리 제작이나 초기화 코드에 자주 사용
4. 가변 인자 함수 (유연한 인자 수용하기)
4.1 arguments 객체 사용 (전통적 방법)
function 합계() {
let 총합 = 0;
for (let i = 0; i < arguments.length; i++) {
총합 += arguments[i];
}
return 총합;
}
합계(1, 2, 3, 4, 5); // 15
특징:
- 모든 함수 내부에 자동으로 생성되는 유사 배열 객체
- 화살표 함수에서는 사용 불가
4.2 나머지 매개변수(Rest Parameters) 사용 (현대적 방법)
function 합계(...숫자들) {
return 숫자들.reduce((총합, 현재값) => 총합 + 현재값, 0);
}
합계(1, 2, 3, 4, 5); // 15
특징:
...
구문을 사용하여 여러 인자를 배열로 수집- 실제 배열이므로 배열 메서드 사용 가능
- 마지막 매개변수로만 사용 가능:
function 함수(a, b, ...나머지)
5. 배열과 객체 구분하기
5.1 배열 (Array)
// 배열 생성: 대괄호 [] 사용
let 과일들 = ["사과", "바나나", "오렌지"];
// 배열 접근
console.log(과일들[0]); // "사과"
5.2 객체 (Object)
// 객체 생성: 중괄호 {} 사용
let 사람 = {
이름: "김철수",
나이: 25,
직업: "개발자"
};
// 객체 속성 접근
console.log(사람.이름); // "김철수"
console.log(사람["나이"]); // 25
5.3 함수와 괄호 사용
// 함수 정의: function 키워드, () 매개변수, {} 함수 본문
function 계산(a, b) {
return {
합: a + b, // 객체는 {}
차: a - b,
곱: a * b,
몫: a / b
};
}
// 함수 호출: 함수이름()
let 결과 = 계산(10, 2);
6. 함수의 반환값 (return)
// return 있는 함수
function 제곱(숫자) {
return 숫자 * 숫자;
}
// return 없는 함수
function 인사(이름) {
console.log(`안녕하세요, ${이름}님!`);
// 암묵적으로 undefined 반환
}
// 조건에 따른 반환
function 절대값(숫자) {
if (숫자 < 0) {
return -숫자;
}
return 숫자;
}
특징:
return
문은 함수 실행을 즉시 종료하고 값을 반환return
문이 없거나 값 없이return
만 있으면undefined
반환- 함수는 항상 무언가를 반환함
7. 콜백 함수 (Callback Functions)
콜백 함수는 다른 함수에 인자로 전달되어 나중에 호출되는 함수입니다.
// 콜백 함수 예시
function 작업수행(작업) {
console.log("작업 시작");
작업(); // 전달받은 함수 실행
console.log("작업 완료");
}
// 콜백 함수를 인자로 전달
작업수행(function() {
console.log("중요 작업 진행 중...");
});
실용적인 예제:
// 배열의 forEach 메소드는 콜백 함수를 인자로 받음
let 숫자들 = [1, 2, 3, 4, 5];
숫자들.forEach(function(숫자) {
console.log(숫자 * 2);
});
// 화살표 함수로 더 간결하게
숫자들.forEach(숫자 => console.log(숫자 * 2));
8. 자주 사용하는 내장 함수들
8.1 문자열 관련 내장 함수
let 문자열 = "Hello, World!";
문자열.length; // 13 (길이)
문자열.toUpperCase(); // "HELLO, WORLD!" (대문자로)
문자열.toLowerCase(); // "hello, world!" (소문자로)
문자열.indexOf("World"); // 7 (위치 찾기)
문자열.slice(0, 5); // "Hello" (부분 문자열)
문자열.split(", "); // ["Hello", "World!"] (분할)
8.2 배열 관련 내장 함수
let 배열 = [1, 2, 3, 4, 5];
배열.length; // 5 (길이)
배열.push(6); // [1, 2, 3, 4, 5, 6] (끝에 추가)
배열.pop(); // 마지막 요소 제거하고 반환
배열.unshift(0); // [0, 1, 2, 3, 4, 5] (앞에 추가)
배열.shift(); // 첫 요소 제거하고 반환
배열.join("-"); // "1-2-3-4-5" (문자열로 결합)
// 변환 메소드
배열.map(x => x * 2); // [2, 4, 6, 8, 10] (모든 요소 변환)
배열.filter(x => x > 2); // [3, 4, 5] (조건에 맞는 요소만 선택)
배열.reduce((합, 현재값) => 합 + 현재값, 0); // 15 (누적 계산)
8.3 기타 유용한 내장 함수
// 수학 관련
Math.random(); // 0~1 사이 랜덤 숫자
Math.floor(4.7); // 4 (내림)
Math.ceil(4.3); // 5 (올림)
Math.round(4.5); // 5 (반올림)
Math.max(1, 3, 5); // 5 (최대값)
Math.min(1, 3, 5); // 1 (최소값)
// 시간 관련
let 현재 = new Date();
현재.getFullYear(); // 현재 년도
현재.getMonth(); // 현재 월 (0-11)
현재.getDate(); // 현재 일
9. 함수 스코프와 클로저
9.1 스코프 (변수 유효 범위)
let 전역변수 = "전역";
function 외부함수() {
let 외부변수 = "외부";
function 내부함수() {
let 내부변수 = "내부";
console.log(내부변수); // "내부" (자기 스코프)
console.log(외부변수); // "외부" (부모 스코프)
console.log(전역변수); // "전역" (전역 스코프)
}
내부함수();
// console.log(내부변수); // 오류! 내부변수는 내부함수 안에서만 유효
}
9.2 클로저 (Closure)
클로저는 함수가 선언된 환경의 변수를 기억하는 것을 말합니다.
function 카운터만들기() {
let 횟수 = 0; // 외부에서 직접 접근 불가능한 변수
return function() {
횟수++; // 바깥 함수의 변수 사용
return 횟수;
};
}
const 카운터 = 카운터만들기();
console.log(카운터()); // 1
console.log(카운터()); // 2
console.log(카운터()); // 3
10. 실전 함수 예제
10.1 기본 함수
// 두 숫자의 합을 계산하는 함수
function 더하기(a, b) {
return a + b;
}
console.log(더하기(5, 3)); // 8
10.2 조건에 따른 처리
// 나이에 따라 다른 메시지를 반환하는 함수
function 나이확인(나이) {
if (나이 < 0) {
return "유효하지 않은 나이입니다";
} else if (나이 < 18) {
return "미성년자입니다";
} else if (나이 < 65) {
return "성인입니다";
} else {
return "노년층입니다";
}
}
console.log(나이확인(15)); // "미성년자입니다"
10.3 배열과 함수 활용
// 배열에서 가장 큰 수를 찾는 함수
function 최대값찾기(배열) {
if (배열.length === 0) return null;
let 최댓값 = 배열[0];
for (let i = 1; i < 배열.length; i++) {
if (배열[i] > 최댓값) {
최댓값 = 배열[i];
}
}
return 최댓값;
}
console.log(최대값찾기([3, 8, 2, 10, 5])); // 10