Dream๐Ÿฐng
article thumbnail

 

๊ณ ์ฐจ ํ•จ์ˆ˜


๊ณ ์ฐจ ํ•จ์ˆ˜๋ž€?

๊ณ ์ฐจ ํ•จ์ˆ˜๋Š”

1. ํ•จ์ˆ˜๋ฅผ arguments๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฑฐ๋‚˜
2. ํ•จ์ˆ˜๋ฅผ returnํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜
3. ๋˜๋Š” ์œ„ ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ์— ๋ชจ๋‘ ํ•ด๋‹นํ•˜๋Š”

ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

// ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ arguments๋กœ ๋ฐ›๋Š” ๊ฒฝ์šฐ

function double(num) {
  return num * 2;
}

function doubleNum(func, num) {
  return func(num);
}

let output = doubleNum(double, 4);
// return๊ฐ’์ด ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ

function adder(added) {
  return function (num) {
    return num + added;
  };
}

let output = adder(5)(3);
// ๋˜๋Š” ์œ„ ๋‘ ๊ฐ€์ง€์— ๋ชจ๋‘ ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ

function double(num) {
  return num * 2;
}

function doubleAdder(added, func) {
  const doubled = func(added);
  return function (num) {
    return num + doubled;
  };
}

doubleAdder(5, double)(3);

 

์ด ๋•Œ, ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜์–ด arguments๊ฐ€ ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ callback function์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํ•จ์ˆ˜๋ฅผ arguments๋กœ ๋ฐ›๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์™€ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ธฐ

 

โœ๏ธ ๊ณ ์ฐจ ํ•จ์ˆ˜์˜ ์ค‘์š”์„ฑ

๋ณต์žกํ•œ ์–ด๋–ค ๊ฒƒ์„ ์••์ถ•ํ•ด์„œ ํ•ต์‹ฌ๋งŒ ์ถ”์ถœํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ถ”์ƒํ™”๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ถ”์ƒํ™”๋Š” ๊ณง ์ƒ์‚ฐ์„ฑ์˜ ํ–ฅ์ƒ์œผ๋กœ ์ด์–ด์ง€์ง„๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ถ”์ƒํ™”๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ณ , ๊ณ ์ฐจ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ ์ถ”์ƒํ™”์˜ ์ˆ˜์ค€์„ ๋” ๋†’์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์‚ฐ์„ฑ์ด ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ๋œ๋‹ค.

 

function getAverageAgeOfMaleAtOnce(data) {
  const onlyMales = data.filter(function (d) {
    return d.gender === 'male';
  });

  const numOfMales = onlyMales.length;

  const onlyMaleAges = onlyMales.map(function (d) {
    return d.age;
  });

  const sumOfAges = onlyMaleAges.reduce(function (acc, cur) {
    return acc + cur;
  }, 0);

  return sumOfAges / numOfMales;
}

์œ„ ํ•จ์ˆ˜๋Š” data๋กœ ์ž…๋ ฅ๋œ ์ •๋ณด์˜ ๋‚จ์„ฑ์˜ ํ‰๊ท  ๋‚˜์ด๋ฅผ ๊ตฌํ•˜๋Š”๋ฐ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋งŒ์•ฝ ์œ„ ๊ณผ์ •์„ ๋ณ„๋„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ํ•จ์ˆ˜ ์ ์šฉ ์ˆœ์„œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด...?

 

function getOnlyMales(data) {
  return data.filter(function (d) {
    return d.gender === 'male';
  });
}

function getOnlyAges(data) {
  return data.map(function (d) {
    return d.age;
  });
}

function getAverage(data) {
  const sum = data.reduce(function (acc, cur) {
    return acc + cur;
  }, 0);
  return sum / data.length;
}

function compose(...funcArgs) {
  return function (data) {
    let result = data;
    for (let i = 0; i < funcArgs.length; i++) {
      result = funcArgs[i](result);
    }
    return result;
  };
}

const getAverageAgeOfMale = compose(getOnlyMales, getOnlyAges, getAverage);

const result = getAverageAgeOfMale(data);

๊ธฐ์กด getAverageAgeOfMale ํ•จ์ˆ˜์— ์žˆ๋˜ ๊ณผ์ •๋“ค์„ ๋ถ„๋ฆฌํ•ด getOnlyMales, getOnlyAges, getAverage ๋ผ๋Š” ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. ๊ฐ๊ฐ ๋‚จ์„ฑ๋งŒ ๋ถ„๋ฆฌ, ๋‚˜์ด๋งŒ ๋ถ„๋ฆฌ, ํ‰๊ท ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

compose ํ•จ์ˆ˜๋Š” ์ „๋‹ฌ ๋ฐ›์€ ํ•จ์ˆ˜ ์ธ์ž๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉ์‹œํ‚ค๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์ด๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์›๋ณธ data์—์„œ ๋‚จ์„ฑ์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๋‚จ์„ฑ ์ค‘ ๋‚˜์ด ์ •๋ณด๋งŒ ๊ฐ€์ ธ์™€์„œ ํ‰๊ท ์„ ๋‚ด๋Š” getAverageAgeOfMale๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋“ค์€ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์œ„ํ•ด ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ๊ธฐ์กด getAverageAgeOfMale ํ•จ์ˆ˜์™€์˜ ์ฐจ์ด์ ์ด๋ฉด์„œ ๊ณ ์ฐจ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

