이터러블 프로그래밍 학습
목표
- 이터러블 프로그래밍 혹은 리스트 프로세싱에 익숙해지자
🧐홀수 N개 꺼내서 더하기
명령형 코드
function f1(limit, list) {
let acc = 0;
for (const a of list) {
if (a % 2) {
const b = a * a;
acc += b;
if (--limit == 0) break;
}
}
console.log(acc);
}
f1(3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
함수형, 이터러블 프로그래밍(List Processing)으로 코드 변경
if
를filter
함수를 통해 변경- 값 변화 후, 변수 할당을
map
함수를 통해 변경 break
를take
함수를 통해 변경- 축약 및 합산을
reduce
함수를 통해 변경
const add = (a, b) => a + b;
function f2(limit, list) {
_.go(
list,
L.filter((a) => a % 2),
L.map((a) => a * a),
L.take(limit),
_.reduce(add),
console.log,
);
}
f2(3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
참고 - while문을 range함수로 변경
// 명령형
function f3(end) {
let i = 1;
while (i < end) {
console.log(i);
i += 2;
}
}
f3(10);
// 함수형
function f4(end) {
L.range(end);
}
f4(10);
// each함수 사용
function f4(end) {
_.go(L.range(1, end, 2), _.each(console.log));
}
f4(10);
🧐 추억의 별 그리기
_go.(
_.range(1,6),
_.map(_.range),
_.map(_.map(_ => '*')),
_.map(_.reduce((a,b) => `${a}${b}`)),
_.reduce((a,b) => `${a}\n${b}`),
console.log);
// 지연적으로 만들기
_go.(
L.range(1,6),
L.map(L.range),
L.map(L.map(_ => '*')),
L.map(_.reduce((a,b) => `${a}${b}`)),
_.reduce((a,b) => `${a}\n${b}`),
console.log);
// 위에 코드랑 시간복잡도, 성능적인 측면에서 다를게 없음
_go.(
L.range(1,6),
L.map(s => _.go(
L.range(s),
L.map(_ => '*'),
_.reduce((a,b) => `${a}${b}`)
)),
_.reduce((a,b) => `${a}\n${b}`),
console.log)
// 함수 추출해서 사용
const join = sep => _.reduce((a, b) => `${a}${sep}${b}`);
_.go(
L.range(1, 6),
L.map(L.range),
L.map(L.map(_ => '*')),
L.map(join('')),
join('\n'),
console.log);
🧐 추억의 구구단
_.go(
_.range(2, 10),
_.map((a) =>
_.go(
_.range(1, 10),
_.map((b) => `${a}x${b} = ${a * b}`),
join('\n'),
),
),
join('\n\n'),
console.log,
);
// 지연적으로
_.go(
L.range(2, 10),
L.map((a) =>
_.go(
L.range(1, 10),
L.map((b) => `${a}x${b} = ${a * b}`),
join('\n'),
),
),
join('\n\n'),
console.log,
);
느낀점
기존에 당연하게 작성하고 있던 명령령 코드를 함수형 코드로 변경하는 학습을 통해, 더욱더 가독성과, 성능 적인 측면에서 좋은 코드를 작성해 보는 학습을 하였습니다.
조금 더 연습을 통해, 실무 또는 프로젝트에서 막연하게 사용했던 명령형 코드를 함수형 코드로 변경하여 유지보수 좋은 코드를 작성하는 연습을 해야 겠습니다.
참고
유인동님의 함수형 프로그래밍과 JS ES6+ 강의