프로그래밍 패러다임에 대해 알게되었고, 그중 함수형 프로그래밍의 의미
,조건
,그 예시
에 대해 공부해보았다.
*프로그래밍 패러다임
: 프로그래밍을 어떻게 이해하고 구상할지 생각하는 관점
함구도 객체
처럼 변수
나 함수의 인자처럼 다룰 수 있음
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);
}
< 순수 함수 >
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;
Map
, Reduce
, Filter
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
: 불변데이터 구조 사용하는 방법
내부함수
가 외부함수
의 맥락에 접근할 수 있는 것 < 예시 >
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
내로 가져와 묶음)
-> 자바스크립트는 함수
를 리턴하고, 리턴하는 함수
가 클로저
를 형성하기 때문에 변수에 계속해서 접근이 가능하다.
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와 객체의 관계 중심으로 코드 작성 | 값의 연산 & 결과도출 중심으로 코드 작성 |
장점 | - 유지보수가 쉬움 - 코드의 재사용성 높음 | - 수정 편리 -연산시점이 비중요 |
단점 | 설계 단계 복잡 | 내부,외부 데이터 상태 조작 불가 |