함수형 프로그래밍 ? 그게뭔데 function?

tami·2021년 1월 19일
2

자바스크립트

목록 보기
1/1
post-thumbnail

프로그래밍 패러다임에 대해 알게되었고, 그중 함수형 프로그래밍의 의미,조건,그 예시에 대해 공부해보았다.

*프로그래밍 패러다임: 프로그래밍을 어떻게 이해하고 구상할지 생각하는 관점


📌함수형 프로그래밍

▫️ 함수 리터럴

함구도 객체처럼 변수나 함수의 인자처럼 다룰 수 있음
sdie effect 가 적음

▫️ 함수형 프로그래밍

  • 외부의 영향을 받지 않는 함수로 구현하는 프로그램 기법
  • 모든걸 함수로 실행
    함수 : input & output으로 이루어짐 -> 명령형
  • 순수함수만 사용
    순수함수 : 주어진 input만을 사용해 output 생성 -> 함수 외부(ex 전역변수)의 것 사용 X
  • 부작용(side effect) : 함주가 주어진 input에서 계산하지 않은 output을 내보내는 것

서버로부터 받은 Data를 조작하기에 아주 좋은 방식

일급함수
함수를 객체로 취급
순수함수

▫️ 순수함수

동일한 Input에 동일한 output을 반환하며 외부에 영향을 받지 않는 함수

ex)
< 순수함수 >

var name = "Tami";
functin greet(){
    console.log("hi I'm "+name);
}
  • 전역변수 name 을 사용
  • console.log= 함수의 반환 값 X

< 순수 함수 >

functin greet(name){
    console.log("hi I'm "+name);
}

▫️ 고차함수

input & output : 다른 함수
함수를 일종의 객체로 봄
ex)

function makegreet(string){
    return function greet(name){
        return name + " " + string;
    }
}

var hellogreet = makegreet("hello");
hellogreet("Tami"); // Tami hello;

반복을 피하자 (for, while...)

Map , Reduce , Filter

모든 data를 불변으로 두기

ex)
"h3" 룸을 "h4"로 바꾸고 싶을 때 새로운 변수로 지정하여 바꾸자

var rooms = [h1,h2,h3];
ver newRooms = rooms.map(function(rm){
    if(rm==="h3"){
        return "h4"}
    else return rm;
    });
})

->그러나 계속 사본이 생길 것 (newRoom2,3,4...)

▫️ 영속적 데이터 구조

기존 데이터를 재사용하여 효율적 ex) Map, Hash...
Mori :해당 데이터구조를 네이티브로 갖는 ClojureScript를 사용해 자바스크립트에서 사용할 수 있도록 포팅
Immutable.js : 불변데이터 구조 사용하는 방법


📌 람다와 클로저

▫️ 람다 Lambda

▫️ 클로저 Clocure

  • 내부함수외부함수의 맥락에 접근할 수 있는 것
  • 함수 본문 정의를 공유하지만 다른 맥락에서 환경을 저장하는 것
  • 람다 식 표현으로 변수의 유효범위를 지정하는 방식(?)

< 예시 >

function A(){
    var title = 'hi js';
    function B(){
        alert(title);
    }
    B();
}//hi js

B의 title 을 A에서 찾음
=내부함수(B)가 외부함수(A)의 변수에 접근

function A(){
    var title = 'bye js';
    return function(){
        alerg(title);
    }
}// bye js

외부함수(A) 가 종료된 이후에도 외부함수(A)에 접근 가능

자바스크립트

함수를 리턴 -> 리턴한 함수가 클로저 생성

function adder(x){
    var y = 1;
    return function (z){
        y=100;
        return x+y+z;
    };
}

var add5 = adder(5);

console.log(addt(2)); // 107

add5: 클로저
x: 자유 변수
y: 묶인 변수
닫힌 람다식 : 사용한느 변수들이 모두 묶인 변수
열린 람다식 : 열린 변수가 존재할 때
클로저 : 열린람다식 -> 닫힌 람다식 (람다식 내의 모든 자유변수를 scope내로 가져와 묶음)

-> 자바스크립트는 함수를 리턴하고, 리턴하는 함수클로저를 형성하기 때문에 변수에 계속해서 접근이 가능하다.

▫️ Private variable

  • 외부에서 접근할 수 없는 변수
  • 많은 사람이 함께 만드는 code에서 누구나 수정할 수 있는 code속에서 sw가 어긋나지 않게하는 방지책 중 하나(?)
  • 변경되지 않아야 할 맥락에 영향을 주지 않게 하는 변수 선언
function A(title){
    return {
        get_title : function(){
            return title;
        }
        set_title: function(_title){
            title = _title
        }
    }
}

first = A('hi'); 
second = A('bye'); 
alert(first.get_title());// hi
alert(second.get_title());// bye
first.set_title('real bye');
alert(first.get_title());// hi
alert(second.get_title());// real bye

title에 접근하기 위해서는 set_title, get_title을 사용해야함
title = private variable
title 가져오기 : get_title
title 수정하기 : set_title

▫️ 예시

< 일반함수 >

let print = function(x){
    conseole.log(x);
}

< 람다식 함수 (화살표) >

let arrowprint = (y) =>{
    console.log(y);
}

< map >
배열.map((요소,인덱스,배열) => { return 요소});

array=[1,2,3];
console.log(array.map(x => x.length));
//[1,2,3]

< reduce >
배열.reduce((누적값, 현재값, 인덱스, 요소) => {return 결과}, 초기값 );

array = [1,2,3];
let sum = array.reduce(acc, cur, i) => { console.log(acc,curr,i); return acc+cur ;} ,0);
// 0 1 0
// 1 2 1
// 3 3 2
// 6

< map --> reduce >
초기값을 배열로 하고 push 함

  • 배열의 글자수
    array = [1,2,3];
    let len = array.reduce(pre, cur) => {pre.push(cur.length) return pre},[]);
- 배열 중 홀수
```js
array = [1,2,3];
let odd = array.reduce(pre, cur) => {if(cur%2) pre.push(cur);
return pre;}, []);

함수경, 객체형 중요하다고 하지마 결국 가장 중요한건 이것이 프로그래밍의 목적이 되면 안됨. 그들의 장점을 이용하는 것이 중요함.


프로그래밍 패러다임

프로그래밍을 어떻게 이해하고 구상할지 생각하는 관점

종류

명령형 프로그래밍

  • 절차지향
  • 객체지향

선언형 프로그래밍

  • 함수형
  • 반응형

함수형 프로그래밍과 객체지향 프로그매링의 차이

데이터를 다루는 개념 & 간결한 코드 작성

객체 지향형 프로그래밍:객체와 메소드가 있어 그걸 변경하는 형식

-객체지향형함수형
특징class와 객체의 관계 중심으로 코드 작성값의 연산 & 결과도출 중심으로 코드 작성
장점- 유지보수가 쉬움 - 코드의 재사용성 높음- 수정 편리 -연산시점이 비중요
단점설계 단계 복잡내부,외부 데이터 상태 조작 불가
profile
자스베이더 Tami의 TILAND에 오신걸 환영합니다🗡

0개의 댓글