๊ณ ์ฐจ ํจ์
๊ณ ์ฐจ ํจ์๋?
๊ณ ์ฐจ ํจ์๋
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
๋ฅผ ์ํํ๊ฒ ๋๋ค.
'๐ถ FE 41๊ธฐ > Review' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[S2U2] JavaScript ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ (1) | 2022.09.21 |
---|---|
[S1U11] JS/๋ธ๋ผ์ฐ์ DOM (0) | 2022.09.14 |
[S1U10] JavaScript ํต์ฌ ๊ฐ๋ ๊ณผ ์ฃผ์ ๋ฌธ๋ฒ (0) | 2022.09.07 |
[S1U9] JavaScript ๋ฐฐ์ด, ๊ฐ์ฒด (0) | 2022.09.05 |
[S1U8] Linux/Git ๊ธฐ์ด (0) | 2022.09.01 |