[Js] ํด๋ก์ | ์ธ๋ถํจ์, ๋ด๋ถํจ์
- -
ํด๋น ํฌ์คํ ์ "์ํ์ฝ๋ฉ"์ ์ด๊ณ ์ ๋์ ๊ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฆฐ ๊ฒ์๊ธ ์ ๋๋ค.
์์ ์ ์ธ ์ฉ๋๊ฐ ์๋, ๊ฐ์ธ ๊ณต๋ถ ์ ๋ฆฌ ๋ชฉ์ ์ผ๋ก ์ฌ๋ฆฌ๋ ๊ธ์์ ๋ฏธ๋ฆฌ ์๋ฆฝ๋๋ค.
ํด๋ก์
ํด๋ก์ (closure)๋ ๋ด๋ถํจ์๊ฐ ์ธ๋ถํจ์์ ๋งฅ๋ฝ(context)์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ ๊ฐ๋ฅดํจ๋ค.
ํด๋ก์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํ ๊ณ ๋์ด๋์ ํ ํฌ๋์ ๊ตฌ์ฌํ๋๋ฐ ํ์์ ์ธ ๊ฐ๋ ์ผ๋ก ํ์ฉ๋๋ค.
๋ด๋ถํจ์
์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์ ์์์ ๋ ๋ค๋ฅธ ํจ์๋ฅผ ์ ์ธํ ์ ์๋ค.
์๋์ ์์ ๋ฅผ ๋ณด์. ๊ฒฐ๊ณผ๋ ๊ฒฝ๊ณ ์ฐฝ์ coding everybody๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
<script>
function outter(){
function inner(){
var title = 'coding everybody';
alert(title);
}
inner();
}
outter();
</script>
์ ์์ ์์ inner()๋ ๋ด๋ถํจ์, outter()๋ ์ธ๋ถํจ์์ด๋ค.
์ฆ inner()๋ var inner = function(){} ๊ณผ ๊ฐ์ ์๋ฏธ๋ก, ์ธ๋ถํจ์outter()์ ์ง์ญ๋ณ์๋ผ๊ณ ํ ์ ์๋ค.
์ด๋ ๊ฒ ์ฌ์ฉํ๋ ์ด์ ๋ ํจ์ ๋ด๋ถ์์๋ง ์ฌ์ฉ๋์ผ ํ๋ ํจ์๋ฅผ, ํจ์ ๋ฐ์ ์ ์ธํ๊ฒ ๋๋ฉด ์์ง์ฑ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
๋ด๋ถํจ์๋ ์ธ๋ถํจ์์ ์ง์ญ๋ณ์์ ์ ๊ทผํ ์ ์๋ค.
์๋์ ์์ ๋ฅผ ๋ณด์. ๊ฒฐ๊ณผ๋ coding everybody์ด๋ค.
<script>
function outter(){
var title = 'coding everybody';
function inner(){
alert(title);
}
inner();
}
outter();
</script>
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, title์ด๋ผ๋ ๋ณ์๋ ์ธ๋ถํจ์(outter()ํจ์)์ ์ง์ญ๋ณ์์ด๋ค.
inner()์ฆ ๋ด๋ถํจ์๋ title์ด๋ผ๋ ์ง์ญ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ง๋ง, ์์ ์ ์ธ๋ถํจ์์ธ outter()์ ์ง์ญ๋ณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ title์ด๋ผ๋ ๋ณ์๋ฅผ ์์๋ณด๊ณ , coding everybody๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ๋ด๋ถํจ์์์ ์ธ๋ถํจ์์ ์ง์ญ๋ณ์์ ์ ๊ทผ ํ ์ ์๋ ๊ฒ์ ํด๋ก์ ๋ผ๊ณ ํ๋ค.
์์์ ํด๋ก์ ์ ๊ฐ๋ ์ ์ดํดํ๊ธฐ ์ํด ๋ด๋ถ, ์ธ๋ถ ํจ์์ ๊ฐ๋ ์ ์์๋ณด์๋ค.
ํฅ๋ฏธ๋ก์ด ์ฌ์ค์ ์ธ๋ถํจ์๊ฐ ๋์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ์๋, ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถํจ์์ ์ ๊ทผํ ์ ์๋ค๋ ์ ์ด๋ค.
ํด๋ก์
ํด๋ก์ (closure)๋ ๋ด๋ถํจ์์ ๋ฐ์ ํ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฃผ์ ๋ค. ๋ด๋ถํจ์๋ ์ธ๋ถํจ์์ ์ง์ญ๋ณ์์ ์ ๊ทผ ํ ์ ์๋๋ฐ ์ธ๋ถํจ์์ ์คํ์ด ๋๋์ ์ธ๋ถํจ์๊ฐ ์๋ฉธ๋ ์ดํ์๋ ๋ด๋ถํจ์๊ฐ ์ธ๋ถํจ์์ ๋ณ์์ ์ ๊ทผ ํ ์ ์๋ค. ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ํด๋ก์ ๋ผ๊ณ ํ๋ค.
์๋ ์์ ๋ ์ด์ ์ ์์ ๋ฅผ ์กฐ๊ธ ๋ณํํ ๊ฒ์ด๋ค.
<script>
function outter(){ // ์ธ๋ถํจ์
var title = 'coding everybody';
return function(){// ๋ด๋ถํจ์
alert(title);
}
}
inner = outter();//๋ด๋ถํจ์๋ฅผ inner์ ๋ฃ์
inner();
</script>
/*
returnํ๋ค๋ ๊ฒ์ ํจ์๊ฐ ์ข
๋ฃ ๋์๋ค๋ ๋ป์ด๋ค.
ํ์ง๋ง inner๋ฅผ ํธ์ถํ ์๊ฐ, outterํจ์๊ฐ ์ด๋ฏธ ์ข
๋ฃ๋์์์๋ ๋ถ๊ตฌํ๊ณ , ์ธ๋ถํจ์์์ ํ์๋ ๋ด๋ถ ํจ์์์
์ธ๋ถํจ์๋ก ์ ๊ทผ์ ์๋ํ๊ณ ์๊ณ , ์ด ์ ๊ทผ์ด ์ด๋ฃจ์ด์ก๋ค๋ ๊ฒ์ด๋ค.
*/
๊ฒฐ๊ณผ๋ ๊ฒฝ๊ณ ์ฐฝ์ผ๋ก coding everybody๋ฅผ ์ถ๋ ฅํ ๊ฒ์ด๋ค.
์์ ์ ์คํ์์๋ฅผ ์ฃผ์๊น๊ฒ ์ดํด๋ณด์. 8ํ์์ ํจ์ outter๋ฅผ ํธ์ถํ๊ณ ์๋ค. ๊ทธ ๊ฒฐ๊ณผ๊ฐ ๋ณ์ inner์ ๋ด๊ธด๋ค.
๊ฒฐ๊ณผ๋ ์ด๋ฆ์ด ์๋ ํจ์๋ค. ์คํ์ด 9ํ์ผ๋ก ๋์ด์ค๋ฉด outter ํจ์๋ ์คํ์ด ๋๋ฌ๊ธฐ ๋๋ฌธ์ ์ด ํจ์์ ์ง์ญ๋ณ์๋ ์๋ฉธ๋๋ ๊ฒ์ด ์์ฐ์ค๋ฝ๋ค. ํ์ง๋ง 9ํ์์ ํจ์ inner๋ฅผ ์คํํ์ ๋ coding everybody๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ ์ธ๋ถํจ์์ ์ง์ญ๋ณ์ title์ด ์๋ฉธ๋์ง ์์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
ํด๋ก์ ๋ ๋ด๋ถํจ์๊ฐ ์ธ๋ถํจ์์ ์ง์ญ๋ณ์์ ์ ๊ทผ ํ ์ ์๊ณ , ์ธ๋ถํจ์๋ ์ธ๋ถํจ์์ ์ง์ญ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ด๋ถํจ์๊ฐ ์๋ฉธ๋ ๋๊น์ง ์๋ฉธ๋์ง ์๋ ํน์ฑ์ ์๋ฏธํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฌํ ๊ธฐ๋ฅ ์ฆ 'ํด๋ก์ '๋ ๋๋์ฒด ์ด๋ ๊ณณ์์ ์ฌ์ฉ๋๋ ๊ฒ์ผ๊น?
์ด์ ์ ๋ฏธ๋ฆฌ ์์์ผ ํ ๊ฒ์, ํ๋ผ์ด๋น ๋ณ์(private variable : ๋น๋ฐ ๋ณ์)๋ผ๋ ๊ฒ์ธ๋ฐ, ์ด ๋ณ์๋ ์ํํธ์จ์ด๊ฐ ์ปค์ง๋ ๊ณผ์ ์์ ์ด๋ ํ ์ ๋ณด๊ฐ ์์ ๋, ์ด ์ ๋ณด๋ฅผ ์๋ฌด๋ ์์ ํ์ง ๋ชปํ๋๋ก ์์ ๋ฐฉ์ง๋ฅผ ํ๋ ๋ณ์์ด๋ค.
ํด๋ก์ ์ ๊ธฐ๋ฅ์ ์์๋ณด๊ธฐ ์ํด์กฐ๊ธ ๋ ๋ณต์กํ ์๋ ์์ ๋ฅผ ์ดํด๋ณด์.
<!DOCTYPE html>
<html>
<head>
<title>haha</title>
</head>
<body>
<script type="text/javascript">
function factory_movie(title){//์ธ๋ถํจ์
return {//return ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ค.
get_title : function () {//๊ฐ์ฒด ์์ ์๋ ํจ์, ์ฆ ๋ฉ์๋๋ผ๊ณ ํ๋ค.
//์์์ด ๊ฐ์ฒด์ผ๋ฟ, ๋ด๋ถํจ์ ์ด๋ฏ๋ก ์ธ๋ถํจ์์ ์ง์ญ๋ณ์ ์ ๊ทผ ok
return title;
},
set_title : function(_title){
title = _title
}
}
}
ghost = factory_movie('Ghost in the shell'); //return๋ค ๊ฐ์ฒด๊ฐ ๋ชจ๋ ๋ค์ด๊ฐ๋ ๊ฒ.
matrix =factory_movie('Matrix')
//์ฆ factory_movie๋ฅผ ํตํด ์์ ghost,matrix๋ผ๋ ๋๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๊ฒ.
alert(ghost.get_title()); //์ฌ๊ธฐ์๋ Ghost in the shell์ถ๋ ฅ
alert(matrix.get_title()); // ์ฌ๊ธฐ์๋ Matrix์ถ๋ ฅ
ghost.set_title('๊ฐ ๋ฐ๊พธ๊ธฐ');//ghost๊ฐ์ฒด์ ๊ฐ์ด "๊ฐ ๋ฐ๊พธ๊ธฐ"๋ก ๋ฐ๋
alert(ghost.get_title()); //๋ฐ๋ ๊ฐ์ธ '๊ฐ ๋ฐ๊พธ๊ธฐ'์ถ๋ ฅ
alert(matrix.get_title());//์๋ ๊ฐ์ธ Matrix์ถ๋ ฅ
</script>
</body>
</html>
์๋ ์์ ๋ ํด๋ก์ ๋ฅผ ์ด์ฉํด์ ์ํ์ ์ ๋ชฉ์ ์ ์ฅํ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ์ ์ํ๊ณ ์๋ค.
์คํ๊ฒฐ๊ณผ๋ Ghost in the shell -> Matrix -> ๊ฐ ๋ฐ๊พธ๊ธฐ -> Matrix ์ด๋ค.
์์ ์์ ๋ฅผ ํตํด์ ์ ์ ์๋ ๊ฒ๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
1. ํด๋ก์ ๋ ๊ฐ์ฒด์ ๋ฉ์๋์์๋ ์ฌ์ฉํ ์ ์๋ค.
์์ ์์ ๋ ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ ์๋ค. ์ด ๊ฐ์ฒด๋ ๋ฉ์๋ get_title๊ณผ set_title์ ๊ฐ์ง๊ณ ์๋ค.
์ด ๋ฉ์๋๋ค์ ์ธ๋ถํจ์์ธ factory_movie์ ์ธ์ ๊ฐ์ผ๋ก ์ ๋ฌ๋ ์ง์ญ๋ณ์ title์ ์ฌ์ฉํ๊ณ ์๋ค.
2. ๋์ผํ ์ธ๋ถํจ์ ์์์ ๋ง๋ค์ด์ง ๋ด๋ถํจ์๋ ๋ฉ์๋๋ ์ธ๋ถํจ์์ ์ง์ญ๋ณ์๋ฅผ ๊ณต์ ํ๋ค.
26ํ์์ ์คํ๋ set_title์ ์ธ๋ถํจ์ factory_movie์ ์ง์ญ๋ณ์ title์ ๊ฐ์ '๊ฐ ๋ฐ๊พธ๊ธฐ'๋ก ๋ณ๊ฒฝํ๋ค.
28ํ์์ ghost.get_title();์ ๊ฐ์ด '๊ณต๊ฐ๊ธฐ๋๋'์ธ ๊ฒ์ set_title์ get_title ํจ์๊ฐ title์ ๊ฐ์ ๊ณต์ ํ๊ณ ์๋ค๋ ์๋ฏธ๋ค.
3. ๊ทธ๋ฐ๋ฐ ๋๊ฐ์ ์ธ๋ถํจ์ factory_movie๋ฅผ ๊ณต์ ํ๊ณ ์๋ ghost์ matrix์ get_title์ ๊ฒฐ๊ณผ๋ ์๋ก ๊ฐ๊ฐ ๋ค๋ฅด๋ค.
๊ทธ๊ฒ์ ์ธ๋ถํจ์๊ฐ ์คํ๋ ๋๋ง๋ค ์๋ก์ด ์ง์ญ๋ณ์๋ฅผ ํฌํจํ๋ ํด๋ก์ ๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ghost์ matrix๋ ์๋ก ์์ ํ ๋ ๋ฆฝ๋ ๊ฐ์ฒด๊ฐ ๋๋ค.
4. factory_movie์ ์ง์ญ๋ณ์ title์ 9ํ์์ ์ ์๋ ๊ฐ์ฒด์ ๋ฉ์๋์์๋ง ์ ๊ทผ ํ ์ ์๋ ๊ฐ์ด๋ค.
์ด ๋ง์ title์ ๊ฐ์ ์ฝ๊ณ ์์ ํ ์ ์๋ ๊ฒ์ factory_movie ๋ฉ์๋๋ฅผ ํตํด์ ๋ง๋ค์ด์ง ๊ฐ์ฒด ๋ฟ์ด๋ผ๋ ์๋ฏธ๋ค. JavaScript๋ ๊ธฐ๋ณธ์ ์ผ๋ก Privateํ ์์ฑ์ ์ง์ํ์ง ์๋๋ฐ, ํด๋ก์ ์ ์ด๋ฌํ ํน์ฑ์ ์ด์ฉํด์ Privateํ ์์ฑ์ ์ฌ์ฉํ ์ ์๊ฒ๋๋ค.
ํด๋ก์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํ๋ผ์ด๋น ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์์ฃผ ์ข์ ๋ฉ์นด๋์ฆ์ด๋ค.
์ ์์๋ก๋ง ๋ดค์ ๋, title์ด๋ผ๋ ๋ณ์์ ๊ฐ์ ๋น๋ฐ๋ณ์๋ก ์จ๊ฒจ๋๊ณ , ์ด ๋ณ์๋ฅผ ์์ ํ ๋๋ set_title๋ก๋ง ๊ฐ๋ฅํ๊ฒ ํ๊ณ ,
get_title๋ก๋ง ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํ๋ค๋ฉด ํจ์ฌ ๋ ์์ ํด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐธ๊ณ
Private ์์ฑ์ ๊ฐ์ฒด์ ์ธ๋ถ์์๋ ์ ๊ทผ ํ ์ ์๋ ์ธ๋ถ์ ๊ฐ์ถฐ์ง ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์๋ฏธํ๋ค.์ด๋ฅผ ํตํด์ ๊ฐ์ฒด์ ๋ด๋ถ์์๋ง ์ฌ์ฉํด์ผ ํ๋ ๊ฐ์ด ๋ ธ์ถ๋จ์ผ๋ก์ ์๊ธธ ์ ์๋ ์ค๋ฅ๋ฅผ ์ค์ผ ์ ์๋ค.
์๋ฐ์ ๊ฐ์ ์ธ์ด์์๋ ์ด๋ฌํ ํน์ฑ์ ์ธ์ด ๋ฌธ๋ฒ ์ฐจ์์์ ์ง์ํ๊ณ ์๋ค.
์๋์ ์์ ๋ ํด๋ก์ ์ ๊ด๋ จํด์ ์์ฃผ ์ธ๊ธ๋๋ ์์ ๋ค.
ํด๋ก์ ๋ฅผ ์ฌ์ฉํ ๋, ๊ฐ์ฅ ๋ง์ด ์ผ์ด๋๋ ์ค์์ด๋ค.
<!DOCTYPE html>
<html>
<head>
<title>ํด๋ก์ </title>
</head>
<body>
<script type="text/javascript">
var arr = [];
for(var i =0; i <5; i++){
arr[i] = function(){//ํจ์๋ i์ ๊ฐ์ ์ ์ ์๋ค.
return i;
}
}
for(var index in arr){
console.log(arr[index]());
}
</script>
</body>
</html>
ํจ์๊ฐ ํจ์ ์ธ๋ถ์ ์ปจํ ์คํธ์ ์ ๊ทผํ ์ ์์ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๊ฒ ์ง๋ง ์์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
5
5
5
5
5
์ด๋ ๊ฒ ๋๋ ์ด์ ๋ arr[i]์ ๋ค์ด๊ฐ๋ ํจ์๊ฐ i๋ผ๋ ๊ฐ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ฌธ์ arr[i]์๋ ์ ์ญ๋ณ์ i์ ๊ฐ์ด ๋ค์ด๊ฐ ์๊ณ ,
์ ์ญ๋ณ์ i๋ for๋ฌธ์ ํตํด ํด๋นํ๋ ๊ฐ์ด ์์๊ธฐ ๋๋ฌธ์ 4๋ฅผ ๋๋ ค์ค ํ i ++ ์ฆ ๋ณ์ i์์ ์ 5๊ฐ ๋์ด์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ arr์์ ๋ค์ด๊ฐ ์๋ ๊ฐ์ 5์ด๋ค. for๋ฌธ์ด ์๋ฏธ๊ฐ ์์ด์ง ๊ฒ์ด๋ค.
์์ ์ฝ๋๋ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํด์ผ ํ๋ค.
<!DOCTYPE html>
<html>
<head>
<title>ํด๋ก์ </title>
</head>
<body>
<script type="text/javascript">
var arr = [];
for(var i =0; i <5; i++){
arr[i] = function(id){
return function(){
return id;//์ธ๋ถํจ์์ id๋ฅผ ์ฐธ์กฐ, ๊ฐ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํด์ง.(id=i์.)
}
}(i);
}
for(var index in arr){
console.log(arr[index]());
}
</script>
</body>
</html>
์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ, ๋ด๋ถํจ์์์ ์ธ๋ถ ํจ์ i ๊ฐ์ id๋ผ๋ ๊ฐ์ผ๋ก ์ฐธ์กฐ ํ ์๊ฐ ์์ด์ arr[]์์ ์์๋๋ก ๊ฐ์ด ๋ค์ด๊ฐ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
'Languages > Java Script' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
-
[Js] ํจ์์ ํธ์ถ | ์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ํธ์ถ | apply 2021.02.04
-
[Js] arguments | ๋ฐฐ์ด | javascript ๋ฐฐ์ด | ๋งค๊ฐ๋ณ์ 2021.02.04
-
[Js] ๊ฐ์ผ๋ก์์ ํจ์์ ์ฝ๋ฐฑ | ์ฝ๋ฐฑ | ๋น๋๊ธฐ ์ฒ๋ฆฌ 2021.02.04
-
[Js] ํจ์์งํฅ | javascript ํจ์ | ์ ํจ๋ฒ์ | ์ง์ญ๋ณ์ ์ ์ญ๋ณ์ 2021.02.04
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค