2025-01-07 TIL
클로저
자신이 선언된 렉시컬 환경을 기억하고 참조하는 함수, 좀 더 쉬운 말로 하면 자신 안의 로컬 함수를 가지고 있다고 이해하면 될 듯 하다.
함수 내부에 값을 가지고 있다는 점은 클래스와 비슷해 보인다. 클로저는 외부함수의 스코프가 내부 함수에 의해 참조되어야 하므로 사라지지 않고 남아 있어야 하며 다르게 말하면 그게 계속 잡혀 있는 한 가비지 컬렉팅에 포함되지 않아 메모리 문제를 일으킬 수 있다. 밑은 예시
const outerFunc = () => {
const name = 'Tom';
const innerFunc = () => console.log('my name is ' + name);
return innerFunc;
}
const inner = outerFunc(); // my name is Tom
inner(2);
커링
함수와 함께 사용할 수 있는 고급 기술.
f(a,b,c)의 형태를 f(a) => (b) => (c)의 형태로 각각의 인수가 ㅎ출 가능한 프로세스로 호출된 후 병합하도록 변환하는 것.
예시
function curry(f) { // 커링 변환을 하는 curry(f) 함수
return function(a) {
return function(b) {
return f(a, b);
};
};
}
// usage
function sum(a, b) {
return a + b;
}
let curriedSum = curry(sum);
alert( curriedSum(1)(2) ); // 3
당장은 직관적으로 왜 써야 하는지 이해가 가지 않는다.
해당 방법의 장점은 미리 등록해 놓았다가 나중에 변수를 집어 넣는 것을 가능하게 해준다는 것이다.```js function log(timestamp, importance, message) { console.log(timestamp, importance, message) }
const logNow = _.curried(new Date())
logNow(‘BUG’)(‘test msg’) // 날짜 BUG test msg
const InfoLog = logNow(‘INFO’) const bugLog = logNow(‘BUG’)
infoLog(‘info msg’). // 날짜 INFO info msg bugLog(‘bug msg’) // 날짜 BUG bug msg
> 이런 식으로 부품을 조립하듯, 먼저 완성된 데이터들을 집어 넣어놓고 점차 데이터를 넣어 완성하는 방식도 가능하다는 것이다.<br>
> 또한 중간중간 다른 함수들을 끼워 넣는 것도 가능하다는 것으로 보인다.<br>
> 클로저의 방식을 발전시킨 것으로 보는 게 맞는 모양이다.
## 프로토콜 버퍼
> 구글에서 오픈소스로 공개한 언어, 구조화된 데이터를 직렬화 하는 방식이다(protobuf => pb)
> json 방식에 비해 직관적이지 않은 대신 좋은 성능을 가지고 있다.
```js
{
"userName": "Martin",
"favouriteNumber": 1337,
"interests": ["daydreaming", "hacking"]
} // 이건 기존의 json 방식이며, 데이터의 크기는 82 바이트
message Person {
required string user_name = 1;
optional int64 favourite_number = 2;
repeated string interests = 3;
} // 이게 pb 방식이며 데이터를 인코딩하면 33 바이트가 나온다고 한다.
아래는 작동 방식