함수형 프로그래밍 [1]

Hyunsoo Han·2020년 1월 6일
1

Javascript

목록 보기
2/2

함수형 프로그래밍

기원

함수형 프로그래밍의 기원은 1930년대다. 당시 발견한 람다 계산법이 함수형 프로그래밍의 시초라 할 수 있다. 함수를 함수로 넘기거나 함수가 함수를 결과로 내놓는 것도 가능하다. 다른 함수를 조작하고, 함수를 인자로 받거나 반환하는 것이 가능한 복잡한 함수를 고차 함수라고 한다.
1950년대 존 맥카시는 람다 계산법에 비롯한 개념을 프로그래밍 언어로 만들었는데, 바로 리스프다. 리스프는 고차 함수라는 개념과 함수가 "1급 시민" 혹은 "1급 멤버"라는 개념을 구현했다.
함수가 1급 시민이 되려면 변수에 함수를 대입할 수 있고, 함수를 다른 함수에 인자로 넘길 수 있으며, 함수에서 함수를 만들어서 반환할 수 있어야 한다.

함수형이란?

자바스크립트에서는 함수가 1급 시민이기 때문에 함수형 프로그래밍을 지원한다고 할 수 있다. 함수가 애플리케이션의 데이터를 표현할 수 있다. 문자열이나 수 또는 다른 모든 값과 마찬가지로 var 키워드를 사용해 함수를 정의할 수 있다.

var log = function(message) { 
	console.log(message);
}

log("메시지"); // 메시지

ES6에서는 화살표 함수를 사용해 다음과 같이 정의할 수 있습니다.

const log = message => console.log(message)

log("메시지"); // 메시지

함수를 변수에 넣을 수 있는 것과 마찬가지로 객체에 넣을 수도 있다.

const obj = {
	message: "메시지",
	log(message) {
      console.log(message)
    }
}

obj.log(obj.message); // 메시지

함수를 배열에 넣을 수도 있다.

const messages = [
	"값 1",
  	message => console.log(message),
  	"값 2",
  	message => console.log(message)
]

messages[1](messages[0])	// 값 1
messages[3](messages[2])	// 값 2

함수를 다른 함수 인자로 넘길 수도 있다.

const inside = logger => logger("인자 넘기기");

inside(message => console.log(message)) // 인자 넘기기

var createScream = function(logger) {
 	return function(message) {
    	logger(message.toUpperCase() + "!!")
    }
}

const scream = createScream(message => console.log(message))

scream("HAHAHA") // HAHAHA!!

// ES6
const createScream = logger => message => logger(message.toUpperCase() + "!!")

함수를 인자로 받거나 함수를 반환하는 함수를 고차 함수라 부른다.


선언적(Declarative) vs 명령형(Imperative)

선언적 프로그래밍

필요한 것을 달성하는 과정을 하나하나 기술하는 것보다 필요한 것이 어떤 것인지 기술하는 데 방점을 두고 애플리케이션의 구조를 세워나가는 프로그래밍 스타일

명령형 프로그래밍

코드로 원하는 결과를 달성해 나가는 과정에만 관심을 두는 프로그래밍 스타일

선언적 프로그래밍의 코드 구문은 어떤 일이 발생하는지 기술하고, 실제로 그 작업을 처리하는 방법은 추상화로 아랫단에 감춰진다. 코드 자체가 어떤 일이 벌어질 지 설명하기 때문에 추론하기 쉽다.

참조

  • Learning React, 3장. 자바스크립트를 활용한 함수형 프로그래밍
profile
이야 진짜 모르겠다

0개의 댓글