728x90
반응형

1. 클로저(Closure)란 무엇인가?

클로저는 JavaScript의 중요한 개념 중 하나로, 함수와 그 함수가 선언된 렉시컬 환경의 조합입니다. 간단히 말해, 클로저는 내부 함수가 외부 함수의 변수에 접근할 수 있게 해주는 기능입니다.

1.1 기본 개념

클로저는 다음과 같은 특징을 가집니다:

  • 함수 내부에 함수를 정의하고 사용
  • 내부 함수가 외부 함수의 변수를 참조
  • 외부 함수가 종료된 후에도 내부 함수가 외부 함수의 변수를 계속 참조 가능

1.2 간단한 예시

function outerFunction(x) {
    let y = 10;
    function innerFunction() {
        console.log(x + y);
    }
    return innerFunction;
}

const closure = outerFunction(5);
closure(); // 출력: 15

이 예시에서 innerFunction은 outerFunction의 변수 x와 y에 접근할 수 있습니다. outerFunction이 실행을 마친 후에도 closure를 통해 innerFunction을 호출하면 여전히 x와 y의 값을 기억하고 있습니다.

 


 

2. 클로저의 장점

2.1 데이터 프라이버시

클로저를 사용하면 private 변수와 유사한 개념을 구현할 수 있습니다. 외부에서 직접 접근할 수 없는 변수를 만들 수 있어 데이터 은닉이 가능합니다.

function createCounter() {
    let count = 0;
    return {
        increment: function() {
            count++;
        },
        getCount: function() {
            return count;
        }
    };
}

const counter = createCounter();
counter.increment();
console.log(counter.getCount()); // 출력: 1
console.log(counter.count); // 출력: undefined

 

2.2 상태 유지

클로저를 사용하면 함수의 상태를 저장하고 유지할 수 있습니다. 이는 함수형 프로그래밍에서 매우 유용합니다.

function createMultiplier(factor) {
    return function(number) {
        return number * factor;
    };
}

const double = createMultiplier(2);
const triple = createMultiplier(3);

console.log(double(5)); // 출력: 10
console.log(triple(5)); // 출력: 15

 


3. 클로저의 단점

3.1 메모리 사용

클로저는 외부 함수의 변수를 계속 참조하기 때문에, 이러한 변수들은 가비지 컬렉션되지 않습니다. 이로 인해 메모리 사용량이 증가할 수 있습니다.

3.2 성능 고려사항

클로저를 과도하게 사용하면 애플리케이션의 성능에 영향을 줄 수 있습니다. 특히 루프 내에서 클로저를 생성할 때 주의가 필요합니다.

function createFunctions() {
    var result = [];
    for (var i = 0; i < 5; i++) {
        result.push(function() { return i; });
    }
    return result;
}

var functions = createFunctions();
for (var i = 0; i < functions.length; i++) {
    console.log(functions[i]()); // 모두 5를 출력
}

이 예시에서 의도와 달리 모든 함수가 5를 반환합니다. 이를 해결하려면 즉시 실행 함수(IIFE)나 let 키워드를 사용해야 합니다.

 


4. 클로저의 실제 활용

4.1 모듈 패턴

클로저를 사용하여 모듈 패턴을 구현할 수 있습니다. 이는 관련 기능을 그룹화하고 네임스페이스를 관리하는 데 유용합니다.

const myModule = (function() {
    let privateVar = 0;

    function privateFunction() {
        console.log('private function');
    }

    return {
        publicVar: 1,
        publicFunction: function() {
            privateVar++;
            privateFunction();
            console.log('public function');
        }
    };
})();

myModule.publicFunction(); // 출력: private function, public function
console.log(myModule.publicVar); // 출력: 1
console.log(myModule.privateVar); // 출력: undefined

4.2 콜백과 이벤트 핸들러

클로저는 비동기 프로그래밍에서 콜백 함수나 이벤트 핸들러를 구현할 때 자주 사용됩니다.

function setupButton(label) {
    let count = 0;
    const button = document.createElement('button');
    button.textContent = label;
    
    button.addEventListener('click', function() {
        count++;
        console.log(`${label} clicked ${count} times`);
    });

    document.body.appendChild(button);
}

setupButton('Click me');

결론

클로저는 JavaScript의 강력하고 유연한 기능 중 하나입니다.

데이터 은닉, 상태 유지, 모듈화 등 다양한 장점을 제공하지만,

메모리 관리와 성능 측면에서 주의가 필요합니다.

 

클로저를 적절히 사용하면 더 깔끔하고 유지보수가 쉬운 코드를 작성할 수 있습니다.

그러나 과도한 사용은 피하고, 필요한 경우에만 신중하게 사용하는 것이 좋습니다.

클로저의 개념을 잘 이해하고 적절히 활용함으로써,

더 효과적이고 강력한 JavaScript 애플리케이션을 개발할 수 있습니다.

728x90
반응형

+ Recent posts