°ÁÂ Àü ÇÊÀÚÀÇ Àâ´ã>
À̹ø °Á´ Å¿À´å³Ý¿¡¼ Ȱµ¿ ÁßÀÎ Micosoft MVP ÀÎ Á¤¼®¸ð´ÔÀÇ °ÁÂÀÔ´Ï´Ù.
Á¤¼®¸ð´ÔÀº ÃÖ±Ù Ajax Design Patterns¶õ Ã¥À» ¹ø¿ªÇÏ¿© Ãâ°£Çϱ⵵ Çϼ̱¸¿ä.
Å¿À »çÀÌÆ®ÀÇ Talk °Ô½ÃÆÇ ½Ã»ðÀ̱⵵ ÇϽʴϴÙ.
ƯÀ¯ÀÇ °³±×ÀûÀÎ ¹®Ã¼°¡ ƯÇãÃâ¿ø ÁßÀÎ ÀÌ Ä£±¸ÀÇ Àç¹Ì³ °Á¿¡ Çѹø ºüÁ®º¸¼¼¿ä~
ÀÌ °ÁÂÀÇ ¼ø¼
°´Ã¼ÁöÇâ ÀÚ¹Ù½ºÅ©¸³Æ® ÇÁ·Î±×·¡¹Ö
°Á ½ÃÀÛ Àü 1ºÐ ½ºÇÇÄ¡
¸Å¿ì ¾È³çÇϽʴϴÙ! È÷µùÅ© ÀÔ´Ï´Ù!
JS OOP °Á 3ÆíÀ» ±â´Ù·ÁÁֽŠ5õ800¿©¸í(ÀÚüÃßÁ¤)ÀÇ °³¹ßÀÚ ºÐµé²² ½É½ÉÇÑ Ä¯»çÀÇ ¸»¾¸À» µå¸³´Ï´Ù.
´©±º°¡°¡ ¿©·¯ºÐ²² "°´Ã¼(Object)¶õ ¹«¾ùÀԴϱî?"¶ó°í Áú¹®À» Çß½À´Ï´Ù.
¸Å¿ì ±âÃÊÀûÀÎ Áú¹®ÀÌ¸ç °£ º¸´Â Áú¹®ÀÌÁö¸¸ ¿©·¯ºÐÀº È®½ÇÇÏ°Ô ´ë´äÀ» ÇØ¾ß ÇÕ´Ï´Ù. ÀúÀÇ °Á¸¦ ÀÐÀ¸½Å ¿©·¯ºÐÀº ÀÌ¹Ì °´Ã¼¿Í Ä£±¸´Ï±î¿ä!
ÀÌ·¸°Ô ´ë´ä ÇØ ÁÖ¼¼¿ä. "°´Ã¼´Â Unique Identyty(À̸§), State(¾îÆ®¸®ºäÆ®), Behavior(¸Þ¼µå)¸¦ °¡Áø »ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀÔ´Ï´Ù." ¹ßÀ½µµ ÀûÀýÇÏ°Ô ±¼·Á ÁÖ¼¼¿ä.
Áú¹®À» ´øÁø »ó´ë¹æÀº ÀÌ·¸°Ô ¸»ÇØÁÙ °Ì´Ï´Ù. "¿ì¿Õ¤»±»¤»"
¶Ç ÇѰ¡Áö! "Object"ÀÇ ¹ßÀ½Àº "¾Æ¾ÐÁ÷Æ®"ÀÔ´Ï´Ù. Ȥ½Ã ¿Ü±¹Àΰú ´ëÈ ÇÒ ÀÏ ÀÖÀ¸¸é "¿ÀºêÁ§Æ®"¶ó°í ÇÏÁö ¸¶¼¼¿ä. ¸ø ¾Ë¾Æ µéÀ» °¡´É¼ºÀÌ ÀÖ½À´Ï´Ù. ^^
ÀÚ ±×·³ °Á ½ÃÀÛ ÇϰڽÀ´Ï´Ù!
»ç¿ëÀÚ Á¤ÀÇ °´Ã¼¸¦ ¸¸µé¾î º¸ÀÚ±¸¿ä!
ÀÚ ÀÌÁ¦ ³ª¸¸ÀÇ »ç¿ëÀÚ Á¤ÀÇ °´Ã¼¸¦ ¸¸µé¾î º¸°Ú½À´Ï´Ù! Áغñ¹°Àº ÅØ½ºÆ® ÆíÁý±â¿Í °Åµé ¼ö ÀÖ´Â ¿Þ¼ÕÀÔ´Ï´Ù. ÀÏ´Ü ¼Ò½ººÎÅÍ º¸½Ã°Ú½À´Ï´Ù.
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 32 33 34 35 36 37 | function myClass( p )
{
this.Comment = "³ª´Â »ç¿ëÀÚ Á¤ÀÇ °´Ã¼ÀÔ´Ï´Ù.";
this.v1 = p;
v2 = "ÅÚ¹ÌÅÚ¹Ì";
}
function myClass_toString()
{
return "v1=" + this.v1;
}
function myClass_setValue( p )
{
this.v2 = p;
}
function myClass_getValue()
{
return this.v2;
}
myClass.prototype.toString = myClass_toString;
myClass.prototype.setValue = myClass_setValue;
myClass.prototype.getValue = myClass_getValue;
myClass.prototype.resetValue = function(){ this.v1 = null; this.v2 = null; }
var o = new myClass( "1" ); //ÀνºÅϽº¾ß »ý°Ü¶ó! »Ð!
alert(o.Comment); //³ª´Â »ç¿ëÀÚ Á¤ÀÇ °´Ã¼ÀÔ´Ï´Ù.
alert(o.v1); //1
alert(o.v2); //undefined
alert(o); //v1=1
o.resetValue();
alert(o); //v1=null
o.setValue("I am Private");
alert(o.getValue()); //I am Private |
EBS¿¡¼ ±×¸²À» ±×¸®½Ã´ø ¹ä ¾ÆÀú¾¾°¡ ¸»¾¸ ÇϽʴϴÙ. "Âü ½±ÁÒ?"
¿ì¸®´Â ¿©±â¼ ÇÑ °¡Áö Áß¿äÇÑ »ç½ÇÀ» ´«Ä¡ ç ¼ö ÀÖ½À´Ï´Ù. "¿ÀÀ×? functionÀº ÇÔ¼öÀÏ »ÓÀε¥ °´Ã¼¸¦ ¼±¾ðÇÒ ¶§ ¾²ÀÏ ¼ö ÀÖ¾î??"
±×·¸½À´Ï´Ù! ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼´Â ÇÔ¼öµµ °´Ã¼ ÀÔ´Ï´Ù!
ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼´Â ÇÔ¼ö(function)µµ °´Ã¼·Î Ãë±ÞµÇ¸ç, ¾îÆ®¸®ºäÆ®¿Í ¸Þ¼µå ¶ÇÇÑ Á¸Àç ÇÕ´Ï´Ù. ÇÔ¼ö°¡ °´Ã¼·Î Ãë±ÞµÇ´Ï ´ç¿¬È÷ ÇÔ¼öÀÇ ÀνºÅϽºµµ »Ð ÇÏ°í »ý±â°ÚÁÒ. ÀÌ´Â ÀÚ¹Ù½ºÅ©¸³Æ®°¡ ´Ù¸¥ ¾ð¾î¿Í ´Ù¸¥ Á¡ Áß ÇѰ¡Áö ÀÔ´Ï´Ù(´Ù¸¥ ¾ð¾î¿¡¼ ÇÔ¼ö´Â À̸§ ±×´ë·Î ÇÔ¼öÀÏ »ÓÀÔ´Ï´Ù). ´öºÐ¿¡ class Ű¿öµå ¾øÀ̵µ °´Ã¼¸¦ ½±°Ô Á¤ÀÇ ÇÒ ¼ö ÀÖ½À´Ï´Ù. (´ÙÀ½¿¡ ±âȸ°¡ µÇ¸é ÇÔ¼ö¿Í ±×¿¡ µû¸£´Â À̽´µé¿¡ ´ëÇØ¼ Á¤¸®¸¦ ÇØ µå¸®°Ú½À´Ï´Ù.)
ÀÚ ±×·³ Á¦°¡ ¶Ç ¹«½¼ ÁþÀ» ¹ú¿´´ÂÁö¸¦ Â÷±ÙÂ÷±Ù ¾Ë¾Æ º¾½Ã´Ù!
1 2 3 4 5 6 | function myClass( p )
{
this.Comment = "³ª´Â »ç¿ëÀÚ Á¤ÀÇ °´Ã¼ÀÔ´Ï´Ù.";
this.v1 = p;
v2 = "ÅÚ¹ÌÅÚ¹Ì";
}
|
µåµð¾î ¿ì¸®ÀÇ Ã¹ »ç¿ëÀÚ Á¤ÀÇ °´Ã¼¸¦ ¼±¾ðÇÏ´Â ¼ø°£ÀÔ´Ï´Ù. ¿ì¸®°¡ ¸¸µç °´Ã¼ÀÇ À̸§Àº "myClass" ÀÔ´Ï´Ù. ¾îÆ®¸®ºäÆ®´Â ¼¼ °³(Comment, v1, v2) ÀÔ´Ï´Ù. ¸Þ¼µå´Â ¾ÆÁ÷ ¾ø½À´Ï´Ù¸¸ ¿ì¸®ÀÇ Ä£±¸ÀÎ prototypeÀÌ È®ÀåÀ» µµ¿Í ÁÙ °Ì´Ï´Ù.
±×·±µ¥ ¹«¾ð°¡ ´«¿¡ ¶ç´Â °ÍÀÌ ¼¼ °¡Áö ÀÖÁÒ?
ù ¹øÂ°, ÇÔ¼ö ¼±¾ð¿¡ ÀÎÀÚ°¡ ÀÖ´Ù! ÇÔ¼öÀÌÀÚ °´Ã¼ÀÎ myClassÀÇ ¼±¾ðÀº Constructor(»ý¼ºÀÚ)ÀÇ ¿ªÇÒÀ» ´ã´çÇϰí ÀÖ½À´Ï´Ù. ¿ì¸®°¡ ¾Ë°í ÀÖ´Â »ý¼ºÀÚÀÇ ¿ªÇÒÀº "¾îÆ®¸®ºäÆ® ÃʱâÈ Çϱâ"¿Í "¸Þ¸ð¸®¿¡ ³» ÀνºÅϽº ÀûÀçÇϱâ" ÀÔ´Ï´Ù. µû¶ó¼, myClass »ý¼ºÀÚ´Â ¿ì¸®°¡ ±â´ëÇß´ø ¿ªÇÒµéÀ» ¼º½ÇÇÏ°Ô ¼öÇàÇÕ´Ï´Ù.
µÎ ¹øÂ°, this Ű¿öµå! this´Â ÀÚ±â ÀÚ½ÅÀ» ÂüÁ¶Çϴ Ű¿öµå ÀÔ´Ï´Ù.
¼¼ ¹øÂ°, ¿Ö v2¿¡´Â this Ű¿öµå¸¦ ¾²Áö ¾Ê¾Ò½À´Ï±î? OO(Object Oriented)ÀÇ Æ¯Â¡ Áß ÇѰ¡Áö°¡ ÀºÆó(Encapsulation)ÀÔ´Ï´Ù. ´«Ä¡ ä¼Ì³ª¿ä? this°¡ ÀÖ°í ¾ø°íÀÇ Â÷ÀÌ´Â Public°ú PrivateÀÇ ±¸ºÐÀÔ´Ï´Ù(¿ä°Å ¾ÆÁÖ Áß¿ä ÇÕ´Ï´Ù). this Ű¿öµå¸¦ »ç¿ëÇÏ¿© ¾îÆ®¸®ºäÆ®³ª ¸Þ¼µå¸¦ ¼±¾ðÇϸé Public ¼±¾ðÀ̸ç, this Ű¿öµå¸¦ »ç¿ëÇÏÁö ¾Ê°í ¾îÆ®¸®ºäÆ®³ª ¸Þ¼µå¸¦ ¼±¾ðÇϸé Private ¼±¾ðÀÔ´Ï´Ù. ÀÌ °ÍÀ» ½ÇÁ¦·Î »ç¿ëÇÒ ¶§¿¡´Â ½ÅÁßÇÏ°Ô »ç¿ëÇØ¾ß ÇÕ´Ï´Ù. ¸¸¾à Private·Î ¼±¾ðÇÑ ¾îÆ®¸®ºäÆ®¸¦ ¿ÜºÎ¿¡¼ Á÷Á¢ ÂüÁ¶ÇϰíÀÚ ÇÑ´Ù¸é "undefined"°¡ ¹ÝȯµÇ±â ¶§¹®¿¡ ±â´ëÇÏÁö ¸ø Çß´ø ¿À·ù°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¸ç, ±èºÎÀå´Ô¿¡°Ô È¥³¯ ¼ö ÀÖ½À´Ï´Ù. ¿ì¸®´Â ÀûÀýÇÑ setter¿Í getter¸¦ ¸¸µé¾î ¼ ±â´ëÇÏÁö ¸øÇß´ø ¿À·ù¸¦ ÁÙÀÏ ¼ö ÀÖ½À´Ï´Ù.
ÀÚ ÀÌÁ¦ °´Ã¼¿¡ »ìÀ» ºÙ¿© º¼ Â÷·ÊÁÒ? ´Ù °°ÀÌ ¿ÜÃÄ º¾½Ã´Ù. Help me~ My friend, prototype!
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | function myClass_toString()
{
return "v1=" + this.v1;
}
function myClass_setValue( p )
{
this.v2 = p;
}
function myClass_getValue()
{
return this.v2;
}
myClass.prototype.toString = myClass_toString;
myClass.prototype.setValue = myClass_setValue;
myClass.prototype.getValue = myClass_getValue;
myClass.prototype.resetValue = function(){ this.v1 = null; this.v2 = null; }
|
¼¾½º°¡ Ãæ¸¸ÇϽŠ¿©·¯ºÐµéÀº ¸ðµÎ ´«Ä¡ ä¼ÌÁÒ? ¿ì¸®ÀÇ ¼ÒÁßÇÑ Ä£±¸ÀÎ PrototypeÀÇ µµ¿òÀ¸·Î ¼¼ °³ÀÇ »õ·Î¿î ¸Þ¼µå( setValue, getValue, resetValue )¸¦ È®Àå ÇßÀ¸¸ç ÇÑ °³ÀÇ ¸Þ¼µå( toString )À» ¿À¹ö¶óÀ̵ù(Overriding) Çß½À´Ï´Ù. ´«½ä¹Ì°¡ ÀÖÀ¸½Å ºÐµéÀº ÀÌ·¸°Ô Áú¹®À» ´øÁö½Ç °Ì´Ï´Ù.
"¿Ö 'resetValue' ¸Þ¼µåÀÇ È®ÀåÀº ´Ù¸¥ ¼¼ °³ÀÇ ¼±¾ð°ú Ʋ¸®ÁÒ?"
°á·ÐºÎÅÍ ¸»ÇÏÀÚ¸é, myClass_toString, myClass_setValue, myClass_getValueó·³ ÇÔ¼öÀÇ ½Äº°ÀÚ(À̸§)À¸·Î ÇÒ´çÀ» ÇÏ´Â °æ¿ì´Â "ÇÔ¼ö Æ÷ÀÎÅÍ(Pointer)"¸¦ ÇÒ´çÇÏ´Â °æ¿ìÀ̸ç, resetValue´Â ÇÔ¼ö ¸®ÅÍ·²À» »ç¿ëÇÏ¿© ÇÔ¼ö¸¦ ÇÒ´çÇѰÍÀÔ´Ï´Ù. ÀÌ ¶§ ¿ø´õ°É½ºÀÇ ¾È¼ÒÈñ ¾¾°¡ ¸Å¿ì ±Ã±ÝÇϴٴ ǥÁ¤À¸·Î Áú¹®À» ´øÁý´Ï´Ù. ¾ÆÈï~
"¿Éºü! ÇÔ¼ö Æ÷ÀÎÅͰ¡ ¹¹¿¹¿ë? ÅÚ¹Ì ÅÚ¹Ì Å×Å×Å×Å×ÅÚ¹Ì"
¿ì¸®ÀÇ ¶Ç ´Ù¸¥ Ä£±¸ÀÎ ÀÚ¹Ù½ºÅ©¸³Æ® ¿£ÁøÀº ÀÚ¹Ù½ºÅ©¸³Æ® Äڵ带 ½ÇÇàÇϱâ Àü¿¡ Äڵ带 ¹Ì¸® ÆÄ½ÌÇØ¼ °´Ã¼ÀÇ ÀνºÅϽº¸¦ ¸Þ¸ð¸®Á¦ ÀûÀç ½ÃÄÑ ³õ½À´Ï´Ù. ÀÌ ¶§, ÇÔ¼öÀÇ ÀνºÅϽºµµ ¸Þ¸ð¸®¿¡ ÀûÀç ½Ãŵ´Ï´Ù(ÇÔ¼öµµ °´Ã¼·Î Ãë±ÞµÇ±â ¶§¹®ÀÌÁÒ). °á±¹, ÇÔ¼öÀÇ ½Äº°ÀÚ¸¦ ÀÌ¿ëÇÑ ÇÒ´çÀº ½ÇÇà ½ÃÁ¡¿¡ "ÇÔ¼ö Æ÷ÀÎÅÍ(Pointer)"°¡ °¡¸®Å°°í ÀÖ´Â ÇÔ¼öÀÇ ³»¿ëÀ» º¹»çÇØ¼ °´Ã¼¿¡ ³¢¿ö ³Ö´Â °ÍÀÔ´Ï´Ù.
ÇÔ¼ö Æ÷ÀÎÅ͸¦ »ç¿ëÇÏÁö ¾ÊÀº resetValue ¸Þ¼µåÀÇ È®ÀåÀº ÇÔ¼ö ¸®ÅÍ·²(literal)À» »ç¿ëÇÑ È®ÀåÀÔ´Ï´Ù. Áï, ÇÔ¼öÀÇ ³»¿ëÀ» Á÷Á¢ ÇÒ´çÇÏ´Â °ÍÀÔ´Ï´Ù.
ÀÚ~ Áö±Ý±îÁö myClass¶ó´Â À̸§À» °¡Áø °´Ã¼¸¦ ¼³°è ÇßÀ¸´Ï ÀνºÅϽº¸¦ ¸¸µé¾î¼ »ç¿ë ÇØ º¾½Ã´Ù.
28 | var o = new myClass( "1" ); //ÀνºÅϽº¾ß »ý°Ü¶ó! »Ð! |
new Ű¿öµå¸¦ »ç¿ëÇØ¼ °´Ã¼ÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÑ ´ÙÀ½ "o"¶ó´Â º¯¼ö(°´Ã¼º¯¼ö)¿¡ ÇÒ´ç Çß½À´Ï´Ù. ÀÌ·± ÄÚµå´Â ´Ù¸¥ ¾ð¾î¿¡¼´Â »ó»óÁ¶Â÷ ÇÒ ¼ö ¾ø´Â ÄÚµå ÀÌ¸ç °¡Â÷¾øÀÌ ¿¡·¯¸¦ »Ð ÇÏ°í ¶ç¿ó´Ï´Ù. ¿ø·¡´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðÀ» ÇØ¾ß ÇÏÁö¸¸,
myClass o = new myClass( "1" );
ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ °ü´ëÇÔ ´öºÐ¿¡ µ¥ÀÌÅÍ Å¸ÀÔÀ» ¸í½Ã ÇÏÁö ¾Ê¾Æµµ µË´Ï´Ù(¾Æ´Ï, Çϰí½Í¾îµµ ÇÒ ¼ö°¡ ¾ø½À´Ï´Ù. ¤Ì¤Ì)
30 31 32 33 | alert(o.Comment); //³ª´Â »ç¿ëÀÚ Á¤ÀÇ °´Ã¼ÀÔ´Ï´Ù.
alert(o.v1); //1
alert(o.v2); //undefined
alert(o); //v1=1 |
À§ÀÇ ÄÚµå´Â Á¢±ÙÀÚ ÂÀ(.)À» »ç¿ëÇØ¼ ¸Þ¼µåÀÇ ¾îÆ®¸®ºäÆ®¸¦ °æ°í â¿¡ »Ð~ Çϰí Ãâ·Â ÇÏ´Â ÄÚµå ÀÔ´Ï´Ù. À§ÀÇ Äڵ忡¼ ´« ¿©°Ü º¸¾Æ¾ß ÇÒ ¶óÀÎÀº 32 ¶óÀΰú 33 ¶óÀÎÀÔ´Ï´Ù.
±× Àü¿¡! alert()¿¡ ´ëÇØ ¾à°£ÀÇ Å½±¸¸¦ ÇØ º¸°Ú½À´Ï´Ù. ¿ì¸®°¡ ¸Å¿ì¸Å¿ì ÀÚÁÖÀÚÁÖ »ç¿ëÇß¾ú´ø Àü¿ª ÇÔ¼ö alert()´Â ÀÎÀÚ·Î Á¦°øµÇ´Â °´Ã¼ÀÇ ¹®ÀÚ¿ Ç¥ÇöÀÎ toString()À» È£Ãâ ÇÕ´Ï´Ù. ÀÎÀÚ·Î °´Ã¼°¡ Á¦°ø µÈ´Ù¸é ÇØ´ç °´Ã¼ÀÇ toString() ¿À¹ö¶óÀ̵ù(Overriding) ±¸ÇöÀ» ã¾Æº¾´Ï´Ù(lookup). ¸¸¾à toString()ÀÌ ±¸ÇöµÇÁö ¾Ê¾Ò´Ù¸é super °´Ã¼ÀÎ Object °´Ã¼ÀÇ toString() ¹Ýȯ °ªÀÎ "[object Object]"¸¦ Ãâ·ÂÇÕ´Ï´Ù. ¸ðµç °´Ã¼´Â Object¸¦ »ó¼Ó¹ÞÀº ÀڽĵéÀ̱⠶§¹®ÀÌÁÒ. ÀÌ °ÍÀÌ »ó¼Ó ¸ÞÄ¿´ÏÁòÀ̸ç OO(Object Oriented)ÀÇ ¸Å·Â Æ÷ÀÎÆ® Áß ÇϳªÀÔ´Ï´Ù.
ÇÏÁö¸¸ alert()ÀÇ ÀÎÀÚ·Î °´Ã¼°¡ Á¦°øµÇÁö ¾Ê°í ±âº» µ¥ÀÌÅÍ(Primitive Data)°¡ Á¦°ø µÈ´Ù¸é ¾î¶² ¸ÞÄ¿´ÏÁòÀ» ÅëÇØ ¹®ÀÚ¿ÀÌ Ãâ·Â µÉ±î¿ä?
¿ì¸®ÀÇ ÀÚ¹Ù½ºÅ©¸³Æ® ¿£ÁøÀº ±âº» µ¥ÀÌÅ͸¦ ´Ù·ê ¶§ ÀûÀýÇÑ °´Ã¼( "Á¦ÀÓ½º String", "¸¶°¡·¿ Number", "¼£·µ Date", "¸¶ÀÌŬ ºò Math", "Àª¸®¾ö Array" )·Î ·¡ÇÎ(wrapping) ÇØ¼ ´Ù·ì´Ï´Ù. ÀÌ´Â Çü ¾ÈÀü¼º(Type Safety)¸¦ À¯ÁöÇϱâ À§ÇÔÀÔ´Ï´Ù. °á±¹ alert()´Â Á¦°øµÈ ±âº» µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ·¡ÇÎµÈ °´Ã¼ÀÇ toString() ±¸ÇöÀ» ã¾Æº¸°Ô µË´Ï´Ù(¹°·Ð Äھ ¹Ì¸® Á¤ÀǵǾî ÀÖ½À´Ï´Ù ^^).
¿À¿Ê! ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ °ü´ëÇÔ µÚ¿¡´Â ¾ÈÀü¼ºÀ» À¯ÁöÇÏ·Á´Â ³ë·ÂÀÌ Á¸ÀçÇϴ±º¿ä. ´«¹° ³ª°Ô °¨»çÇÕ´Ï´Ù. ¹¹ Çմϱî! ¹Ú¼ö Çѹø ÃÄ ÁÖ¼¼¿ä. ¦¦¦~~
ÀÌÁ¦ 32 ¶óÀΰú 33 ¶óÀÎÀ» »ìÆì º¸µµ·Ï ÇÏÁÒ!
- 32¶óÀÎ : alert(o.v2);
À§¿¡¼ ¾ð±ÞÇßµíÀÌ v2´Â this Ű¿öµå¸¦ »ç¿ëÇÏÁö ¾Ê°í ¼±¾ðµÇ¾ú±â ¶§¹®¿¡ Private ¾îÆ®¸®ºäÆ® ÀÔ´Ï´Ù. µû¶ó¼ ÀÚ¹Ù½ºÅ©¸³Æ® ¿£ÁøÀº Á÷Á¢ÀûÀÎ Á¢±Ù¿¡ ´ëÇØ °ú°¨È÷ "undefined"¸¦ ¹ÝȯÇÕ´Ï´Ù. ÀÌ·² ¶§ ÇÊ¿äÇÑ °ÍÀº? ±×·¸½À´Ï´Ù! ÀûÀýÇÑ setter¿Í getterÀÌ¸ç ¿ì¸®´Â ÀÌ¹Ì setValue¿Í getValue·Î ±¸ÇöÀ» ÇØ ³õ¾Ò½À´Ï´Ù. ^^v
- 33¶óÀÎ : alert(o);
¿ì¸®ÀÇ myClass °´Ã¼´Â toString() ¸Þ¼µå¸¦ ¿À¹ö¶óÀ̵ù Ç߱⠶§¹®¿¡ ¹Ì¸® ¾à¼ÓÇÑ´ë·Î "v1=[v1ÀÇ °ª]"ÀÌ Ãâ·ÂµË´Ï´Ù.
°è¼Ó ÇØ¼ ´ÙÀ½ ÄÚµå ³ª°©´Ï´Ù!
34 35 36 37 | o.resetValue();
alert(o); //v1=null
o.setValue("I am Private");
alert(o.getValue()); //I am Private |
¹Ù·Î À§¿¡¼ ¼³¸íÇß´ø ÄÚµå¿Í º°¹Ý ´Ù¸¦ °ÍÀÌ ¾ø½À´Ï´Ù. ÇÏÁö¸¸ Private ¾îÆ®¸®ºäÆ®¿¡ Á¢±ÙÇÏ´Â setter¿Í getter¸¦ »ç¿ë Çß½À´Ï´Ù. ÀÌ¿Í °°ÀÌ º¯°æ¿¡ ¹Î°¨ÇÑ µ¥ÀÌÅ͵鿡 ´ëÇØ¼´Â Private·Î ¼±¾ðÇØ¼ Á¢±ÙÀ» Á¦ÇÑÀûÀ¸·Î Çã¿ëÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù.
ÀÚ! ¿ì¸®´Â ÀÌÁ¦±îÁö »ç¿ëÀÚ Á¤ÀÇ °´Ã¼¸¦ ¸¸µé°í Á÷Á¢ »ç¿ë ÇØ º¸¾Ò½À´Ï´Ù. ÀÌÁ¦ ¿©·¯ºÐÀº °´Ã¼¸¦ ¸¸µé¾î¼ Àû¿ëÇÒ Áغñ°¡ µÇ¾î ÀÖ½À´Ï´Ù.
¾ÆºÎÁö! Àç»êÀ» Àú¿¡°Ô »ó¼Ó(Inheritance)ÇØ ÁÖ¼¼¿ä!
ÀÚ ÀÌÁ¦ºÎÅÍ º»°ÝÀûÀ¸·Î OO(Object Oriented)ÀÇ ´ëÇ¥ÀûÀΠƯ¡ÀÎ »ó¼ÓÀ» ´Ù·ç¾îº¸µµ·Ï ÇϰڽÀ´Ï´Ù.
µµ´ëü »ó¼Ó(Inheritance)Àº ¹ºµ¥?
- ½¬¿î ºñÀ¯ #1 : ¾Æ¹öÁöÀÇ Àç»êÀ» ¾ÆµéÀÌ »ó¼Ó¹Þ´Â´Ù.
- ½¬¿î ºñÀ¯ #2 : ¾ÆµéÀº ¾Æ¹öÁöÀÇ À¯ÀüÀû Ư¼º(¾îÆ®¸®ºäÆ®)°ú ½À°ü(¸Þ¼µå)¸¦ ´à¾Æ°£´Ù(»ó¼Ó).
- ºÎ¸ð °´Ã¼(super object)ÀÇ ¸ðµç °Í(¾îÆ®¸®ºäÆ®, ¸Þ¼µå, »ý¼ºÀÚ)¸¦ ÀÚ½Ä °´Ã¼(sub object)°¡ »ó¼Ó¹Þ´Â´Ù.
- ÀÚ½Ä °´Ã¼´Â ºÎ¸ð °´Ã¼°¡ »ó¼ÓÇØÁØ °ÍÀ» ÀçÁ¤ÀÇ ÇÒ ¼ö ÀÖ´Ù(ºÎ¸ð °´Ã¼ÀÇ ÀϹÝÈ).
- ModuleÀÇ °øÅëÀûÀÎ ºÎºÐÀ» ¹À» ¼ö ÀÖ¾î¼ µ¿ÀÏÇÑ Àǹ̸¦ °¡Áö´Â Äڵ带 ÇÑ ¹ø ÀÌ»ó ÀÛ¼ºÇÒ Çʿ䰡 ¾ø´Ù.
- Àç»ç¿ë¼º, À¯Áöº¸¼ö¼º, È®À强ÀÇ ÀÌÁ¡À» ¾òÀ» ¼ö ÀÖ´Ù.
ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼´Â °´Ã¼ÀÇ »ó¼Ó °ü°è¸¦ ¾î¶»°Ô ±¸Çö ÇÒ±î¿ä? »ç½Ç ÀÚ¹Ù½ºÅ©¸³Æ® 1.3 ¹öÀü ÀÌÇÏ¿¡¼´Â »ó¼ÓÀ» ±¸ÇöÇÒ ¹æ¹ýÀÌ ¾ø¾ú½À´Ï´Ù. 1.3 ¹öÀüºÎÅÍ »ó¼ÓÀ» ±¸ÇöÇϱâ À§ÇÑ apply¿Í call ÇÔ¼ö¸¦ Á¦°øÇϱ⠽ÃÀÛÇß½À´Ï´Ù. ¿À´ÃºÎÅÍ apply¿Í call ÇÔ¼ö¸¦ Ä£±¸Ãß°¡ ÇØ ÁÖ¼¼¿ä.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | function Father( p1, p2 )
{
this.FatherMoney = p1 * p2;
}
Father.prototype.Say = function(){ alert("¾ÆºÎÁöÀÇ ¿ëµ·Àº " + this.FatherMoney + "¿ø"); }
function Son( p )
{
Father.call( this, p, 2 );
this.SonMoney = p;
}
Son.prototype = new Father();
Son.prototype.Say = function(){ alert("¾ÆµéÀÇ ¿ëµ·Àº " + this.SonMoney + "¿ø"); }
Son.prototype.FatherSay = function(){ Father.prototype.Say.call( this ); }
var o = new Son(100);
o.Say();
o.FatherSay(); |
Á¶±Ý ÀÌÇØÇϱâ Èûµå½Å ºÎºÐÀÌ ÀÖÀ¸½Ç °Ì´Ï´Ù. Â÷±ÙÂ÷±Ù µû¶ó¿Í º¸¼¼¿ä. ^^
1 2 3 4 5 6 | function Father( p1, p2 )
{
this.FatherMoney = p1 * p2;
}
Father.prototype.Say = function(){ alert("¾ÆºÎÁöÀÇ ¿ëµ·Àº " + this.FatherMoney + "¿ø"); } |
ºÎ¸ð °´Ã¼ÀÎ Father¸¦ ¼±¾ð Çß½À´Ï´Ù. FatherMoney¶ó´Â ¾îÆ®¸®ºäÆ®¿Í Say¶ó´Â ¸Þ¼µå¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.
8 9 10 11 12 13 14 15 16 | function Son( p )
{
Father.call( this, p, 2 );
this.SonMoney = p;
}
Son.prototype = new Father();
Son.prototype.Say = function(){ alert("¾ÆµéÀÇ ¿ëµ·Àº " + this.SonMoney + "¿ø"); }
Son.prototype.FatherSay = function(){ Father.prototype.Say.call( this ); } |
Father °´Ã¼¸¦ »ó¼Ó ¹ÞÀ» Son °´Ã¼ ÀÔ´Ï´Ù. Father °´Ã¼ÀÇ FatherMoney ¾îÆ®¸®ºäÆ®¿Í Say ¸Þ¼µå¸¦ »ó¼Ó ¹ÞÀ¸¸ç, Say ¸Þ¼µå¸¦ Àç Á¤ÀÇ ÇØ¼ º¸´Ù ÀϹÝÈ ÇÏ¿´½À´Ï´Ù(¾ö¹ÐÈ÷ ¸»ÇØ ÀÌ ¿¹Á¦´Â ÀϹÝÈ ÇÑ °ÍÀº ¾Æ´ÏÁö¸¸ ´ëºÎºÐ ÀϹÝÈ ÇÕ´Ï´Ù).
- 10 ¶óÀÎ : Father.call( this, p, 2 );
call°ú apply´Â ´Ù¸¥ ÄÁÅØ½ºÆ®ÀÇ °´Ã¼¸¦ »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇØ ÁÖ´Â ÇÔ¼ö ÀÔ´Ï´Ù. call ÇÔ¼öÀÇ ¿øÇüÀº Function.call( this, arg1, arg2, ..., argN ) À̸ç, apply ÇÔ¼öÀÇ ¿øÇüÀº Function.apply( this, arguments ) ÀÔ´Ï´Ù(arguments´Â ÇÔ¼ö¿¡ Àü´Þ µÈ ÀÎÀÚ °ªµéÀ» ¹è¿·Î °¡Áö°í ÀÖ´Â Function °´Ã¼ÀÇ °íÀ¯ ÇÁ·ÎÆÛƼ ÀÔ´Ï´Ù). »óÀ§ °´Ã¼ »ý¼ºÀÚÀÇ ÀÎÀÚ ÁýÇÕ°ú ÇÏÀ§ °´Ã¼ »ý¼ºÀÚÀÇ ÀÎÀÚ ÁýÇÕÀÌ µ¿ÀÏÇÏ´Ù¸é apply¸¦ »ç¿ëÇϸç, ¼·Î ´Ù¸£´Ù¸é callÀ» »ç¿ëÇÕ´Ï´Ù. ¿ì¸®°¡ ´Ù·ç´Â ¿¹Á¦¿¡¼´Â »ý¼ºÀÚÀÇ ÀÎÀÚ ÁýÇÕÀÌ ¼·Î ´Ù¸£±â ¶§¹®¿¡ callÀ» »ç¿ëÇÏ¿´½À´Ï´Ù. ±×¸®°í, ÇØ´ç °´Ã¼¸¦ »ç¿ëÇÏ´Â ÄÁÅØ½ºÆ®°¡ ³» ÀÚ½ÅÀ̱⠶§¹®¿¡ ù ¹øÂ° ÀÎÀÚ´Â ¹«Á¶°Ç this ÀÔ´Ï´Ù. ÀÌ ¼±¾ðÀ¸·Î Father °´Ã¼ÀÇ ¸ðµç °ÍÀ» »ç¿ëÇϰڴٴ »ç½ÇÀ» ÀÚ¹Ù½ºÅ©¸³Æ® ¿£Áø¿¡ ¾Ë·ÁÁÖ°Ô µÇ´Â °ÍÀÔ´Ï´Ù.
- 14 ¶óÀÎ : Son.prototype = new Father();
¾Æ¹öÁö°¡ ¸ÕÀú žÀ»±î¿ä? ¾ÆµéÀÌ ¸ÕÀú žÀ»±î¿ä? ½º½º·Î ±×·¯ÇÑ ÀÚ¿¬ÀÇ ¹ýÄ¢¿¡ µû¸£¸é ¾Æ¹öÁö°¡ ¸ÕÀú ÅÂ¾î³ ÈÄ¿¡ ¾ÆµéÀÌ Å¾´Â °ÍÀÌ ´ç¿¬ÇÕ´Ï´Ù(³ ±×·¯Áö ¾Ê¾Ò´Ù°í ´ë´ä ÇÏ½Ã¸é ¸Å¿ì ³°¨ ÇÕ´Ï´Ù ¤»¤»). ÀÌ ¹ýÄ¢Àº °´Ã¼¿¡ ±×´ë·Î Àû¿ë µÇ¸ç, ºÎ¸ð °´Ã¼ÀÇ ÀνºÅϽº°¡ »ý¼ºµÈ ÈÄ¿¡ ÀÚ½Ä °´Ã¼°¡ »ý¼ºµÇ´Â °ÍÀÌ ¼ø¼ÀÔ´Ï´Ù. ÀÌ °ÍÀÌ »ý¼ºÀÚ Ã¼ÀÌ´×(Chaining) ÀÔ´Ï´Ù. ÀÌ Äڵ尡 ¼öÇàµÇ¸é FatherÀÇ ÀνºÅϽº°¡ »ý¼º µÈ ÈÄ(»ý¼ºÀÚ È£Ãâ)¿¡ Son¿¡ ÇÒ´çµË´Ï´Ù.
- 15 ¶óÀÎ : Son.prototype.Say = function(){ alert("¾ÆµéÀÇ ¿ëµ·Àº " + this.SonMoney + "¿ø"); }
Son °´Ã¼´Â Father °´Ã¼ÀÇ Say() ¸Þ¼µå¸¦ »ó¼Ó¹Þ¾ÒÁö¸¸ ¸¶À½¿¡ µéÁö ¾Ê¾Ò´øÁö ÀÚ½ÅÀÇ °ÍÀ¸·Î Àç Á¤ÀÇ Çß½À´Ï´Ù. ¿ä°ÍÀÌ ¸Þ¼µå ¿À¹ö¶óÀ̵ù(Overriding) ÀÔ´Ï´Ù.
- 16 ¶óÀÎ : Son.prototype.FatherSay = function(){ Father.prototype.Say.call( this ); }
À§¿¡¼ ¸»¾¸µå¸° callÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÇöÀç ÄÁÅØ½ºÆ® ¾È¿¡¼ ºÎ¸ð °´Ã¼ÀÇ ¸Þ¼µå¸¦ È£Ãâ ÇÏ´Â ÄÚµå ÀÔ´Ï´Ù. ¿Ö ÀÌ·¸°Ô ¾î·Æ°Ô Çϳı¸¿ä? ¾Ö¼®ÇϰԵµ ÀÚ¹Ù½ºÅ©¸³Æ®¿¡¼´Â super Ű¿öµå°¡ ¾ø½À´Ï´Ù. ±×·¸±â ¶§¹®¿¡ callÀ» »ç¿ëÇÏ¿© ºÎ¸ð °´Ã¼ÀÇ ¸Þ¼µå¸¦ È£Ãâ ÇÏ¿´½À´Ï´Ù. super.Say()ó·³ ºÎ¸ð °´Ã¼ÀÇ ¸Þ¼µå¸¦ Á÷Á¢ È£ÃâÇÏ´Â ¹æ¹ýÀº ¾ø½À´Ï´Ù.
"ÀÚ¹Ù½ºÅ©¸³Æ®°¡ OO¸¦ Áö¿ø ÇÑ´Ù¸é¼ ¿Ö super Ű¿öµå¸¦ Áö¿øÇÏÁö ¾Ê½À´Ï±î?"
¶§°¡ ¿Ô½À´Ï´Ù. ±Þ ±ô¦, ±Þ ½Ç¸Á ¹ßÇ¥¸¦ ÇϰڽÀ´Ï´Ù. ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ OOP´Â ÁøÁ¤ÇÑ ÀǹÌÀÇ OOP°¡ ¾Æ´Õ´Ï´Ù. OOPÀÇ ±âº»ÀÎ ´ÙÇü¼ºµµ Áö¿øÇÏÁö ¾ÊÀ¸¸ç Ãß»óȵµ Áö¿øÇÏÁö ¾Ê½À´Ï´Ù. ±×Àú ¾à°£ÀÇ Èä³»¸¸ ³¾ »ÓÀÔ´Ï´Ù. ¿ì¸®´Â ÀÚ¹Ù½ºÅ©¸³Æ® OOP ³ª¸§´ë·ÎÀÇ ÀåÁ¡À» Àß È°¿ëÇØ¼ È¿À²À» ±Ø´ëÈ ½ÃÄÑ »ç¿ëÇϱ⸸ ÇÏ¸é ±×¸¸ÀÔ´Ï´Ù. ¿©·¯ºÐ »ç¶ûÇÕ´Ï´Ù.
¿©±â±îÁö°¡ »ó¼ÓÀÇ ¼±¾ð ´Ü°è¿¡ ¼ÓÇÕ´Ï´Ù. ÀÌÁ¦ »ó¼Ó¹ÞÀº Son °´Ã¼¸¦ »ç¿ë ÇØ º¾½Ã´Ù.
18 19 20 21 | var o = new Son(100);
o.Say();
o.FatherSay(); |
ÀÌÁ¦ new Ű¿öµå°¡ ¸Å¿ì Ä£¼÷ÇØÁ³ÁÒ?
Son °´Ã¼ÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÑ ÈÄ Say() ¸Þ¼µå¸¦ È£Ãâ Çß½À´Ï´Ù. Father.Say()¸¦ È£ÃâÇÏ°í ½ÍÁö¸¸ super Ű¿öµå¸¦ Áö¿øÇÏÁö ¾Ê±â ¶§¹®¿¡ ¿ìȸÀûÀÎ ¹æ¹ýÀ¸·Î FatherSay() ¸Þ¼µå¸¦ È£Ãâ Çß½À´Ï´Ù. "¾ÆºÎÁöÀÇ ¿ëµ·Àº 200¿ø", "¾ÆµéÀÇ ¿ëµ·Àº 100¿ø"À̶õ °æ°í âÀÌ »ç¶û½º·´°Ô Ãâ·Â µÉ °Ì´Ï´Ù. »Ð~
¿ä¾à
ÀÌÁ¦ ¿©·¯ºÐÀº ³ª¸¸ÀÇ °´Ã¼¸¦ »ý¼ºÇÏ°í ¿©·¯ °÷¿¡ »ó¼ÓÀ» ÇØ ÁÙ Áغñ°¡ µÇ¾î ÀÖ½À´Ï´Ù. Áö±Ý±îÁö »ìÆìº¸¾Ò´ø ³»¿ëÀ» °¡Áö°í ³ª¸¸ÀÇ ÇÁ·¹ÀÓ¿öÅ©¸¦ ¸¸µé ¼ö ÀÖ½À´Ï´Ù. ¿©·¯ºÐ ½Å³ªÁÒ?? ²¥¾Ç~!@#$%
¸¸¾à °´Ã¼ÁöÇâ °³³äÀÌ ¾àÇϽôٸé öÀúÇÏ°Ô ½ÀµæÇÏ½Ã±æ ±ÇÇØµå¸³´Ï´Ù. À¥ °³¹ß·Î ½ÃÀÛÇÑ °³¹ßÀÚÀÇ ½Ã°¢ÀÌ ¸ðµç °ÍµéÀ» °´Ã¼·Î º¸ÀÌ´Â ½Ã°¢À¸·Î ÁøÈÇÒ ¶§ ¹Ý°¡¿î ¼Õ´ÔÀÌ Ã£¾Æ¿Ã °ÍÀÔ´Ï´Ù. ¹Ù·Î ÇØÅ»ÀÇ ½Ã±â°¡ ã¾Æ¿À°Ô µÇ¸ç »çÃá±â¸¦ Áö³ª ÁøÁ¤ÇÑ ¾î¸¥ÀÌ µÇ´Â ¼ø°£ÀÔ´Ï´Ù.
´ÙÀ½ ½Ã°£¿¡´Â ³ª¸¸ÀÇ ÇÁ·¹ÀÓ¿öÅ©¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڽÀ´Ï´Ù.
±×·³! ä³Î °íÁ¤!
°Á ¸ñ·ÏÀ¸·Î..
|