๋‚ด์žฅ ๊ณ ์ฐจ ํ•จ์ˆ˜


โœ๏ธ filter

์›ํ•˜๋Š” ์ •๋ณด๋งŒ ํ•„ํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๊ฐ€
2. ํŠน์ • ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ์ฐธ์ด๋ผ๋ฉด
3. ๋”ฐ๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค.

 

const numArr = [1, 2, 3, 4, 5, 6, 7, 8];

1๋ถ€ํ„ฐ 8๊นŒ์ง€์˜ ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด์ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ,

const isEven(num) {
    return num % 2 === 0;
}

๊ฐ ์š”์†Œ์˜ ๊ฐ’์„ 2๋กœ ๋‚˜๋ˆ„์–ด ๋‚˜๋จธ์ง€๊ฐ€ 0์ด๋ผ๋ฉด (true) === ์ง์ˆ˜๋ผ๋ฉด!

numArr.filter(isEven);

์ด isEven์„ ์ด์šฉํ•ด ํ•„ํ„ฐ๋ง์„ ํ–ˆ์„ ๋•Œ ์œ„์˜ ๊ฒฐ๊ณผ๋Š” [2, 4, 6, 8]์ด ๋œ๋‹ค!

 

์ฐธ๊ณ ๋กœ filter ๋ฉ”์†Œ๋“œ๋Š” immutableํ•œ ๋ฉ”์†Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์›๋ณธ ๋ฐฐ์—ด์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค!!

 

โœ๏ธ map

ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•œ๋‹ค.

1. ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๊ฐ€
2. ํŠน์ • ๋…ผ๋ฆฌ์— ์˜ํ•ด
3. ๋‹ค๋ฅธ ์š”์†Œ๋กœ ์ง€์ •๋œ๋‹ค.

 

const numArr = [1, 2, 3, 4];

1๋ถ€ํ„ฐ 4๊นŒ์ง€์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด ์žˆ๊ณ ,

const changeNum = function(num) {
    if (num % 2 === 0) {
    	return '์ง์ˆ˜';
    } else return 'ํ™€์ˆ˜';
}

์ „๋‹ฌ ์ธ์ž์˜ ๊ฐ’์ด ์ง์ˆ˜๋ผ๋ฉด '์ง์ˆ˜'๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 'ํ™€์ˆ˜'๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด

numArr.map(changeNum);

changeNum ํ•จ์ˆ˜๋กœ ๋ฐฐ์—ด์„ ๋งคํ•‘ํ–ˆ์„ ๋•Œ ๊ฒฐ๊ณผ๋Š” ['ํ™€์ˆ˜', '์ง์ˆ˜', 'ํ™€์ˆ˜', '์ง์ˆ˜']๊ฐ€ ๋œ๋‹ค!

 

map ๋ฉ”์†Œ๋“œ ๋˜ํ•œ immutableํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ณธ ๋ฐฐ์—ด์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค!!

 

โœ๏ธ reduce

๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์‘์ถ•ํ•œ๋‹ค.

1. ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ
2. ํŠน์ • ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ
3. ์›ํ•˜๋Š” ํ•˜๋‚˜์˜ ํ˜•ํƒœ๋กœ ์‘์ถ•ํ•œ๋‹ค.

 

const numArr = [1, 2, 3, 4];

1๋ถ€ํ„ฐ 4๊นŒ์ง€์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด ์žˆ๊ณ 

const sumAll = function(sum, num) {
    return sum + num;
}

์š”์†Œ๋ฅผ ๋”ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ,

numArr.reduce(sumAll, 0);

์ดˆ๊ธฐ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ  sumAll ํ•จ์ˆ˜๋กœ ๋ฐฐ์—ด์„ ์‘์ถ•ํ–ˆ์„ ๋•Œ ๊ฒฐ๊ณผ๋Š” 1 + 2 + 3 + 4์ธ 10์ด ๋œ๋‹ค!

 

reduce ๋ฉ”์†Œ๋“œ๋Š” ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •์ด ์ค‘์š”ํ•˜๋‹ค. ์ดˆ๊ธฐ๊ฐ’์ด ์„ค์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ˆ„์ ๊ฐ’์€ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด๊ณ  ํ˜„์žฌ๊ฐ’์€ ๋ฐฐ์—ด์˜ ๋‘ ๋ฒˆ์งธ ๊ฐ’์ด ๋œ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์ด ์„ค์ •๋˜์—ˆ๋‹ค๋ฉด ๋ˆ„์ ๊ฐ’์€ ์ดˆ๊ธฐ๊ฐ’์ด๊ณ  ํ˜„์žฌ๊ฐ’์€ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์ด๋‹ค.

 

์œ„ ์˜ˆ์ œ์—์„œ ์ดˆ๊ธฐ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ, reduce๋Š” 1 + 2 + 3 + 4๋ฅผ ๊ทธ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ 

์ดˆ๊ธฐ๊ฐ’์ด 1์ผ ๊ฒฝ์šฐ reduce๋Š” 1 + 1 + 2 + 3 + 4๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

profile

Dream๐Ÿฐng

@shoupeach

๐Ÿฐ Happy new rabbit! ๐Ÿฐ

profile on loading

Loading...