[Javascript] 함수 이것 저것

winter100·2024년 1월 10일

자바스크립트

목록 보기
11/15

1. 순수 함수와 비 순수 함수

1.1 순수 함수란?

  • Pure function
  • 동일한 입력에 대해 항상 동일한 출력을 제공하는 함수
  • 외부의 상태를 변경하지 않는 함수
  • 함수의 출력이 오로지 입력에 의해서만 결정되는 함수
  • 외부 상태에 영향을 받지 않는 함수
  • 부수 효과(Side effect)가 없는 함수
function add(a, b) {
  return a + b;
}
'순수함수는 위 함수처럼 입력이 같다면 항상 같은 값을 출력해주는 함수이다'
'외부의 어떤 값에도 영향을 미치지 않는다.'

1.2 비 순수 함수란?

  • Impure functions
  • 외부 상태에 의존하거나, 외부 상태를 변경하는 함수
  • 외부 환경이나 상태에 영향을 받을 수 있는 함수
  • 부수 효과(Side effect)가 있을 수 있는 함수
let num = 1;
function increase() {
  num += 1;
}

'함수 내부의 코드가 외부 변수의 num의 값에 영향을 미치고있다.'
  • 함수형 프로그래밍에서 두 개념 모두 중요한 역할을 한다.
  • 이론상 순수 함수를 사용해 부수 효과를 최소화하여 프로그램의 복잡성을 줄이는 것을 목표로 한다.

2. 팩토리 함수

2.1 팩토리 함수란?

  • 객체를 반환하는 함수
  • 캡슐화와 정보 은닉을 달성하기 좋은 함수
  • 생성자 함수나 클래스를 사용하는 것 보다 더 유연한 방식으로 객체를 생성할 수 있다.
1. 예제
function createTaxCalculator(tax)
	function calculateTax(amount){
      return amount * tax;
    }
return calculateTax;
}

const calculateVatAmount = createTaxCalculator(0.19);
const calculateIncomeTaxAmount = createTaxCalculator(0.25);

console.log(calculateVatAmount(100));
console.log(calculateIncomeTaxAmount(200));

'createTaxCalculator 함수내에서 객체(함수)를 반환 하고 있다.'

2. 예제
function createPerson(name, age) {
    return {
        name: name,
        age: age,
        sayHello: function() {
            console.log("안녕하세요, 제 이름은 " + this.name + "이고, 나이는 " + this.age + "살입니다.");
        }
    };
}

const person1 = createPerson("홍길동", 20);
person1.sayHello(); // "안녕하세요, 제 이름은 홍길동이고, 나이는 20살입니다." 출력

3. 클로저

3.1 클로저란?

  • 공부더필요.

4. 재귀 함수

4.1 재귀 함수란?

  • 자기 자신을 호출하는 함수
  • 일련의 반복적인 작업을 수행하는데 유용함
  • 재귀 함수를 이용할때 잘못하면 무한 루프에 빠질수도 있음
  • 무한 루프에 빠지지 않게 호출이 끝나는 부분을 설정해 줘야함
1. ex) 어떤 수의 거듭제곱을 구해주는 함수
'일반적인 for문을 이용했을때'
function powerOf(x, n){
  let result = 1;
  for(let i=0; i<n; i++){
    result *= x;
  }
  return result;
}

console.log(powerOf(2,3)); // 8 (2x2x2)
----------------------------------------------------
2. 재귀 함수를 이용한 거듭제곱을 구해주는 함수
function powerOf(x, n){
  
  if(n===1){ // 호출이 끝날수 있게 조건을 걸었음
    return x
  }
  
  return x * powerOf(x, n-1);
}

console.log(powerOf(2,3)); // 8

----------------------------------------------------
'2번 함수를 조금더 줄인 코드 삼항연산자 이용'
function powerOf(x, n){
  return x === 1 ? x : x * powerOf(x, n-1);
}

console.log(powerOf(2,3)); // 8
  • 자신의 함수에 또 다시 자신의 함수를 쌓아 계산하는 느낌이다.

4.2 조금 더 복잡한 재귀함수?

  • 재귀 함수는 for문 보다 조금 더 복잡한 작업을 할때 유용하다.
const Person = {
  name : "홍길동",
  friends : [
    {name: "김짱구",
     friends : [
       {name:"이커피",
       friends:[
         {name:"김민수"},
       ]},
       {name:"김박사"},
     ]
    },
    {name:"물"}
  ]
}

function getFriends(person){
  let friendsList = [];
  if(!person){
    return [];
  }
  for(const friend of (person.friends || [])){
    friendsList.push(friend.name);
    if(friend.friends){
      friendsList.push(...getFriends(friend));
    }
  }
  return friendsList;
}

console.log(getFriends(Person)); // ['김짱구', '이커피', '김민수', '김박사', '물']

0개의 댓글