Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

몽탁이의 개발일기

클로저(Closure) 본문

Javascript 정리

클로저(Closure)

몽탁 2020. 6. 29. 18:38

클로저는 외부 함수 안에 있는 내부 함수가 외부 함수의 지역변수에 접근이 가능한 것이 클로저입니다.

 

function outter(param){

    var i=1;

    return function (){

        alert(i);

        alert(param);

    }

}

 

var inner = outter(2);

inner();

 

결과) 

        경고창 1 출력

        경고창 2 출력

 

클로저는 단순히 내부함수에서 외부 함수의 지역변수에 접근하는 것에 뿐만 아닙니다.

위에 예제를 보면 var inner 변수에 outter를 호출하여 함수를 리턴 후 값으로 저장하게 되는데

밑에서 inner를 호출하면 i와 param의 값을 따로 넣어주지 않아도 호출이 되는 것이 보입니다.

 

클로저는 외부함수를 호출하고 종료 후에도 호출한 시점의 지역변수를 잃지 않고 계속해서 접근이

가능하다는 의미입니다.

 

이런 특성을 사용하게 되면 자바에서의 private 변수를 선언할 수 있습니다.

 

function factory_movie(title){

    return {

         get_title : function() {

                return title;

         },

         set_title : function(_title){

                if(typeof _title === 'String'){

                   title = _title;                  

                }

                else{

                   alert('제목은 문자열이어야 합니다');

                }

 

         }

    }

}

 

ghost = factory_movie('Ghost in the shell');

matrix = factory_movie('Maxtrix');

 

alert(ghost.get_title());

alert(matrix.get_title());

ghost.set_title('공각기동대');

alert(matrix.get_title());

alert(matrix.get_title());

 

결과) 

        Ghost in the shell

        Maxtrix

 

        공각기동대

        Maxtrix

 

 위의 예제는 클로저의 특성을 이용하여 title이라는 데이터의 접근을 get_title과 set_title이라는 메소드를

통해서만 값을 얻거나 수정이 가능하게 되어 있습니다.

 

 그 덕분에 해당 데이터의 조건을 주어서 사용자로부터 원하는 값을 입력시키게 할 수 있으며 title이라는 데이터를

좀 더 안전하게 관리할 수 있게 됩니다.

 

 또 factory_movie라는 객체가 생성되고 title이라는 지역변수는 생성되는 시점에서 저장되기 때문에 ghost와 matrix는

다른 지역변수를 가지고 있고 호출이 끝난 후에도 지역변수는 존재하기 때문에 해당 객체에 대한 지역변수 값을 가져온다거나 수정하는 것이 가능합니다. 이런 것을 객체 지향적인 프로그램이라고 합니다.

'Javascript 정리' 카테고리의 다른 글

arguments 객체  (0) 2020.06.30
클로저 사용시 주의사항  (0) 2020.06.29
자바스크립트에서의 함수  (0) 2020.06.29
유효범위의 대상  (0) 2020.06.26
유효범위 (Scope)  (0) 2020.06.26