자바스크립트를 공부하면 공부할수록 컴퓨터 언어의 세계는 정말... 심오한 것 같다.
컴퓨터공학은 인간이 만든 공학이기 때문에 다른 공학에 비해 간단할 것이라 생각했던 과거의 내가 부끄러워 진다.
오늘은 훌륭한 개발자가 되기위해 알아둬야 할 몇가지 개념들에 대해 알아보자

MapReduce Model
MapReduce 모델은 대량의 데이터를 처리할 때 사용 하는 프레임워크이다.
이름에서 유추 할 수 있듯이 Map과 Reduce를 혼용해 대량의 정보를 병렬처리하며 점차 가지수를 줄여나가는 방법이다.
아래의 이미지를 보면 이해가 빠를 것이다.
잘은 모르겠지만 위와같은 모델을 사용하면 대량의 대이터를 분산시켜 병렬처리를 하기 때문에 좀더 효율적인 데이터 처리가 가능하다고 한다.
Currying
커링의 Curry는 커링 논리를 만든 과학자의 이름에서 따왔다고 한다.
자칫 음식이름인줄...
근데 묘하게 음식과 연관지으면 이해가 편리하다.
커링이란 밥을 일단 지어놓고 3분카레가 부어질 때 까지 기다리고 있는 상황을 뜻한다. 정확히는 클로저가 모든 argument들을 한번에 받을 필요가 없음을 뜻한다.
아래의 예제 코드를 살펴보자.
function func1(arg1) {
let message1 = " is";
return function func2(arg2) {
let message2 = " awesome!";
return arg2 + message1 + message2 + arg1;
}
}
let sentence = func1('!');
sentence('sean');
sentence함수에 'sean'을 입력하지 않았더라도(모든 argument를 전달하지 않았더라도) 함수의 실행에는 문제가 발생하지 않는다. 즉 sentence변수에 func1함수가 할당되었을 때, 카레가 부어지기 전 밥이 놓여있는 상태로 존재하는 것!
Function composition
Function composition은 위의 커링과 비슷한 개념이다.
함수를 활용할 때 아래와 같이 각각의 변수에 각 함수를 실행한 값을 저장해서 활용할 수도 있다.
const double = x => x * 2
const square = x => x * x
// Tradition approach
var output1 = double(2);
var output2 = square(output1);
하지만 아래처럼 한번에 조합해서 사용하는 것이 함수의 조합에 관한 개념이다.
var output_final = square(double(2));
Declarative Programming
소프트웨어 개발은 마치 가상의 공사판에서 일하는 것과 같다.
수많은 사람들이 협업을 하지만 현실세계에는 존재하지 않는다.
프로그램이 완성되기 전까진.
따라서 물리적으로 보이는 형태가 없기 때문에 동료들과의 협업이 굉장히 난이도가 높으면서 중요하다.
Declarative Programming은 그러한 점에서 아주 중요한 코딩 스타일이라고 볼 수 있다.
Declarative Programming은 코딩을 할 때 각각의 함수와 변수가 어떤 의미를 내포하는지를 선언하며 작성하는 스타일이다. Declarative Programming의 반대말로는 Imperative Programming이 있다.
Imperative Programming은 단계적으로 한스텝 한스텝 어떤 과정을 밟아나가면서 프로그램이 진행되야하는지 일일이 적는 코딩 스타일을 말한다.
아래의 예제를 본다면 느낌이 와 닿을 것이다.
//Imperative
let longPasswords = [];
for (let i = 0; i < passwords.length; i++) {
const password = passwords[i];
if (password.length >= 9) {
longPasswords.push(password);
}
}
console.log(longPasswords); // logs ["freecodecamp", "mypassword123"];
//Declarative
const longPasswords = passwords.filter(password => password.length >= 9);
console.log(longPasswords); // logs ["freecodecamp", "mypassword123"];
Declarative는 확실히 작성 난이도가 imperative에 비해 월등히 높다.
하지만, 일단 작성을 하면 변수나 메소드의 이름으로 부터 의도하는 바를 쉽게 유추 할 수 있어, 생산성의 증가와 동료와의 협업이 좀 더 원활해 지는 이점이 있다.
'Javascript' 카테고리의 다른 글
JS Async vs Defer (0) | 2021.10.27 |
---|---|
JS Regular Expressions (0) | 2021.10.26 |
JS Shallow Copy (0) | 2021.10.25 |
JS 내장 고차함수 (0) | 2021.10.24 |
JS Reduce 메소드 (0) | 2021.10.21 |