기본 콘텐츠로 건너뛰기

12월, 2022의 게시물 표시

reduce?

 reduce는 함수형 프로그래밍을 공부하면, 항상 보게 되는 함수이다. 처음 reduce라는 함수를 마주쳤을 때, 굳이 이런 함수를 사용해야 하나, 이런생각도 해보기도 하고, 왜 감소하다라는 뜻을 갖고 있는 reduce이지? 이런생각을 해보기도 했다.  reduce는 reducer 함수에 의한 결과를 누적 해 주는 함수이다. 누적이라는 말에서 accumulate라고 불러야 하는거 아닌가? 하고 아직도 생각 하고 있는 함수이다.  reduce의 함수 reduce ( reducer : (accumulator: Any , current: Any ) => Any , initialValue: Any ) => accumulator: Any  javascript에는 Array가 이미 reduce를 지원을 하고 있기에, 아래와 같이 사용이 가능 하다. [ 1 , 2 , 3 ]. reduce ( (accumulator , current) => accumulator + current , 0 ) // 6  구현을 해보자 한다면, 아래와 같이 간단하게 구현이 가능하다. function reduce ( arr , reducer , initValue ) { let accumulator = initValue for ( let idx = 0 ; idx < arr. length ; idx++ ) { accumulator = reducer( accumulator , arr[idx] , idx , arr ) } return accumulator }  Array.reduce와 마찬가지로 사용이 가능 하다. reduce ([ 1 , 2 , 3 ] , (accumulator , current) => accumulator + current , 0 ) // 6  reduce로 만들어보기  reduce는 기본적으로 반복을 하기 때문에 forEach는 아래처럼 만들 수 있다. const forEach = ( arr

함수 합성 (function composition)

  요즘에 프로그래밍 공부를 하다보면, 다시 수학 공부를 하는 기분이 드는 중이다. 이래서 프로그래머 되려면 수학이 중요하다고 한건가? 이 생각이 드는 수준이다.  운을 띄운김에 함수 합성에 대해서 잠깐 설명 하자면, 아래와 같은 것이다. <<https://en.wikipedia.org/wiki/File:Example_for_a_composition_of_two_functions.svg>>  위의 그림은 고등학교 1학년 수학시간에 합성 함수를 공부를 하면서 본 적이 있을 것이다. 간단하게 위의 내용을 수학적 기호로 표현 하면, h(x) = (g ∘ f )(x) = g(f(x)) 이와 같이 표현이 된다. h는 f와 g의 합성함수라고 부른다.  일단 간단하게 위의 함수를 코드로 작성을 해보자. 아주 간단하게 작성 하였다. function f (x) { if (x === 1 ) return 1 if (x === 2 ) return 3 if (x === 3 ) return 1 if (x === 4 ) return 2 } function g (x) { if (x === 1 ) return 2 if (x === 2 ) return 3 if (x === 3 ) return 1 if (x === 4 ) return 2 } function h (x) { if (x === 1 ) return 2 if (x === 2 ) return 1 if (x === 3 ) return 2 if (x === 4 ) return 3 } g ( f ( 1 )) === h ( 1 )  일단 이게 함수합성이다. 그러니 별거 아니다.  함수 합성  뭐 물론 위의 방법도 훌룡한 함수 합성이다. 수학적으로는 말이다. 코드에서는 저런 스타일은 꽤 좋지 않을 것이다.  생각을 넓혀 보면 콜백지옥도 함수 합성이라고 볼 수 있다. 또한 Promise 체인을 하고 있다면, 그것 또한 함수를 합성하고 있다고 볼 수 있다.  당연하게도 콜백 지옥 보다는

함수형 프로그래밍 ( 계산, 액션, 데이터 )

  이번 포스팅에서는 함수형 프로그래밍에 대한 오해에 대해 이야기 해보고자 한다. 함수형 프로그래밍을 검색을 하면 "불변성", "순수함수", "선언적" 등등의 무언가 고고한 패러다임 처럼 보이곤 한다. 그래서 지역변수를 하나라도 참조하는 순간 이건 함수형 프로그래밍이 아니야! 이런 착각이 들기도 한다.  하지만 생각해보자. 함수형 프로그래밍은 범용 프로그래밍 패러다임이다. 이 명제에는 대부분의 프로그래머들이 동의 할 것이다. 하지만 지역변수 하나 참조 했다고, 이 프로젝트는 함수형 프로그래밍 스타일로 짠 프로젝트가 아니네 할 사람은 없을 것이다. 물론 나중에 함수형 프로그래밍 스타일 이라는 단어가 생긴다면 몰라도 말이다.  뭐 물론 위의 예시가 통용되어 순수함수로 짜야 할 코드에 전역 변수를 참조하고 있다면, 그건 피해야 할 것이다. 이런 방식을 방지 하기 위하여 함수형 프로그래밍은 세 부분으로 나누어 생각해야 한다.  계산  이 부분이 함수형 프로그래밍 하면, 순수함수로써 다루어야 하는 부분이다.  계산은 이름에서 알 수 있듯이 입력으로 받은 데이터를 기반으로 값을 계산하고 출력을 반환하는 해야한다. 동일한 입력에 대해 항상 동일한 출력을 갖게 되며, 외부변수를 참조하여서는 안된다.  예를 들면, 두 정수의 곱을 계산을 하는 등, 같은 입력에는 항상 같은 결과를 리턴 해야한다.  액션  이 부분은 순수 함수가 아닌 부분이다.  외부에 존재하는 데이터베이스의 데이터를 가져오거나, 특정한 데이터를 데이터베이스에 쓰는 행위를 담당하는 등, 동일한 조작에도 실패의 가능성이 있거나, 동일한 값을 받아 올 수 없는 함수인 경우이다.  실행 횟수 및 시점에 다른 값을 출력 가능성이 있다.  데이터  데이터에 대해서는 불변성을 지원하는 것이 좋다. 함수형 프로그래밍에서는 불변성이 원칙이니 말이다. 하지만, 액션 내의 지역변수와 지금 말하고자 하는 데이터는 분리하여야 한다.   여기서 데이터는 이벤트라고 말하는 것이 더욱

