[2020. 10. 17 TIL ] Functional Programming

Young-mason·2020년 10월 18일
0

TIL

목록 보기
1/11

이 글은 해당 유튜브 컨텐츠의 내용을 직접 요약하여 번역한 것입니다.
https://www.youtube.com/watch?v=e-5obm1G_FY&feature=youtu.be

함수형 프로그래밍이란 무엇인가?

코드를 작성할 때 함수를 적극적으로 사용하는 하나의 프로그램 패러다임이자 코딩 스타일이다.

함수형 프로그래밍의 장점

기존의 객체 지향 프로그래밍이 현실에 있는 것들을 프로그래밍으로 구현하는데에 장점이 있지만, prototype, this 등의 복잡한 개념때문에 불완전한 이해로 활용할 시 각종 버그와 유지보수가 어렵다는 점이 있다.

어떻게 함수형 프로그래밍을 활용할 수 있을까?

1. 무엇이든 함수를 이용해보자

< Not functional > 

var name  = "Mason";
var greeting = "Hi, I'm ";
console. log(greeting + name);
// => "Hi, I'm Mason"

< Functional >

function greet(name) {
	return "Hi, I'm" + name;
}

greet("Anjana");
// => "Hi, I'm Mason"

greeting 이라는 변수를 만드는데 소모되는 메모리의 양을 절약할 수 있다

2. Side-effect를 피해라. (use "pure" function)

< Not pure >

var name = "Anjana";
function greet() {
	console.log("Hi, I'm " + name);
}

< Pure >

function greet(name) {
	return "Hi, I'm" + name;
}

3. 고차함수를 활용해라

Functions can be inputs / outputs
함수를 다른함수의 인자로 받거나, 함수를 리턴할 수 있다

function makeAdjectifier(adjective) {
	return function(string) {
		return adjective + " " + string;
	}
}

var coolifer = makeAdjectifier("cool");
coolifier("conference")
// => "cool conference"

4. 반복문 사용을 줄여라

for, while 대신 map, reduce, filter를 사용하라

우리에게 샌드위치 만들기에 필요한 식재료가 주어져있고 '채썰기' 혹은 '다지기' 라는 함수를 활용해서 모든 식재료 요소들에 이를 적용해야 한다고 가정해보자. 보통과 같다면 우리는 "for 야채 in 샌드위치재료" 와 같은 반복문을 통해서 이를 해결하려고 할 것이다.

하지만 함수형 프로그래밍에서 우리는 "map"을 활용한다. map은 Array 형식으로 되어있는 식재료들과 함수 "다지기" 를 인자로 받아서, 모든 식재료들이 다져져 있는 새로운 리스트를 만들어 낼 수 있다.

그리고 나서 기본적으로 배열의 모든 요소들을 특정한 방법으로 결합하는 "reduce"함수를 활용한다. 위의 예에서는 재료들을 차곡차곡 쌓아서 맛있는 샌드위치를 만드는 것이다.

만약 당신이 오이를 싫어한다면, "filter" 기능을 활용해서, 오이가 아닌 모든 요소들을 필터링한 결과를 얻어낼 수 있다.

이 방법들을 통해 Functional programming의 사고방식으로 for, while 반복문을 구현해낼 수 있다.

5. 변화를 피하기

변하지 않는 데이터를 활용해라
Mutation이란건 제자리에 있는 데이터를 바꾼다는 것이다

< Mutation (bad!) >
var rooms = ["H1", "H2", "H3"];
rooms[2] = "H4";
rooms;
// => ["H1", "H2", "H4"]

// rooms라는 변수 안에 데이터를 넣어놓고 직접 그 데이터에 접근하여 수정하고있다.

< No mutation (Good!) : 
var rooms = ["H1", "H2", "H3"];
var newRooms = rooms.map(function(rm) {
	if (rm === "H3") { return "H4"; }
	else { return rm; }
})

// newRooms => ["H1", "H2", "H4"]
// rooms => ["H1", "H2", "H3"]

// 일단 newRooms라는 변수를 할당하고 나면 
// newRooms는 우리가 수정하고자 하는 결과물을 저장하고
// 반면에 rooms는 처음에 할당된 것과 동일성을 유지하낟.

6. 지속성 있는 데이터 구조를 활용하여 불변성(immutability)를 효율적으로 관리

Mori, Immutable.js 등의 툴 활용

profile
Frontend Developer

0개의 댓글