close to closure - 2

Sally·2022년 4월 24일
1

지난 포스팅 에서는 closure가 발생하는 이유를 설명했으니 이번 포스팅에서는 closure의 쓰이는 이유에 대해서 적어 보고자 한다.

Closure를 사용하는 이유는..? 🤔

클로저만의 경우 다른 일반 함수를 구현하는 것 보다 복잡하고 더 깊은 이해가 필요로 된다. 그럼에도 불구하고 클로저를 사용해야 하는 이유는 무엇일까?

바로 상태를 안전하게 변경하고 유지하기 위해서 이다.

이는 정보 은닉이라는, 어떤 모듈의 내부 로직에 대해 외부로의 노출을 최소화해서 모듈간의 결함도를 낮추고 유연성을 높이고자하는 목적에 의해서 필요로 되는 부분이다.

자바스크립트의 경우, 기본적으로 변수 자체에 접근 권환(public, private, protected)를 직접 부여하도록 설계되어 있지 않아 클로저를 통해 정보 은닉을 구현해야 한다.

예시 코드를 보면서 한 번 살펴보자

const outer = function () {
	const a = 1;
    const inner = function() {
    	return ++a;
    }
    return inner;
}
const outer2 = outer();
console.log(outer2());

outer2에는 outer가 반환하는 inner함수가 할당되기 된다.
이로 인해 outer를 호출하지 않았음에도 outer2를 통해서 outer내에 있는 a 변수에 접근할 수 있게 된다.

이는 외부에서 제공하고자 하는 정보를 분류할때에 유용하게 사용된다. outer2는 오직 outer가 리턴하는 정보 inner을 통해서만 정보에 접근 가능하게 된다. return하지 않는 데이터 들에는 접근 조차 불가능하다.

이처럼 return하여 외부에서 접근 가능하게 하는 변수들은 공개 멤버가 되고, return하지 않고 가지고 있는 변수들은 비공개 멤버가 된다.

클로저를 사용할때에 주의해야 할 점

클로저를 활용해 메모리에 저장되는 변수들은 의도적으로 메모리 공간에 남게 한 것이기 때문에 가비지컬렉터가 이들을 수거해가지 않는다.

이 점 덕분에 클로저를 사용할 수 있는 것이지만 반대로 이 부분 때문에, 더 이상 클로저를 사용하지 않음에도 메모리에서 의미없이 공간을 차지하고 있을 수 있다.

그래서 더 이상 필요가 없어진 시점에는 더는 메모리에 차지 되지 않게 처리를 해주어야 한다.

해결 방법은 생각 보다 간단한데, 바로 참조 카운트를 0으로 만들어 주는 것이다.

식별자에 null이나 undefined를 할당하게 되면 참조 카운트가 0으로 되어 가비지컬렉터가 이를 수거해가게 된다.

0개의 댓글