자바 스크립트 희소 배열.

  희소 배열이라고 들어보았나? 학부생 때 교양 혹은 전공으로 선형대수를 배웠다면, 희소 행렬이라고는 들어보았을 것이다. 들었지만 아마 기억에는 없을 수도 있겠다. 행렬에 0이 비교적 많은 행렬을 희소 행렬이라고 부른다. 0이 많다는 것은 데이터가 없다는 것으로 볼 수 있다.  뭐 물론 프로그래밍을 하면서 배열에 0이 많다고 해서 희소 배열이라고 부르지는 않을 것이다.  희소 배열  아마 알고리즘 연습을 하는 사람들은 아래와 같이 배열의 개수를 초기화하는 코드를 작성 해본 사람이 있을 것이다. let a = [] a. length = 30  인풋이던 아웃풋이던 30개로 고정되어야 하는 상황 같은 때 말이다. 위의 결과는 무엇일까? 아마도 위와 같은 코드를 작성해본 사람이라면 알 것이다.  empty가 30개 있다고 한다. 일단 난 희소 배열의 정의를 empty가 하나라도 있는 상황을 희소 배열이라고 부르겠다.  희소 배열을 만드는 방법은 아래처럼 더 있다. delete를 사용 한다던가 일부러 초기화를 안 하는 경우다. let a = [ 1 , 2 , , 4 ] delete a[ 1 ]  empty?  그래 희소 배열이 존재 하는 것은 알았다. 그러면 왜 알아야 하는가? 이것이 궁금할 수도 있다.  일단 하나만 집고 넘어가자 empty는 값도 아니고, 예약어도 아니다. 저장할 수도 없고, 읽을 수도 없다. 우리에게는 데이터가 없다는 표현으로 undefined가 있다.  하지만 empty와 undefined는 다르다! 자 아래 실험을 보자. let a = [ 1 , , 3 ] a[ 0 ] = a[ 1 ]  분명 empty의 값을 갖고 있는 1번 인덱스에서 값을 가져와 0번 인덱스에 값을 삽입 하였으나, undefined가 되어버렸다.  이는 자바스크립의 배열 객체에서 1번 인덱스를 읽는 상황에서 undefined를 리턴 하였기 때문 이라 추측 된다.  empty vs undefined  empty는 배열 내에서만 존재하는 값이며, 읽는 순간 undefined로 결

선언형 프로그래밍

  선언형 프로그래밍을 처음 들어보는 개발자들도 있을 것이다. 뭐 물론 그들이 모르는 것은 뭐 딱히 신기할 만한 일도 아니다. 하지만 SQL을 사용해본 개발자는 대부분일 것이다. 그나마 들어보았다면, 학생 때나, 정보처리 기사등 자격증을 따려고 공부 할 때 SQL의 특징 중 선언형 프로그래밍 언어이다. 라는 문장을 본 정도 일 것이다.  하지만 함수형 프로그래밍에 관심 있는 혹은 사용중이 개발자라면, 함수형 프로그래밍이 선언형 프로그래밍 방식 중의 하나라고 알고 있거나 함수형 프로그래밍이 선언형 프로그래밍이라고 알고 있는 개발자들도 있을 것이다.  우리가 알고있는 프로그래밍 방식은 크게 두 분류로 나뉜다. 명령형 프로그래밍 절차적 프로그래밍 객체지향형 프로그래밍 선언형 프로그래밍 논리형 프로그래밍 함수형 프로그래밍  논리형 프로그래밍이라고 하면, 아마 못 들어본 사람이 많을 것이다. 뭐 프로그래밍 언어론을 배웠다면 PROLOG언어의 특징을 보면서 들어보았을 법하다.  명령형 프로그래밍은 HOW에, 선언형 프로그래밍은  WHAT에 중점을 두는 지에 대한 차이라고 한다. 뭐 물론 시험을 볼 것이 아니라면 아 그렇구나 정도면 된다. 선언형 프로그래밍 대표인 SQL로 어떤 차이인지 맛만 보도록 하자. SELECT * FROM users WHERE user_id = 1; DELETE FROM users WHERE user_id = 1;  첫 문장은 user_id가 1인 유저의 데이터를 가져오는 문장이고,  두번째 문장은 user_id가 1인 유저의 데이터를 삭제하는 문장이다.  위 처럼 무엇을 할 지에 대한 구분이 전체를 보지 않아도 된다. SELECT, DELETE 여부에 따라 검색이냐 삭제이냐 결정이 된다.  자 그러면 자바스크립트 코드로 userList에서 userId가 1인 데이터를 찾고자 해보자.  명령형 프로그래밍 let res = [] for ( const user of userList ) { if ( user. userId === 1 ) {