Skip to main
Functional Programming
in JavaScript

Dean

Chapter 3Chapter 3. 함수형으로 전환하기

챕터 1, 2를 통하여 순수 함수를 만드는 법을 확인 하였으니, 
이번 챕터에서는 순수함수들을 연결하는 방법에 대해 알아볼 것 입니다.

Ÿ	프로그램 제어와 흐름
Ÿ	로대시 JS 라이브러리와 함수 체인
Ÿ	map, reduce, filter
Ÿ	코드와 데이터를 효과적으로 헤아림
Ÿ	재귀적 사고방식프로그램 제어와 흐름

어플리케이션의 제어와 흐름

제어흐름 : 프로그램이 정답에 이르기까지 거치는 경로

선언형 프로그램

최소한의 제어 구조로 연결. 
연산 간 흐름은 독립적이며, 고수준의 추상화 대체 가능.

Ex) 체이닝 코드프로그램 제어와 흐름

메서드 체이닝

다수 메서드를 단일 구문으로 호출하는 OOP(객체지향) 패턴

‘Polaris Share’. substring(0,10). toLowerCase() + ‘is awesome!’;

concat( toLoserCase( substring(’Polaris Share’,1,10) ), ‘is awesome!’);

계산 ~ 흐름 로직 분리 및 배열에 적용 가능로대시 JS 라이브러리와 함수 체인

함수 체이닝

함수형 프로그래밍은 자바의 ArrayList, LinkedList, DoublyLinkedList 등 용도별 인터페이스로 구현된 것과 달리, 기존 자료구조를 이용해 고계 연산을 적용한 사고 체계

람다(Lambda) 표현식

- 함수형 프로그래밍에서 탄생
- 함수를 항상 return 하게 유도
- 실제 값처럼 사용 가능
- 가독성 상승

const name = p => p.fullname;
console.log(name(p1))

// 홍길동

※ 대표적 FP 라이브러리로대시 JS 라이브러리와 함수 체인

로대시(Lodash)

함수형 스크립트는 대개 자료 리스트를 처리하며,  대표적으로 사용되는 고계함수는 map, reduce, filter 등

언더스코어JS에서 파생된 라이브러리이며, 
전역개체 _(언더스코어 또는 로대시라고 읽음) 를 통해 로대시 JS 함수 호출

site link : https://lodash.com/map, reduce, filter

_.map : 데이터 변환

Ÿ	데이터 컬렉션의 원소를 모두 변환할때 용이
Ÿ	순수 함수형 변환 가능

let result = [];
let persons = [p1, p2, p3, p4];

for(let i ==0; i < persons.length; i++) {
	let p = persons[i];
	If(p !== null && p !== undefined) {
		result.push(p.fullname);
	}
}

_map(persons, s => (s !== null && s !== undefined) ? s.fullname : ‘’);map, reduce, filter

_.map : 데이터 변환map, reduce, filter

_.reduce : 결과 수집

Ÿ	데이터 컬렉션에서 유의미한 결과 도출 할 시 용이

_.map(persons, s => (s !== null && s !== undefined) ? s.address: ‘’)
.reduce(stat, person => {
	const country = person.address.country;
	stat[country]= stat[country.isUndefined ? 1 : stat[country] + 1;
	return stat;
}, {});

_(persons).map(func1).reduce(func2);map, reduce, filter

_.reduce : 결과 수집map, reduce, filter

_.filter : 원치않는 원소 제거

_(persons).filter(isValid).map(func1).reduce(func2);

const bornIn1903 = person => person.birthYear === 1903;
_(persons).filter(bornIn1903 ).map(fullname).join(’ and ’);

// ‘John von Neumann and Alonzo Church’

Ÿ	데이터 컬렉션 처리 전 계산하지 않을 원소 미리 제거map, reduce, filter

_.filter : 원치않는 원소 제거코드 헤아리기

코드 헤아리기

프로그램의 일부만 파악해도, 멘털 모델 구축 용이

멘털 모델 : 전체 변수의 상태와 함수 출력 같은 동적인 부분뿐만 아니라, 설계 가독성 및 표현성 같은 정적인 측면까지 포괄하는 개념

FP는 자료구조보다 연산에 중점코드 헤아리기

코드 헤아리기코드 헤아리기

코드 헤아리기

유사 SQL 데이터 : 데이터로서의 함수 (functions as data)

Ÿ	함수 체이닝을 통하여 데이터 선언 및 출력은 가능하나, 반복(Loop)는 대체 불가능재귀적 사고방식

재귀적 사고방식

주어진 문제를 자기 반복적인 문제들로 분해 후, 
다시 조합하여 원래 문제의 정답을 찾는 기법

Ÿ	기저 케이스(base case, 종료 조건)
	재귀함수가 결과값을 바로 계산할 수 있는 입력 집합

Ÿ	재귀 케이스
	함수가 자신을 호출할 때 전달한 입력 집합

※ 완벽한 순수 함수형 언어는 모든 루프를 재귀로 대체 가능재귀적 사고방식

재귀적 사고방식

짧고 쉽게 알고리즘 작성 가능하며 가독성 좋다! 하지만...

Ÿ	자신을 다시 호출하면서 생성되는 변수는 새로 생성된 변수들이다. 즉, 메모리 문제 야기!
Ÿ	재귀함수 내에서 초기화 하지 않으면 무한 루프에 빠질 수 있다!
Ÿ	재귀 호출은 내부 스택 메모리를 통해 수행된다. 제한된 스택 내 반복 호출이 지나치면 Stack overflow 에러 발생!
Ÿ	

이러한 단점에도 불구하고 써야하는 이유는 무엇일까?마치며 . . .

Ÿ	고계함수 map, reduce, filter를 쓰면 코드 확장 용이
Ÿ	Lodash JS는 데이터 흐름과 변환 과정이 명확히 구획된 제어 체인을 통해 데이터 처리 및 프로그램 작성 도움
Ÿ	FP의 선언적 스타일은 코드 헤이리기에 용이
Ÿ	고수준의 추상화를 SQL 어휘로 매핑하면 심도있게 데이터 이해 가능
Ÿ	재귀는 자기 반복적 문제를 해결Thank You
fullscreen

Functional Programming In JavaScript: Ch3

deandean
Jul 30, 2019
$ FREE00

share공유

save_alt다운로드

이 자료는 디컴퍼니의 멤버들이 스터디 활동으로 “Functional Programming In JavaScript” 도서를 공부하는 데 사용하기 위한 목적으로 작성했습니다. 이 슬라이드의 내용은 여러분이 책을 읽기 전에 1, 2 chapter의 대략적인 내용을 15분 내외로 빠르게 파악함으로써 좀 더 쉽게 책 내용을 소화할 수 있도록 도와주는 것을 목표로 합니다.

linkedin sns icon

Creative Commons License
-1