1. 함수의 정의와 역할
- 정의 : 함수는 하나의 이름 아래 여러 명령어를 그룹화한 코드 블록이다.
- 역할
- 코드 재사용 : 반복되는 코드를 함수로 만들어 필요할 때 호출해서 사용.
- 모듈화 : 프로그램을 작은 단위로 나눠 이해하기 쉽고 유지보수가 편리해짐
- 가독성 향상 : 코드의 가독성을 높여 헙업이 수월해짐
- 기본구조
function 함수이름(매개변수1, 매개변수2) {
// 실행할 코드
return 결과값; // 반환값 (필수는 아님)
}
- 함수의 원리 : 함수 선언 > 함수 호출 /
- 매개변수는 함수가 입력값을 받도록 도와준다.
- 반환값은 함수가 실행 결과를 반환할 수 있도록 해준다.
2. 함수 선언 방법
1) 기본 함수 선언 (Function Declaration)
function sayHello (){
console.log("Hello World!");
};
sayHello(); //"Hello World!" 출력
2) 함수 표현식 (Function Expression)
함수를 변수에 저장해서 사용할 수 있다.
const sayHello = function(){
console.log("hello, Werld");
};
sayhello(); //"hello, Werld" 출력
3) 화살표 함수 (Arrow Function)
ES6(ECMAScript 2015)에서 도입된 함수 표현식의 새로운 문법으로 깔끔하고 간결한 문법 덕분에
함수 표현식을 더 간결하게 작성할 수 있다.
const sayHello = () => console.log("Hello, World");
sayHello();
3. 매개변수와 인수
- 매개변수 (Parameter) : 함수 정의할 때 사용되는 변수
- 인수 (Argument) : 함수 호출할 때 전달되는 값
function add(a, b) { // a와 b는 매개변수
return a + b;
}
console.log(add(2, 3)); // 2와 3은 인수, 결과: 5
매개 변수에는 인수가 전달되지 않았을 때 기본값을 설정할 수 있다.
function greet(name = "친구") {
console.log(`안녕하세요, ${name}!`);
}
greet(); // "안녕하세요, 친구!" 출력
greet("코마"); // "안녕하세요, 코마!" 출력
4. 함수의 반환값(Return Value)
- return 키워드를 사용해서 함수가 값을 반환할 수 있다.
- 함수는 하나의 값만 반환할 수 있지만, 객체나 배열을 사용하면 여러 값을 묶어 반환할 수 있다.
1) 하나의 값만 반환하는 경우
function multiply(a, b) {
return a * b;
}
console.log(multiply(3, 4)); // 12
2) 객체를 반환하는 함수
// 사용자 정보를 반환하는 함수
const createUser = (name, age) => { // 화살표 함수를 이용한 createUser라는 함수 선언
return { // retrun 값으로 객체를 작성
name: name,
age: age,
greet: function () { // greet라는 메소드 작성
console.log(`안녕하세요, ${this.name}입니다!`);
},
};
};
const user = createUser("코마", 25);
console.log(user.name); // 코마
console.log(user.age); // 25
user.greet(); // 안녕하세요, 코마입니다!
> 간결한 객체 반환 (프로퍼티 이름과 값이 같으면 축약 가능)
const createUserShort = (name, age) => ({ name, age });
// 키와 값의 내용이 같아서 축약함
// name : name, age : age
const userShort = createUserShort("코메", 30); // 함수에 매개변수 넣은 값을 userShort라는 변수로 선언
console.log(userShort); // { name: '코메', age: 30 }
3) 배열을 반환하는 함수
// 두 수의 합과 곱을 배열로 반환하는 함수
const calculate = (a, b) => {
const sum = a + b;
const product = a * b;
return [sum, product]; // 배열 반환
};
const result = calculate(3, 4);
console.log(result); // [7, 12]
console.log(`합: ${result[0]}, 곱: ${result[1]}`); // 합: 7, 곱: 12
//sum, product의 값이 각각 배열로 들어가서 [0] [1] 로 표현 되었다
4) 구조 분해 할당(Destructuring)과 함께 사용하기
객체나 배열을 반환하는 함수는 구조 분해 할당을 사용하면 더 깔끔하게 값을 꺼낼 수 있다.
const createPet = (name, type) => ({ name, type });
// 간결한 객체 반환을 해줬다
const { name, type } = createPet("바둑이", "강아지");
// createPet라는 함수를 호출하는 값을 가진 반환문을 상수로 선언했다.
console.log(name); // 바둑이
console.log(type); // 강아지
// 매개변수를 선언해주고 연산을 반환값으로 설정했다.
const calculateNumbers = (x, y) => [x + y, x * y];
/*
calculateNumbers(5, 6)을 호출하여 배열 [11, 30]을 반환받는다.
배열 구조 분해 할당(array destructuring)을 사용하여,
반환된 배열의 첫 번째 값은 sum에, 두 번째 값은 product에 할당된다.
결과적으로 sum = 11과 product = 30이 된다
*/
const [sum, product] = calculateNumbers(5, 6);
// 객체값으로 선언된 변수를 출력 요청했다
console.log(`합: ${sum}, 곱: ${product}`); // 합: 11, 곱: 30
5. 콜백 함수 (Callback Function)
함수의 인수로 다른 함수를 전달할 수 있다.
function greetUser(name, callback) {
console.log(`안녕하세요, ${name}!`);
callback();
}
/*
callback을 매개변수에 넣고 함수 마지막에 callback();를 넣으면서
다른 함수를 호출한다.
메서드처럼 동작하는 것처럼 보이지만
객체에 속한 함수인 메서드와 달리 다른 함수의 인자로 전달되어 나중에 호출되는 함수이다.
*/
function endMessage() {
console.log("환영합니다!");
}
greetUser("코마", endMessage);
// 출력:
// "안녕하세요, 코마!"
// "환영합니다!"
6. 함수 스코프 (Scope)
- 전역 스코프: 함수 밖에서 선언된 변수 → 어디서든 접근 가능.
- 지역 스코프: 함수 안에서 선언된 변수 → 해당 함수 내에서만 접근 가능.
let globalVar = "전역 변수";
function showScope() {
let localVar = "지역 변수";
console.log(globalVar); // "전역 변수"
console.log(localVar); // "지역 변수"
}
showScope();
console.log(localVar); // 오류! (localVar는 함수 외부에서 접근 불가)
7. 재귀 함수 (Recursive Function)
- 함수가 자기 자신을 호출하는 함수이다
- 주로 반복 작업이나 알고리즘 구현에 사용된다.
- 기저 조건(종료 조건)이 없으면 재귀함수는 계속 호출되면서 무한 루프에 빠질 수 있다.
function factorial(n) {
if (n === 1) return 1; // 종료 조건
return n * factorial(n - 1); // 자기 자신 호출
}
console.log(factorial(5)); // 120 (5 * 4 * 3 * 2 * 1)
- 실행 순서
- factorial(5) → 5 * factorial(4)
- factorial(4) → 4 * factorial(3)
- factorial(3) → 3 * factorial(2)
- factorial(2) → 2 * factorial(1)
- factorial(1) → 종료 조건으로 1을 반환.
이후 계산을 끝내면서 결과가 반환된다.
- factorial(1)이 1을 반환 -> factorial(2)는 2 * 1 = 2를 반환
- factorial(3)은 3 * 2 = 6을 반환
- factorial(4)는 4 * 6 = 24를 반환
- factorial(5)는 5 * 24 = 120을 반환
8. 클로저 (Closure)
함수가 외부 함수의 변수를 기억하고 접근할 수 있는 매커니즘이다
function outerFunction(outerVar) {
return function innerFunction(innerVar) {
console.log(`외부 변수: ${outerVar}, 내부 변수: ${innerVar}`);
};
}
// 아래 코드에서 outerFunction("코메") 가 호출 되어 outerVar의 매개변수에 코메라는 값을 넘겨준다.
const closureExample = outerFunction("코메");
//outerFunction은 내부에서 innerFunction을 반환하는 함수다.
//그래서 outerFunction이 호출이 되면 innerFunction함수를 반환하고 그 반환값을 closureExample에 할당한다.
/*
아래 코드에서 closureExample은 innerFunction을 참조하는 변수라서,
closureExample는 사실 innerFunction("코마")와 같다.
*/
closureExample("코마");
/*
그래서 outerVar는 outerFunction에서 받은 값 "코메"
innerVar는 innerFunction 전달된 "코마" 이다.
*/
// 출력: 외부 변수: 코메, 내부 변수: 코마
핵심 내용
- innerFunction은 outerFunction 내부에서 정의되었기 때문에, innerFunction은 outerFunction의 매개변수인 outerVar에 접근할 수 있다.
- innerFunction을 closureExample에 할당함으로써, outerVar는 더 이상 외부에 존재하지 않지만, closureExample을 통해 여전히 접근할 수 있다.
- 이처럼 클로저는 함수가 자신이 선언된 환경의 변수에 계속 접근할 수 있게 해주는 기능이다.
'코딩이론 > Javascript' 카테고리의 다른 글
| chapter.12 인수(Argument) 와 반환 (retrun) (0) | 2024.12.03 |
|---|---|
| chapter.10 화살표 함수(Arrow Function) (0) | 2024.12.03 |
| chapter.08 While 반복문 (1) | 2024.11.28 |
| chapter.07 for 반복문 (1) | 2024.11.27 |
| chapter.06 조건문 (2) | 2024.11.26 |