JAVA¸¦ ¹è¿ì´Â »ç¶÷, ¶Ç´Â ÇÁ·Î±×·¡¹Ö¿¡ Á¾»çÇϽô °³¹ßÀÚ ºÐµéÀÌ ´Ù½ÃÇѹø ºÁµµ ±¦ÂúÀ»°Å °°Àº
¸¶Ä¡ ÀÌ·Ð ½ÃÇè Á÷Àü º¸´Â ÄÁ´×ÆäÀÌÆÛ °°ÀÌ Á¤¸® µÇ¾îÀÖ´Â ÀÚ¹ÙÀÇ ±âº»¿ø¸® ¿¡ °üÇÑ ÀÚ·áÀÔ´Ï´Ù.
ƯÈ÷ °¢ ÁÖÁ¦¿¡ ¸Â´Â ¸ñÂ÷¿¡´Â ¿¹Á¦°¡ ÀÖ¾î JAVA¸¦ ÀÔ¹®ÇϽô ÃʱÞÇÁ·Î±×·¡¸Ó µé¿¡°Ô´Â ÁÁÀº ÀÚ·á °°½À´Ï´Ù.
±×·³ ±æ°í±ä ½ºÅ©·Ñ ³»·Á¼ ²À º¸½Ã±æ..
¸ñÂ÷
-
- 1 °´Ã¼ÁöÇâÀÇ ±¸¸Û static
-
- 1.1 Java´Â °´Ã¼ÁöÇâ ¾ð¾îÀÌ´Ù?
- 1.2 Àü¿ªº¯¼ö
- 2 Java´Â Pointer¾ð¾îÀÌ´Ù? (Java¿¡´Â Pointer¹Û¿¡ ¾ø´Ù?)
-
- 2.1 Java´Â primitiveÇüÀ» Á¦¿ÜÇÏ°ï ¸ðµÎ PointerÀÌ´Ù
- 2.2 nullÀº °´Ã¼Àΰ¡?
- 2.3 String¿¡ ´ëÇÏ¿©
- 2.4 °´Ã¼ÁöÇâÀÇ Ä¸½¶È ÆÄ±« ÁÖÀÇ
- 2.5 ¹è¿¿¡ ´ëÇÏ¿©
-
- 2.5.1 ¹è¿Àº object Àΰ¡?
- 2.5.2 ¹è¿ÀÇ length´Â ¿Ö field(member variable)Àΰ¡?
- 2.5.3 final°ú ¹è¿¿¡ ´ëÇÏ¿©...
- 2.5.4 "Java¿¡¼ÀÇ ´ÙÂ÷¿ø ¹è¿Àº Á¸ÀçÇÏÁö ¾Ê´Â´Ù."
- 2.6 Àμö(parameter/argument)Àü´ÞÀÇ °³³ä
-
- 2.6.1 "Java¿¡¼ parameter(argument) Àü´ÞÀº ¹«Á¶°Ç 'call by value' ÀÌ´Ù"
- 2.6.2 "C¿Í °°Àº ¾ð¾î´Â static linkingÀÌÁö¸¸, Java´Â dynamic linkingÀÌ´Ù."
- 2.7 GC ¿¡ ´ëÇÏ¿© Àá±ñ!
-
- 2.7.1 "Garbage CollectionÀº ¸¸´ÉÀÌ ¾Æ´Ï´Ù."
- 2.8 Java Pointer °á·Ð
-
- 2.8.1 "°á±¹ Java¿¡´Â pointer°¡ ÀÖ´Â °ÍÀΰ¡, ¾ø´Â °ÍÀΰ¡?"
- 3 »ó¼Ó°ú interfaceÀÇ ¹®Á¦Á¡
-
- 3.1 »ó¼Ó
-
- 3.1.1 »ó¼Ó¿¡ ÀÖ¾î¼ÀÇ »ý¼ºÀÚ(constructor)
- 3.1.2 "down cast´Â º»ÁúÀûÀ¸·Î ¸Å¿ì À§ÇèÇÏ´Ù"
- 3.1.3 "Ãß»óŬ·¡½º¿¡ finalÀÌ ÀÖÀ¸¸é compile errorÀÌ´Ù"
- 3.2 interface
-
- 3.2.1 "interface´Â interfaceÀÏ»Ó ´ÙÁß »ó¼ÓÀÇ ´ë¿ëǰÀÌ ¾Æ´Ï´Ù."
- 3.3 »ó¼Ó Á¦´ë·Î »ç¿ëÇϱâ
- 4 package¿Í access Á¦¾î¿¡ °üÇÑ ÀÌÇØ
-
- 4.1 package
-
- 4.1.1 "package´Â '°èÃþ±¸Á¶' Àΰ¡?"
- 4.1.2 "compiler °¡ ÀνÄÇÏ´Â class°Ë»ö ¼ø¼(¼Ò½ºÄڵ峻 Ŭ·¡½º°¡ ¹ß°ßµÉ °æ¿ì ±× Ŭ·¡½ºÀÇ À§Ä¡¸¦ ã´Â ¼ø¼)"
- 4.2 access Á¦¾î
-
- 4.2.1 "interfacde memberÀÇ access Á¦¾î"
- 4.2.2 ±×·¸´Ù¸é interface¸¦ ´Ù¸¥ package¿¡ ´ëÇÏ¿© ¼û±â°í ½ÍÀ¸¸é ¾î¶»°Ô Çϴ°¡?
- 5 ±âŸ Java ±â´É
-
- 5.1 Thread
-
- 5.1.1 "Multi Thread¿¡¼´Â È帧Àº º¹¼öÀÌÁö¸¸ data´Â °øÀ¯µÉ ¼ö ÀÖ´Ù."
- 5.1.2 "Thread´Â °´Ã¼¿Í Á÷±³ÇÏ´Â °³³äÀÌ´Ù."
- 5.1.3 "Synchronized ÀÇ ÀÌÇØ"
- 5.1.4 "Thread »ç¿ë¹ýÀÇ Á¤¼®Àº?"
- 5.2 Exception
-
- 5.2.1 "finally ÀýÀº ¹Ýµå½Ã ¾î¶°ÇÑ °æ¿ì¿¡µµ ½ÇÇàµÇ´Â°¡?"
- 5.2.2 "¿¹¿ÜÀÇ Á¾·ù 3°¡Áö (Error, RuntimeException, ±×¹ÛÀÇ Exception)"
-
- 5.2.2.1 Error
- 5.2.2.2 RuntimeException
- 5.2.2.3 ±×¹ÛÀÇ Exception
- 5.2.3 "OutOfMemoryError´Â ¾î¶»°Ô ó¸®ÇØ¾ß Çϴ°¡?"
- 5.3 Object Serialize
-
- 5.3.1 "Serialize¸¦ À§Çؼ´Â marker interfaceÀÎ java.io.Serializable interface¸¦ implementsÇØ¾ßÇÑ´Ù."
- 5.3.2 "super class´Â SerializableÀÌ ¾Æ´Ñµ¥ sub class¸¸ SerializableÀÎ °æ¿ìÀÇ ¹®Á¦Á¡"
- 5.3.3 "transient fieldÀÇ º¹¿ø(?)°ü·Ã"
- 5.3.4 "Stack Overflow¿¡ ÁÖÀÇÇ϶ó!"
- 5.4 "nested class / inner class / ÁßøŬ·¡½º"
-
- 5.4.1 "ÁßøŬ·¡½ºÀÇ °³³ä"
- 5.4.2 "³»ºÎŬ·¡½º´Â ºÎ¸ðÀÇ ÂüÁ¶¸¦ ¸ô·¡ º¸À¯Çϰí ÀÖ´Ù."
- 5.4.3 "local inner class¿¡ ´ëÇÏ¿©"
- 5.4.4 "anonymous class(¹«¸íŬ·¡½º)¿¡ ´ëÇÏ¿©"
- 6 ÀÌ·¡µµ Java°¡ °£´ÜÇѰ¡?
-
- 6.1 method overload ¿¡¼ÀÇ È¥¶õ?
-
- 6.1.1 "overload¶õ À̸§ÀÌ °¡°í Àμö°¡ ´Ù¸¥ method¿¡ compiler°¡ ´Ù¸¥ À̸§À» ºÙÀÌ´Â ±â´É"
- 6.1.2 "±×·¸´Ù¸é overload¿¡¼ ½ÇÁ¦·Î È¥µ¿µÇ´Â ºÎºÐÀº ¹«¾ùÀΰ¡?"
- 6.1.3 (Âü°í) ¶Ç´Ù¸¥ È¥µ¿, overloadÇÑ method¸¦ override Çϸé?
- 6.2 »ó¼Ó/override/ÀºÆó ¿¡¼ÀÇ º¹ÀâÇÔ
-
- 6.2.1 "Java classÀÇ member 4 Á¾·ù"
- 6.2.2 "override½Ã method À̸§¿¡ ´ëÇÑ ÇÔÁ¤"
- 6.2.3 "¶Ç´Ù¸¥ ³ªÀÇ(?) ½Ç¼ö - ¸»µµ ¾ÈµÇ´Â ¿ÀŸ"
- 6.2.4 "static member¸¦ instance¸¦ °æÀ¯ÇÏ¿© ÂüÁ¶Çؼ´Â ¾È µÈ´Ù."
- 6.2.5 "super keyword´Â ºÎ¸ðÀÇ this"
- 6.3 »ó¼Ó¿¡ °üÇÑ ¶Ç ´Ù¸¥ ¹®Á¦
- 6.4 ±×¹ÛÀÇ ÇÔÁ¤
-
- 6.4.1 "»ý¼ºÀÚ¿¡ void ¸¦ ºÙÀδٸé?"
- 6.4.2 "if / switch ÀÇ ÇÔÁ¤"
- 7 Java ±â´É Àû¿ë ¸î°¡Áö
-
- 7.1 ´ë±Ô¸ð °³¹ß¿¡¼ interface ºÐ¸®Çϱâ
-
- 7.1.1 "interface ºÐ¸®ÀÇ Çʿ伺"
- 7.2 Java¿¡¼ÀÇ ¿°ÅÇü
- 7.3 Debug write
- 8 Java 5.0 Tiger ¿¡ ´ëÇÏ¿©
-
- 8.1 Working with java.util.Arrays
- 8.2 Using java.util.Queue interface
- 8.3 java.lang.StringBuilder »ç¿ëÇϱâ
- 8.4 Using Type-Safe Lists
- 8.5 Writing Generic Types
- 8.6 »õ·Î¿î static final enum
- 8.7 Using java.util.EnumMap
- 8.8 Using java.util.EnumSet
- 8.9 Convert Primitives to Wrapper Types
- 8.10 Method Overload resolution in AutoBoxing
- 8.11 °¡º¯ÀûÀÎ argument °³¼ö ...
- 8.12 The Three Standard Annotation
- 8.13 Creating Custom Annotation Types
- 9 The for/in Statement
-
- 9.1 for/in ÀÇ ÀÚÁÖ »ç¿ëµÇ´Â ÇüÅÂ
- 10 Static Import
-
- 10.1 static member/method import
- 11 References
===============================================================
1 °´Ã¼ÁöÇâÀÇ ±¸¸Û static #
1.1 Java´Â °´Ã¼ÁöÇâ ¾ð¾îÀÌ´Ù? #
"Java´Â ¿ÏÀüÇÑ °´Ã¼ÁöÇâ ¾ð¾îÀÌ´Ù" ¶ó´Â ÁÖÀåÀ» ÀÚÁÖ Á¢ÇÏ°Ô µÈ´Ù. ¸¸ÀÏ À̰ÍÀÌ »ç½ÇÀ̶ó¸é Java¸¦ »ç¿ëÇÏ´Â ÇÑ "±âÁ¸ÀÇ ÀýÂ÷ÁöÇâ ÇÁ·Î±×·¡¹ÖÀ» ÀüÇô ÇÒ¼ö ¾øÀ»°Í °°Áö¸¸ ±×·¸Áö ¾Ê´Ù. ºüÁ®³ª°¥ ±¸¸ÛÀÌ ÀÖ´Â °ÍÀÌ´Ù. staticÀ» ÀÌ¿ëÇÏ¸é ºñ °´Ã¼ÁöÇâ ¾ð¾îó·³ ÄÚµùÇÒ ¼ö ÀÖ´Ù.
static method´Â instance°¡ ¾Æ´Ñ Ŭ·¡½º¿¡ ¼ÓÇÏ´Â method·Î, class method¶ó°í ºÎ¸¥´Ù. ¹Ý´ë·Î staticÀÌ ¾Æ´Ñ method´Â instance method¶ó°í ºÎ¸¥´Ù.
static method´Â this°¡ ¾ø´Ù. instance method¿¡´Â ¼û°ÜÁø ÆÄ¶ó¹ÌÅÍ·Î this°¡ °Ç³×Áø´Ù. (¾Æ·¡ "°´Ã¼ÁöÇâ¿¡ ÈçÈñ ÀÖ´Â ¿ÀÇØ" Âü°í) ÇÏÁö¸¸ static method´Â ÀýÂ÷ÁöÇâÀÇ ÇÔ¼ö¿Í µ¿ÀÏÇϹǷΠ¼û°ÜÁø ÆÄ¶ó¹ÌÅÍ this´Â ¾ø´Ù. ±×·¡¼ static method¿¡¼´Â Àü´ÞÇÑ this°¡ ¾øÀ¸¹Ç·Î instance method¸¦ È£ÃâÇϰųª instance field¸¦ ÂüÁ¶ÇÒ ¼ö ¾ø´Â °ÍÀÌ´Ù.
(Âü°í) °´Ã¼ÁöÇâ¿¡ ÈçÈ÷ ÀÖ´Â ¿ÀÇØ
- ¿ÀÇØ1. "°´Ã¼ÁöÇâ¿¡¼´Â °´Ã¼³¢¸® ¼·Î ¸Þ¼¼Áö¸¦ ÁÖ°í ¹ÞÀ¸¸ç µ¿ÀÛÇÑ´Ù." ¶ó´Â ¸»À» µè°í ´ÙÀ½°ú °°ÀÌ »ý°¢ÇÒ ¼ö ÀÖ´Ù. "°´Ã¼ÁöÇâ¿¡¼´Â °´Ã¼°¡ °¢°¢ µ¶¸³ÇÏ¿© ¿òÁ÷Àδٴ °ÍÀΰ¡, ±×·¯¸é °¢ °´Ã¼¿¡ µ¶¸³µÈ thread°¡ ÇÒ´çµÇ¾î ÀÖ´Ü ¸»Àΰ¡?" ±×·¸Áö ¾Ê´Ù. "¸Þ¼¼Áö¸¦ º¸³½´Ù"¶ó´Â °ÍÀº ´Ü¼øÈ÷ °¢ °´Ã¼ÀÇ ÇÔ¼ö È£Ãâ¿¡ ºÒ°úÇÏ´Ù.
- ¿ÀÇØ2. "°´Ã¼ÁöÇâ¿¡¼´Â method°¡ class¿¡ ºÎ¼ÓµÇ¾î ÀÖ´Ù"´Â ¸»À» µè°í ´ÙÀ½°ú °°ÀÌ »ý°¢ÇÒ ¼ö ÀÖ´Ù. "±×·¯¸é instanceº°·Î methodÀÇ ½ÇÇàÄڵ尡 º¹Á¦µÇ°í ÀÖ´Â °ÍÀÌ ¾Æ´Ñ°¡?" ¹°·Ð À̰͵µ ¿ÀÇØ´Ù. methodÀÇ ½ÇÇàÄÚµå´Â Á¾·¡ÀÇ ÇÔ¼ö¿Í µ¿ÀÏÇÑ ¾îµò°¡ ´Ù¸¥°÷(JVMÀÇ class area)¿¡ Á¸ÀçÇÏ¸ç ±× Ã¹¹øÂ° ÆÄ¶ó¹ÌÅÍ·Î °´Ã¼ÀÇ Æ÷ÀÎÅÍ this°¡ °Ç³×Áú »ÓÀÌ´Ù.
- ¿ÀÇØ3. "±×·¸´Ù¸é °¢ instance°¡ methodÀÇ ½ÇÇàÄڵ带 Åë°·Î °®°í ÀÖÁö ¾Ê´Â °ÍÀº È®½ÇÇÏÁö¸¸, methodÀÇ ½ÇÇà ÄÚµåÀÇ Æ÷ÀÎÅÍ´Â °¢ instanceº°·Î º¸°üÇϰí Àִ°ÍÀÌ ¾Æ´Ñ°¡?" À̰ÍÀº ¾à°¡ ¾Ö¸ÅÇÑ ¿ÀÇØÀ̱ä ÇÏ´Ù. JVM ½ºÆå¿¡¼´Â class¿µ¿ª¿¡ ½ÇÇàÄڵ带 °®°í ÀÖÀ¸¸ç, method È£Ãâ½Ã º°µµÀÇ stack frameÀÌ »ý¼ºµÇ¾î ½ÇÇàµÇ°í ½ÇÇà ¿Ï·á½Ã º¹±Í ÁÖ¼Ò¸¦ Àü´ÞÇÑ´Ù.
1.2 Àü¿ªº¯¼ö #
static¿¡¼ public field´Â Àü¿ªº¯¼ö(global variable, ±Û·Î¹ú º¯¼ö)ÀÌ´Ù. ¿©±â¼ "±Û·Î¹ú º¯¼ö´Â ¿Ö ¾È µÇ´Â°¡"¿¡ ´ëÇØ Àá±ñ »ý°¢ÇØ º»´Ù. ¿ì¸®´Â ÈçÈ÷ "±Û·Î¹ú º¯¼ö´Â µÉ¼öÀÖ´ÂÇÑ »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ´Ù"¶ó°í ÇÑ´Ù. ±× ÀÌÀ¯´Â ±Û·Î¹ú º¯¼ö´Â ¾îµð¼µç ÂüÁ¶ÇÒ ¼ö ÀÖ°í °ªÀ» º¯°æÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.
¶ÇÇÑ ÆÄ¶ó¹ÌÅͳª ¸®ÅϰªÀ¸·Î ±³È¯ÇØ¾ß ÇÒ Á¤º¸¸¦ ±Û·Îº° º¯¼ö¸¦ °æÀ¯(»ç¿ë)ÇÏ¿© °Ç³×ÁÖ¸é ÇÔ¼öÀÇ ¿ªÇÒÀÌ ºÒºÐ¸í ÇØÁö°í È帧µµ ¾Ö¸ÅÇØ Áø´Ù. ¸¶Áö¸· ÀÌÀ¯·Î´Â "±Û·Î¹ú º¯¼ö´Â Çϳª¹Û¿¡ ¾ø´Ù"´Â °ÍÀÌ´Ù. ÀÌ´Â ¾îµð¼ À̰ªÀ» º¯°æÇß´ÂÁö ¾Ë ¼ö ¾ø°Ô ÇÏ´Â Áö¸§±æÀÌ°í ½Ç¹«¿¡¼µµ °£È¤ ¹ß»ýÇϱä ÇÏÁö¸¸, ÀÌ Çϳª¹Û¿¡ ¾ø´Â º¯¼ö°¡ ¹öÀü¾÷À¸·Î µÎ°³°¡ ÇÊ¿äÇÏ°Ô µÇ¾úÀ»¶§ È®Àåµµ ´ëÇü ÇÁ·ÎÁ§Æ®¿¡¼´Â Èûµé¾îÁø´Ù.
µû¶ó¼ static¿¡¼ publicÀº finalÀ» ºÙ¿© »ó¼ö·Î »ç¿ëÇØ¾ßÁö ±× ¿ÜÀÇ ¿ëµµ´Â ÀÚÁ¦ÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù.
- (Âü°í) final ÃʱâÈ¿¡¼ÀÇ ÁÖÀÇÁ¡. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°Àº Äڵ带 º¸¾ÒÀ»¶§ ¿ì·ÁµÇ´Â Á¡Àº ¹«¾ùÀΰ¡?
public final static Color WHITE = new Color(255, 255, 255);
À§ÀÇ ÄÚµå´Â java.awt.Color¿¡¼ ¹ßÃéÇÑ °ÍÀε¥, final º¯¼ö´Â Çѹø ÃʱâÈ µÇ¸é º¯°æÀÌ ºÒ°¡´ÉÇѵ¥ object·Î ÃʱâÈ ÇÒ °æ¿ì WHITE¶ó´Â Çʵ尡 º¯°æµÉ ¼ö ¾ø´Â °ÍÀÌÁö ±×°ÍÀÌ °¡¸®Å°´Â °´Ã¼´Â ¾Æ´Ï¶ó´Â Á¡ÀÌ´Ù.
°ú°Å ½Å±Ô ¼ºñ½º °³¹ß½Ã final º¯¼ö Çʵ忡 ¼³Á¤ÆÄÀÏÀ» Àоî cacheÇÏ´Â singleton classÀÇ Æ¯Á¤ member ¸¦ ÀÌ¿ëÇÏ¿© ÃʱâÈ ÇÒ °æ¿ì ÀÌ ¸â¹ö°ªÀÌ º¯°æµÇ¸é final º¯¼öÀÇ °ªÀÌ º¯°æµÇ¾ú´Âµ¥ ÇÁ·Î±×·¥¿¡¼´Â ÀÌ»óÇÑ ÁþÀ» ÇÏ´Â ¿øÀÎÀ» ã±â°¡ »ó´çÈ÷ ¾î·Á¿ü´ø °æÇèÀ» ÇÏ°í ³ ÈÄ ºÎÅÍ ÀÌ·± ÄÚµå´Â ³¿»õ³ª´Â ÄÚµå·Î ¿©°ÜÁö°Ô µÇ¾ú´Ù.
staticÀº ±Û·Î¹úº¯¼ö¿Í µ¿ÀÏÇϹǷΠ³²¹ßÇØ¼´Â ¾ÈµÈ´Ù. staticÀ» »ç¿ëÇÒ °æ¿ì ´ÙÀ½ µÎ°¡Áö´Â ÃÖ¼ÒÇÑ ±â¾ïÇÑ´Ù.
- static field´Â finalÀÇ °æ¿ì¿Í ´Þ¸® Á¤¸» "Çϳª¿©µµ µÇ´ÂÁö" ¿©ºÎ¸¦ Àß »ý°¢ÇØ¾ß ÇÑ´Ù.
- static method´Â ÁÖÀúÇÏÁö ¸»°í ¾²µÇ ´ÙÀ½ µÎ°¡ÁöÀÇ °æ¿ì ¸Å¿ì Ȱ¿ëÀûÀÌ´Ù.
- ´Ù¸¥ ¸¹Àº Ŭ·¡½º¿¡¼ »ç¿ëÇÏ´Â Utility Method ±ºÀ» ¸¸µå´Â °æ¿ì. (ÁÖ·Î Utility ClassÀÇ method)
- Ŭ·¡½º ¾È¿¡¼¸¸ »ç¿ëÇÏ´Â "ÇÏû ¸Þ¼Òµå(private method)". ÀÌÀ¯¸¦ ¿¹¸¦ µé¾î ¼³¸íÇϸé, ¾Æ·¡¿Í °°Àº Á¶±ÝÀº °úÀåµÈ Ŭ·¡½º°¡ ÀÖ´Ù°í ÇÏÀÚ.
public class T ..
private int a;
private int b;
private int c;
private int calc(){
c = a + b;
return c * c;
}
....other method or getter/setter...
À§ÀÇ Å¬·¡½º TÀÇ °æ¿ì ³»ºÎ¿¡¼ calc¶ó´Â instance ÇÔ¼ö¸¦ »ç¿ëÇÏ°Ô µÇ¸é c ÀÇ °ªÀÌ ¸Å¹ø º¯ÇÏ°Ô µÈ´Ù. ÀÌ´Â ¹«½ÉÄÚ ÇÏ´Â ½Ç¼ö·Î Ŭ·¡½º³»¿¡¼ private method´Â ¸ðµç ¸â¹ö instance º¯¼ö¿¡ Á¢±Ù °¡´ÉÇÏ°Ô µÇ¸é¼ ¹ß»ýÇÑ´Ù. cÀÇ °ªÀÌ º¯ÇÏÁö ¾Ê±â¸¦ ¹Ù¶ö¼ö ÀÖ´Ù. À̶§ ¾ÈÀüÇÑ ¹æ¹ýÀº ´ÙÀ½°ú °°ÀÌ calc ÇÏû ¸Þ¼Òµå¸¦ static method·Î ¼öÁ¤ÇÏ¸é ¾ÈÀüÇÏ´Ù.
private static int calc(int a, int b){
int c = a + b;
return c * c;
}
¿©±â¼ a¿Í b´Â ¸â¹ö º¯¼ö¸¦ Á¢±ÙÇÒ¼ö ¾ø¾î Àü´ÞÇØ¾ßÇÑ´Ù.(static¿¡´Â this°¡ ¾ø¾î instance field¸¦ ÂüÁ¶ÇÒ ¼ö ¾ø´Ù´Â °ÍÀº ÀÌ¹Ì À§¿¡¼ ¼³¸íÇß´Ù.) ¶ÇÇÑ cµµ °°Àº ÀÌÀ¯·Î »ç¿ëÇÒ ¼ö ¾ø¾î ·ÎÄà º¯¼ö·Î ¼±¾ðÇÏ°í »ç¿ëÇϰí ÀÖ´Ù. ÀÌ·² °æ¿ì ¸Þ¼Òµå°¡ ¾à°£ Ä¿Áú¼ö ÀÖÁö¸¸ instance member º¯¼ö¸¦ ¾ÈÀüÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. À̰ÍÀº staticÀ» ´Ù½ÃÇѹø »ý°¢ÇÏ°Ô ÇÏ´Â ÁÁÀº ¿¹°¡ µÇ¾úÀ» °ÍÀÌ´Ù.
2 Java´Â Pointer¾ð¾îÀÌ´Ù? (Java¿¡´Â Pointer¹Û¿¡ ¾ø´Ù?) #
2.1 Java´Â primitiveÇüÀ» Á¦¿ÜÇÏ°ï ¸ðµÎ PointerÀÌ´Ù #
"Java¿¡´Â Æ÷ÀÎÅͰ¡ ¾ø´Ù" ¶ó°í JavaÀÇ ÀåÁ¡ À̶ó°í »ý°¢ÇÏ´Â °ÍÀº ÀÔ¹®ÀÚµµ ¿Ü¿ì°í ÀÖ´Ù. ÇÏÁö¸¸ ÀÌ ºÎºÐÀº ÀǿܷΠJava¸¦ È¥¶õ½º·´°Ô ÇÏ´Â ÁÖ¹üÀ̶ó°í »ý°¢ÇÑ´Ù. Java¿¡ Æ÷ÀÎÅͰ¡ ¾ø±â´Â Ä¿³ç primitive(int, short, char, long...µî JVMÀÇ Heap¿¡ object·Î »ý¼ºµÇÁö ¾Ê´Â°Íµé)¸¦ Á¦¿ÜÇϸé "Æ÷ÀÎÅÍ ¹Û¿¡ ¾ø´Â ¾ð¾îÀÌ´Ù"¶ó´Â ¸íÁ¦°¡ ¼º¸³µÇ°Ô µÈ´Ù. »ç½Ç ¿©±â¼ Æ÷ÀÎÅͶó°í ÇÔÀº C ÀÇ ±×°Í°ú´Â Á¶±Ý ´Ù¸¥ reference(ÂüÁ¶)À̱ä ÇÏÁö¸¸...
"Áï, ÀÚ¹ÙÀÇ Å¬·¡½ºÇüÀÇ º¯¼ö´Â ¸ðµÎ Æ÷ÀÎÅÍÀÌ´Ù."
2.2 nullÀº °´Ã¼Àΰ¡? #
Java¿¡¼ °øÂüÁ¶(Èü¿¡ ½ÇÁ¦·Î ÂüÁ¶µÇ´Â object°¡ ¾ø´Â ÂüÁ¶)ÀÇ °æ¿ì´Â ´ç¿¬È÷ °´Ã¼°¡ ºÙ¾î ÀÖÁö ¾Ê´Ù. ±×·¯³ª, Java API ·¹ÆÛ·±½ºÀÇ NullPointerException Ç׿¡´Â ´ÙÀ½°ú °°ÀÌ ±â¼úµÇ¾î ÀÖ´Ù.
"object°¡ ÇÊ¿äÇÑ °æ¿ì applicationÀÌ nullÀ» »ç¿ëÇÏ·Á°í Çϸé throwµÈ´Ù. °¡·É ´ÙÀ½°ú °°Àº °æ¿ìÀÌ´Ù."
- null objectÀÇ instance method È£Ãâ
- null objectÀÇ field(member variables)¿¡ ´ëÇÑ ¾×¼¼½º ¶Ç´Â ±× °ªÀÇ º¯°æ
- nullÀÇ ±æÀ̸¦ ¹è¿Ã³·³ ÃëµæÇÒ °æ¿ì
- nullÀÇ slotÀ» ¹è¿Ã³·³ ¾×¼¼½º ¶Ç´Â ¼öÁ¤
- nullÀ» Throwableó·³ throw ÇÒ °æ¿ì
À§¿¡¼ null object¶ó´Â ¸»ÀÌ µîÀåÇϴµ¥ ÀÌ´Â °øÂüÁ¶¿¡ °´Ã¼°¡ ºÙ¾î ÀÖÁö ¾ÊÀº °ÍÀÌ ¾Æ´Ï¶ó nullÀ» °¡¸®Å°´Â °´Ã¼¶ó°í º¼¼ö ÀÖ´Ù. Áï, °øÂüÁ¶¶ó´Â °ÍÀº JVM¿¡¼ ºÃÀ»¶§ ¾Æ¹«°Íµµ ÂüÁ¶ÇÏÁö ¾Ê´Â°ÍÀÌ ¾Æ´Ï¶ó nullÀ̶ó°í ÇÏ´Â object¸¦ ÂüÁ¶Çϰí Àִ°ÍÀÌ´Ù. ±×·¯³ª JSL 4.3.1¿¡¼´Â ´ÙÀ½°ú °°ÀÌ ³ª¿ÍÀÖ´Ù.
"ÂüÁ¶°ª(reference)Àº ÀÌ·¯ÇÑ °´Ã¼ÀÇ Æ÷ÀÎÅͳª ¾î¶² °´Ã¼µµ ÂüÁ¶ÇÏÁö ¾Ê´Â Ư¼öÇÑ nullÂüÁ¶°¡ µÈ´Ù"
Áï, °øÂüÁ¶´Â ¾î¶² °´Ã¼µµ ÂüÁ¶ÇÏÁö ¾Ê´Â´Ù°í ´ÜÁ¤Çϰí ÀÖ´Ù. ÇÏÁö¸¸ '==' ¿¬»ê¿¡ ÀÖ¾î µÎ°³ÀÇ °´Ã¼°¡ ¸ðµÎ nullÀ̰ųª µ¿ÀÏÇÑ °´Ã¼ ¶Ç´Â ¹è¿ ÂüÁ¶ÀÇ °æ¿ì true¶ó°í µÇ¾îÀִ°ÍÀ¸·Î ºÁ¼ ¼·Î ´Ù¸¥ µÎ °´Ã¼°¡ µ¿ÀÏÇÑ nullÀ» ÂüÁ¶Çϰí ÀÖÀ¸¹Ç·Î true°¡ µÈ°ÍÀÌ ¾Æ´Ñ°¡ ÇÏ´Â »ý°¢À» ÇÒ ¼ö ÀÖ´Ù.
Áï, nullÀÌ ObjectÀÇ instance ÇüÅ´ ¾Æ´ÏÁö¸¸ °³³äÀûÀ¸·Î ºÃÀ»¶§ nullµµ object¶ó°í ºÁ¾ß ÇÏÁö ¾ÊÀ»±î?
2.3 String¿¡ ´ëÇÏ¿© #
String Object¿¡ ´ëÇÑ »ý°¢.
String str = "111222";
String a = "111";
String b = "222";
String c = "111";
String d = b;
String t = str.substring(0,3); //111
À§ÀÇ ¼Ò½º¸¦ º¸°í ´ÙÀ½ÀÌ ÂüÀÎÁö »ý°¢ÇØ º¸ÀÚ. (==¿¬»êÀÚ´Â Æ÷ÀÎÅÍÀÇ ºñ±³ÀÌÁö °ªÀÇ ºñ±³°¡ ¾Æ´Ô)
- str == (a + b) ==> À̰ÍÀº µÎ°³ÀÇ ÂüÁ¶¿Í ÇϳªÀÇ ÂüÁ¶¸¦ ºñ±³ÇßÀ¸¹Ç·Î ´ç¿¬È÷ falseÀÌ´Ù.
- a == b ==> À̰ÍÀº ´ç¿¬È÷ false
- d == b ==> À̰ÍÀº µ¿ÀÏÇÑ referenceÀ̹ǷΠtrue
- a == t ==> a ¿Í t ´Â µÑ´Ù °ªÀÌ "111"ÀÌ´Ù. ÇÏÁö¸¸ À̰ÍÀº ¼·Î ´Ù¸¥ ÂüÁ¶¸¦ °¡Á® falseÀÌ´Ù. ±×·¸´Ù¸é ´ÙÀ½ 5¹øµµ falseÀϱî?
- a == c ==> À̰ÍÀº trueÀÌ´Ù. ¾Æ.. 4¹ø°ú È¥¶õ½º·´´Ù. À̰ÍÀÌ ÂüÀÎ ÀÌÀ¯´Â? ==> À̰ÍÀÇ ÇØ´äÀº JSR 3.10.5¿¡ ´ÙÀ½°ú °°ÀÌ ³ª¿Í Àֱ⠶§¹®ÀÌ´Ù.
"µ¿ÀÏÇÑ ³»¿ëÀÇ ¹®ÀÚ¿ ¸®ÅÍ·²¿¡ °üÇØ¼´Â ÀνºÅϽº¸¦ Çϳª¹Û¿¡ »ý¼ºÇÏÁö ¾Ê´Â´Ù."
Áï, À§ÀÇ a¿Í c ´Â '=' ¸¦ ÀÌ¿ëÇÏ¿© ¹®ÀÚ¿ ¸®ÅÍ·²À» »ý¼ºÇÏ°Ô µÇ´Âµ¥ a ¿¡¼ ÀÌ¹Ì ¸¸µé¾î ³õ¾ÒÀ¸¹Ç·Î c¿¡¼´Â ±×°ÍÀ» ÂüÁ¶ÇÑ´Ù.
2.4 °´Ã¼ÁöÇâÀÇ Ä¸½¶È ÆÄ±« ÁÖÀÇ #
"object pointer¸¦ ¹ÝȯÇÏ´Â getter method´Â °´Ã¼ÁöÇâÀÇ Ä¸½¶È°¡ ÆÄ±«µÉ °¡´É¼ºÀÌ ÀÖ´Ù." ÀÌ´Â objectÇüÀÇ field(member variable)ÀÇ getter¿¡¼ ÀÌ object¸¦ ±×³É ¹ÝȯÇϸé ÀÌ object¸¦ ¹ÞÀºÂÊÀ̳ª ÂüÁ¶Çϰí ÀÖ´Â ´Ù¸¥ÂÊ¿¡¼ ÀÌ objectÀÇ ³»¿ëÀ» º¯°æÇÏ°Ô µÇ¹Ç·Î »ç½Ç ĸ½¶È(Àº´Ð)´Â ÀÌ·ç¾î ÁöÁö ¾Ê¾Ò´Ù°í ºÁ¾ßÇÑ´Ù.
"ÀÌ·² °æ¿ì object¸¦ clone(º¹Á¦) ÇÏ¿© ¹ÝȯÇÏÁö ¾Ê¾Æµµ µÇ´ÂÁö¸¦ ¹Ýµå½Ã »ý°¢ÇØ º»´Ù."
objectÀÇ º¹»ç¿¡´Â shallow copy¿Í deep copy°¡ ÀÖ´Ù.
//(Âü°í)Member¿¡´Â µÎ°³ÀÇ field(Identity Class ÇüÀÇ ID¿Í Family Class ÇüÀÇ family)°¡ ÀÖ´Ù.
/** shallow copy */
Member shallowCopy(){
Member newer = new Member();
newer.id = this.id;
newer.family = this.family;
return newer;
}
/** deep copy */
Member deepCopy(){
Member newer = new Member();
newer.id = new Idetity(this.id.getId(), this.id.getName());
newer.family = new Family(this.family.getFamilyName(), this.family.getFamilyInfo());
return newer;
}
À§ ¼Ò½º¿¡¼ º¸µíÀÌ shallowCopy ´Â object¸¦ º¹»çÇÏ¿© ¹ÝȯÇÑ°Í Ã³·³ º¸ÀÌÁö¸¸, »ç½ÇÀº Member object¸¸ »õ·Î »ý¼ºµÇ¾úÀ»»Ó MemberÀÇ field´Â newer¿Í this µÑ´Ù ¼·Î°°Àº ÈüÀÇ id¿Í family¸¦ ÂüÁ¶ÇÑ´Ù. ÇÏÁö¸¸ µÎ¹øÂ° methodÀÎ deepCopyÀÇ °æ¿ì MemberÀÇ field¸¦ »õ·Î »ý¼ºÇÏ¿© º¹»çÇϹǷΠ¼·Î ´Ù¸¥ id¿Í familyÀÌ´Ù.
"Java¿¡¼´Â cloneÀ̶ó´Â method°¡ ÁغñµÇ¾î »ç¿ëµÇ´Âµ¥ ÀÌ´Â ±âº»ÀÌ shallow copyÀÓÀ» ¸í½ÉÇØ¾ß ÇÑ´Ù. deep copy¸¦ »ç¿ëÇϱâ À§Çؼ´Â clone method¸¦ overloadÇϰųª µû·Î ¸¸µé¾î Á÷Á¢ ±â¼úÇØ¾ß ÇÑ´Ù."
(Âü°í) object¸¦ immutable(º¯ÇÏÁö ¾Ê´Â, ºÒº¯ÀÇ °´Ã¼)·Î ¸¸µå´Â ¿ä·É
- ¸ðµç field(member variable)¸¦ »ý¼ºÀÚ(constructor)¸¦ ÀÌ¿ëÇÏ¿© ÃʱâÈ ÇÑ´Ù.
- ¸ðµç field´Â privateÀ¸·Î ¼±¾ðÇϰí, getter method´Â ¸¸µéµÇ setter´Â ±â¼úÇÏÁö ¾Ê´Â´Ù.
Áï, °ªÀ» º¯°æÇϱâ À§Çؼ´Â object¸¦ ´Ù½Ã ¸¸µé¾î¾ß¸¸ ÇÏ´Â ºÒÆíÀº ÀÖÁö¸¸ ¾ÈÀüÇÏ°Ô »ç¿ëÇÏ·Á ÇÒ¶§ À¯¿ëÇÏ´Ù.
2.5.1 ¹è¿Àº object Àΰ¡? #
JVM¿¡¼ ¹è¿Àº object·Î Ãë±ÞµÇ¾î object¿Í °°ÀÌ aload, astore¿Í °°ÀÌ bytecode·Î ±â¼úµÇ¾î Áø´Ù. int[] iarr = new int10; ¿¡¼ º¸´Â°Í°ú °°ÀÌ new·Î Heap ¿µ¿ª¿¡ object¸¦ »ý¼ºÇϹǷΠobjectÀÓÀ» ¾Ë ¼ö ÀÖ´Ù.
2.5.2 ¹è¿ÀÇ length´Â ¿Ö field(member variable)Àΰ¡? #
StringÀÇ ±æÀ̸¦ ±¸ÇÒ¶§´Â length()¿Í °°ÀÌ method¸¦ ÀÌ¿ëÇϴµ¥ ¹è¿Àº objectÀÓ¿¡µµ ºÒ±¸Çϰí legth¿Í °°ÀÌ Çʵå·Î µÇ¾îÀÖ´Ù. 'ÀÌ·¡µµ Java°¡ ¿ÏÀüÇÑ °´Ã¼ÁöÇâ ¾ð¾îÀΰ¡' ¶ó´Â ÀǽÉÀÌ µé°Ô ÇÑ´Ù. ±×·¸´Ù¸é length°¡ publicÀ̹ǷΠarray.length = 100; °ú °°ÀÌ ÇÏ¸é ¹è¿ Å©±â°¡ º¯°æµÇ³ª?
À̰ÍÀº ÄÄÆÄÀÏ ¿À·ù°¡ ³´Ù. length´Â finalÀÌ¶ó °ªÀ» º¯°æ ÇÒ ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù. ±×·¸´Ù¸é final field·Î ÇÑ ÀÌÀ¯´Â ¹«¾ùÀ̳Ĵ Java News Group¿¡ ã¾Æº¸¸é ´ëºÎºÐÀÌ "È¿À²À» À§Çؼ"¶ó°í µÇ¾î ÀÖ´Ù. JIT compiler¸¦ »ç¿ëÇÏÁö ¾Ê´ÂÇÑÀº methodº¸´Ù´Â field°¡ ºü¸¥°Ç ´ç¿¬ÇÑ °ÍÀÌ´Ù.
±×·±µ¥ Á¤¸» ¾Ë¼ö ¾ø´Â°ÍÀº byte code¿¡¼´Â arraylength¶ó´Â Àü¿ë¸í·ÉÀ¸·Î ÄÄÆÄÀÏ µÈ´Ù. Áï, length´Â JavaÀÇ ¹®¹ýÀÌ ¾îÂîµÇ¾úµç JVM·¹º§¿¡¼´Â field°¡ ¾Æ´Ñ°ÍÀÌ ºÐ¸íÇÏ´Ù. ±×·¸´Ù¸é È¿À²À» À§Çؼ field·Î Çß´Ù´Â °ÍÀº µµµ¥Ã¼ ¹«½¼ ¼Ò¸®Àΰ¡?
Àü¹®°¡µéÀÇ ´ë´ä¿¡´Â À̰ÍÀº JavaÀÇ ¼ö¼ö²²³¢ Áß Çϳª¶ó°í ´ë´äÇÏ´Â »ç¶÷ÀÌ ¸¹´Ù°í ÇÑ´Ù.^^;
2.5.3 final°ú ¹è¿¿¡ ´ëÇÏ¿©... #
¿ì¸®°¡ ÈçÈñ ¾Õ¿¡¼µµ ³ª¿Â¹Ù ÀÖÁö¸¸ finalÀº °ªÀ» º¯°æÇÒ ¼ö ¾ø´Â °ÍÀ̶ó°í¸¸ »ý°¢ÇÏÁö object·Î µÇ¾î ÀÖÀ» °æ¿ì ±× object´Â º¯°æ °¡´ÉÇÏ´Ù´Â °ÍÀ» ÀذïÇÑ´Ù. ¹è¿µµ objectÀ̹ǷΠ¸¶Âù°¡Áö´Ù.
final int[] iarr = new int[5]; Àϰæ¿ì iarr = null; Àº ¿¡·¯°¡ ³ªÁö¸¸ iarr[3] = 5; ´Â ¿¡·¯°¡ ³ªÁö ¾Ê´Â´Ù. Áï, finalÀÌ ÁöÁ¤µÇ¾î Àִ°ÍÀº iarrÀÌÁö iarrÀÌ °¡¸®Å°´Â °÷ ¹è¿ÀÇ ¿ä¼Ò°¡ ¾Æ´Ñ °ÍÀÌ´Ù.
2.5.4 "Java¿¡¼ÀÇ ´ÙÂ÷¿ø ¹è¿Àº Á¸ÀçÇÏÁö ¾Ê´Â´Ù." #
°¡·É 2Â÷¿ø ¹è¿ ó·³ º¸ÀÌ´Â int[][] iarr ¶Ç´Â int[] iarr[] Àº ÀÏÂ÷¿ø ¹è¿ µÎ°³ÀÌÁö 2Â÷¿ø Çà¿ ±¸Á¶°¡ ¾Æ´Ñ°ÍÀÌ´Ù. Áï, µÎ°³ÀÇ ¹è¿Àº °¢°¢ÀÌ ¹è¿·Î µÇ¾î ÀÖ´Â °ÍÀÌÁö Å×À̺í(Çà¿)ÇüŰ¡ ¾Æ´Ï´Ù.
2.6 Àμö(parameter/argument)Àü´ÞÀÇ °³³ä #
2.6.1 "Java¿¡¼ parameter(argument) Àü´ÞÀº ¹«Á¶°Ç 'call by value' ÀÌ´Ù" #
primitive typeÀÇ °æ¿ì È£ÃâÇÑ ÂÊÀÇ º¯¼ö°ªÀº È£Ãâ ¹ÞÀº method³»¿¡¼ °ªÀÌ º¯°æµÇ¾îµµ º¯°æµÇÁö ¾Ê´Â´Ù. reference typeÀÇ °æ¿ìµµ referenceµÇ´Â object¿¡ ´ëÇØ¼´Â ÇÔ²² º¯°æµÇÁö¸¸ reference pointer´Â call by valueÀÌ´Ù. object¸¦ °¡¸®Å°´Â pointer´Â call by value·Î º¯°æµÇÁö¸¸ HeapÀÇ ½ÇÁ¦ object³»¿ëÀº º¯°æµÇÁö ¾Ê´Â´Ù.
2.6.2 "C¿Í °°Àº ¾ð¾î´Â static linkingÀÌÁö¸¸, Java´Â dynamic linkingÀÌ´Ù." #
µû¶ó¼ Java´Â Class ÆÄÀÏÀÌ Ã³À½¿¡ ÇѲ¨¹ø¿¡ memory¿¡ ÀÐÇôÁö´Â °ÍÀÌ ¾Æ´Ï¶ó ·±Å¸Àӽÿ¡ ±×°ÍÀÌ ÇÊ¿äÇØ Á³À»¶§ ÀÐÇôÁö°í ¸µÅ·µÈ´Ù. static fieldÀÇ ¿µ¿ªµµ Class°¡ ÀÐÇôÁö´Â ½ÃÁ¡¿¡ ºñ·Î¼ È®º¸µÈ´Ù. ÀÌ·¸°Ô µÇ¸é ÃÖÃÊ °¡µ¿½Ã°£ÀÌ ´ÜÃàµÇ°í ³¡±îÁö »ç¿ëÇÏÁö ¾Ê´Â ClassÀÇ °æ¿ì ½Å°æ¾µ Çʿ䰡 ¾ø¾îÁö°Ô µÈ´Ù.
µû¶ó¼ static field´Â ÇÁ·Î±×·¥ÀÌ ½ÃÀ۵Ǿî ÇØ´ç Class°¡ ÇÊ¿äÇØ Á³À»¶§ JVMÀÌ ¾Ë¾Æ¼ load/link ÇØ ÁØ´Ù. Áï, static field´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ±â ½ÃÀÛÇÒ ¶§ºÎÅÍ ³¡³¯¶§±îÁö °è¼ÓÇØ¼ Á¸ÀçÇÏ´Â °ÍÀ̶ó°í º¸¸é µÈ´Ù.
(Âü°í) ¸µÅ·(linking)ÀÇ ÀǹÌ
linkµÈ´Ù´Â °ÍÀº Class°¡ memory¿¡ loadingµÉ ¶§ ƯÁ¤ ¸Þ¸ð¸® ¹øÁö¿¡ loadingµÇ´Âµ¥ ÀÌ ¸Þ¸ð¸® ¹øÁö´Â loadingµÉ¶§ ¸¶´Ù ´Ù¸¥ ¹øÁö¼ö¿¡ loadingµÈ´Ù. À̶§ÀÇ ¸Þ¸ð¸® ÁÖ¼Ò°ª(Java¿¡¼´Â ½ÇÁ¦ ¸Þ¸ð¸® °ªÀÌ ¾Æ´Ò ¼ö ÀÖ´Ù)À» ÇöÀç ½ÇÇàÁßÀÎ ÇÁ·Î±×·¥¿¡¼ ¾Ë ¼ö ÀÖµµ·Ï ÇÏ¿© ÇØ´ç Class¿¡ ´ëÇÑ ÂüÁ¶°¡ °¡´ÉÇϵµ·Ï ¿¬°áÇÏ´Â °úÁ¤ÀÌ´Ù.
Á¤Àû(static) link¶ó´Â °ÍÀº ÀÌ·¯ÇÑ ¸Þ¸ð¸®¿¡ ´ëÇÑ ÁÖ¼Ò Á¤º¸¸¦ ÄÄÆÄÀÏ ½Ã¿¡ compiler°¡ ¹Ì¸® °áÁ¤ÇÏ´Â °ÍÀ̰í, µ¿Àû(dynamic) link¶ó´Â °ÍÀº ÇÁ·Î±×·¥ ¼öÇà Áß °áÁ¤µÇ´Â °ÍÀ» ÀǹÌÇÑ´Ù. Á¤ÀûÀÎ linkÀÇ °æ¿ì Á÷Á¢ÀûÀ¸·Î ¸Þ¸ð¸®ÀÇ ¹øÁö°ªÀÌ ÇÒ´ç µÇ´Â °ÍÀÌ ¾Æ´Ï¶ó offset°ª(±âÁØÀ§Ä¡·Î ºÎÅÍÀÇ index°ª)À¸·Î ¿¬°á½ÃŲ´Ù.
2.7.1 "Garbage CollectionÀº ¸¸´ÉÀÌ ¾Æ´Ï´Ù." #
Java¿¡´Â free°¡ ¾ø´Ù. GC°¡ ¾Ë¾Æ¼ ÇØÁØ´Ù. ÇÏÁö¸¸ GC ¼öÇàÁß¿¡´Â ÇÁ·Î±×·¥ÀÌ ¸ØÃß´Â °Í°ú µ¿ÀÏÇÑ Áõ»óÀÌ ³ªÅ¸³ª±â ¶§¹®¿¡ GC°¡ ÀÚÁÖ ¹ß»ýÇÏÁö ¾Êµµ·Ï ÇÁ·Î±×·¥ ÇØ¾ß ÇÑ´Ù. ¼ºñ½º µÇ°í ÀÖ´Â ½Ã½ºÅÛ¿¡¼µµ °¡²û ½Ã½ºÅÛÀÌ ÀÀ´äÀÌ ´Ê¾îÁö´Â ½ÃÁ¡ÀÌ Àִµ¥, ÀÌ´Â GC°¡ ¼öÇàµÇ°í ÀÖ´Â ÁßÀÌ ´ëºÎºÐÀÌ´Ù.
±×·¸´Ù¸é GC°¡ ÀÚÁÖ ¹ß»ýÇÏÁö ¾Êµµ·Ï ÇØ¾ß Çϴµ¥ °¡ÀåÁÁÀº ¹æ¹ýÀº ¹«¾ùÀϱî? ±×°ÍÀº ¹Ù·Î ºÒÇÊ¿äÇÑ °´Ã¼¸¦ »ý¼ºÇÏÁö ¾Ê´Â °ÍÀÌ ¾Æ´Ò±î?
°³ÀÎÀûÀ¸·Î Java¿¡ free°¡ ¾ø´Â°ÍÀÌ ³Ê¹«³ª µçµçÇÏ°Ô ´À²¸Áø´Ù. ÀÌÀ¯´Â µÎ°³ÀÇ º¯¼ö°¡ Heap³»ÀÇ ÇϳªÀÇ object¸¦ referenceÇϰí ÀÖÀ» °æ¿ì ½Ç¼ö·Î ÇϳªÀÇ º¯¼ö¸¸ freeÇØ ¹ö¸®¸é ³ª¸ÓÁö Çϳª´Â dangling pointer¶óÇÏ¿© reference pointer°¡ ¸ð¸£´Â »çÀ̵¥ »ç¶óÁ® ¹ö·Á °ï°æ¿¡ óÇÏ´Â °ÍÀ» ¿¹¹æÇØ Áֱ⠶§¹®ÀÌ´Ù.
Âü°í·Î Object class¿¡´Â finalizer¶ó´Â method°¡ ÀÖ¾î GC ¼öÇà½ÃÁ¡¿¡ È£ÃâµÇ´Â method°¡ ÀÖÁö¸¸ À̰ÍÀº GC°¡ ¾ðÁ¦ ¼öÇàµÉÁö ¾Ë ¼ö ¾øÀ¸¹Ç·Î °ú½ÅÇÏÁö ¸»¾Æ¾ß ÇÒ °ÍÀÌ´Ù.
2.8.1 "°á±¹ Java¿¡´Â pointer°¡ ÀÖ´Â °ÍÀΰ¡, ¾ø´Â °ÍÀΰ¡?" #
Java´Â Heap³»ÀÇ Object¸¦ ÂüÁ¶(reference)Çϰí ÀÖ°í, ÂüÁ¶´Â °á±¹ °³³äÀÌ Æ÷ÀÎÅÍ¿Í °°Àº °ÍÀ̹ǷÎ, "Java¿¡´Â pointer°¡ ¾ø´Ù"´Â °ÍÀº ¾îºÒ¼º¼³ÀÌ´Ù.
// À̺κп¡ ´ëÇØ Object¸¦ ÀÌÇØÇϽøé Á·È÷ ÀÌ·± ¹®Á¦´Â »ç¶óÁú°ÍÀ¸·Î º¾´Ï´Ù.
// Ŭ·¡½º¿¡ ´ëÇÑ ÀνºÅϽº(object)µéÀº reference·Î ¹Û¿¡ °¡Áú(ÂüÁ¶µÉ)¼ö ¾ø±â ¶§¹®ÀÔ´Ï´Ù.
// ÄÄÆÄÀÏ·¯ ÀÔÀåÀÌ ¾Æ´Ñ ¾ð¾î ÀÚüÀÇ »ç»óÀ» °¡Áö°í ½±°Ô ÀÌÇØ½ÃŰ´Â °ÍÀÌ ÁÁÀ»°Í °°½À´Ï´Ù.
JSR 4.3.1À» º¸¸é ´ÙÀ½°ú °°Àº ¸»ÀÌ ³ª¿Â´Ù.
"ÂüÁ¶°ª(reference)Àº °´Ã¼ÀÇ pointerÀ̰ųª, ¶Ç´Â ¾î¶°ÇÑ °´Ã¼µµ ÂüÁ¶ÇÏÁö ¾Ê´Â Ư¼öÇÑ null ÂüÁ¶°¡ µÈ´Ù"
¶ÇÇÑ java.sun.comÀÇ Java programmer's FAQ¿¡ "Java´Â pointer°¡ ¾ø´Ù°í Çϴµ¥, linked list´Â ¾î¶»°Ô ¸¸µé¾î¾ß Çϳª?"¶ó´Â Áú¹®¿¡ ´ÙÀ½°ú °°ÀÌ ´äº¯ÀÌ ³ª¿ÍÀÖ´Ù.
(´äº¯) Java¿¡ °üÇÑ ¸¹Àº ¿ÀÇØÁß¿¡¼ À̰ÍÀÌ °¡Àå ½É°¢ÇÑ °ÍÀÌ´Ù. Æ÷ÀÎÅͰ¡ ¾ø±â´Â Ä¿³ç Java¿¡ ÀÖ¾î °´Ã¼ÁöÇâ ÇÁ·Î±×·¡¹ÖÀº ¿À·ÎÁö pointer¿¡ ÀÇÇØ ÇàÇØÁø´Ù. ´Ù½Ã ¸»»õ °´Ã¼´Â Ç×»ó Æ÷ÀÎÅ͸¦ °æÀ¯Çؼ¸¸ accessµÇ¸ç °áÄÚ Á÷Á¢ÀûÀ¸·Î accessµÇÁö ¾Ê´Â´Ù. pointer´Â reference(ÂüÁ¶)¶ó°í ºÒ¸®¸ç ´ç½ÅÀ» À§ÇØ ÀÚµ¿À¸·Î ÂüÁ¶µÈ´Ù.
"Java¿¡´Â pointer°¡ ¾ø°í ÁÖÀåÇÏ´Â ¸ðµç ¼Àû°ú ±ÛµéÀº JavaÀÇ reference»ç¾ç¿¡ ¸ð¼øµÈ´Ù°í ºÁ¾ß ÇÒ °ÍÀÌ´Ù."
3 »ó¼Ó°ú interfaceÀÇ ¹®Á¦Á¡ #
3.1.1 »ó¼Ó¿¡ ÀÖ¾î¼ÀÇ »ý¼ºÀÚ(constructor) #
"childÀÇ default »ý¼ºÀÚ°¡ ÀÖÀ¸¸é ±× »ý¼ºÀÚ¿¡´Â parentÀÇ »ý¼ºÀÚ(super()) È£ÃâÀÌ compile½Ã ÀÚµ¿ »ðÀԵȴÙ." µû¶ó¼ super() ÀÌÀü¿¡ ´Ù¸¥ Äڵ尡 ÀÖÀ¸¸é object°¡ »ý¼ºµÇ±â ÀÌÀüÀ̹ǷΠ¿À·ù¸¦ ¹ß»ýÇÏ°Ô µÈ´Ù.
3.1.2 "down cast´Â º»ÁúÀûÀ¸·Î ¸Å¿ì À§ÇèÇÏ´Ù" #
down cast - childÀÇ typeÀ¸·Î parent¸¦ casting - ´Â parent ÇüÅÂÀÇ typeÀÌ Á¤¸» child typeÀÎÁö compile½Ã¿¡´Â ¾Ë ¼ö ¾ø´Ù. ½ÇÇà½Ã¿¡ type check°¡ ÀÌ·ç¾î Áö¹Ç·Î runtime½Ã¿¡ ClassCastExceptionÀÌ ¹ß»ýÇÒ °¡´É¼ºÀÌ Ä¿Áø´Ù.
"ÇÁ·Î±×·¡¹Ö½Ã ¿À·ù´Â °¡´ÉÇÑÇÑ compile½Ã¿¡ ó¸®Çϴ°ÍÀÌ ÁÁ´Ù."
3.1.3 "Ãß»óŬ·¡½º¿¡ finalÀÌ ÀÖÀ¸¸é compile errorÀÌ´Ù" #
abstract method°¡ Àִ Ŭ·¡½º´Â Ãß»ó Ŭ·¡½ºÀ̰í Ãß»óŬ·¡½º´Â »ó¼ÓµÇÁö ¾ÊÀ¸¸é ¾Æ¹«·± Àǹ̰¡ ¾ø±â ¶§¹®ÀÌ´Ù.
3.2.1 "interface´Â interfaceÀÏ»Ó ´ÙÁß »ó¼ÓÀÇ ´ë¿ëǰÀÌ ¾Æ´Ï´Ù." #
interface¸¦ method signature - Ãß»óŬ·¡½º¿Í °°ÀÌ ±¸ÇöºÎ´Â ¾øÀÌ ¼±¾ðºÎ¸¸ ÀÖ´Â method - ÀÇ ¿ëµµ·Î »ý°¢Çϴ°ÍÀÌ Java¿¡¼´Â ¿Ç´Ù. Áï, interface´Â final field¿Í abstract method°¡ Àִ Ŭ·¡½º¿Í µ¿ÀÏÇϱä ÇÏÁö¸¸ »ó¼ÓÀÇ Àǹ̿ʹ ±× ¿ëµµ°¡ ´Ù¸£´Ù. °øÅëµÈ typeÀ» Á¤ÀÇÇϴ°ÍÀ¸·Î º¸´Â°ÍÀÌ ¸Â´Â ÀǹÌÀÏ °ÍÀÌ´Ù.
¶ÇÇÑ interface´Â Ŭ·¡½º¸¦ ÀçÀÌ¿ëÇϱâ À§ÇØ »ó¼ÓÀ» »ç¿ëÇÏ¿© ĸ½¶ÈÀÇ ÆÄ±«¸¦ ¼ö¹ÝÇÏ´Â °ÍÀ» ¹æÁöÇÏ´Â ±â´ÉÀÌÀÖ´Ù. »ó¼ÓÀ» »ç¿ëÇÏ¸é ¸ðµÎ ±¸ÇöÈÄ ¸¶Ä¡ ¼Ò½º Äڵ尡 ¿©±âÀú±â õ Á¶°¢À» ÁÖ¿ö ¸ð¾Æ ¸¸µç '´©´õ±â'°°ÀÌ º¸ÀÌ´Â °Í¿¡ ÇѼûÀ» ½® °æÇèÀÌ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ºÎºÐÀ» interface·Î ±¸ÇöÇÏ¸é º¸´Ù ±ò²ûÇÑ Äڵ尡 ³ª¿À°Ô µÈ´Ù. ¹°·Ð public°ú protected¸¦ ÀûÀýÈ÷ Àß »ç¿ëÇØµµ µÇ±ä ÇÏÁö¸¸ ¸»ÀÌ´Ù.
ÇÏÁö¸¸ »ó¼ÓÀº ¸Þ¼Òµå ¿À¹ö¶óÀ̵åÇÑ °æ¿ì Ŭ·¡½º¸¦ ¸¶À½´ë·Î °³Á¶ÇØ ¹ö¸° ¼ÀÀÌ µÇ¹Ç·Î ¾îµð¼±°¡ ¹¦ÇÑ ¸ð¼øÀÌ ¹ß»ýÇÏ°Ô µÉ °¡´É¼ºµµ ³ô¾ÆÁú»Ó ¾Æ´Ï¶ó Ãß»óŬ·¡½ºÀÇ °æ¿ì ½ÇÁ¦ ±¸ÇöºÎ°¡ ¾îµð¿¡ À§Ä¡ÇÏ´ÂÁöµµ ¿¡¸ÅÇÏ°Ô ´À²¸Áú ¼ö ÀÖ¾î ºÒ¾ÈÇÑ Äڵ尡 µÇ°í ¸¸´Ù.
3.3 »ó¼Ó Á¦´ë·Î »ç¿ëÇϱâ #
"±×·¸´Ù¸é Á¦´ë·Î µÈ »ó¼ÓÀº ¾î¶»°Ô ÆÇ´ÜÇÒ ¼ö ÀÖÀ»±î?"
»ó¼ÓÀº 'is a'°ü°è°¡ ¼º¸³ÇØ¾ß ¿Ã¹Ù¸£´Ù. Áï '¼ºêŬ·¡½º(ÀÚ½Ä) is a ½´ÆÛŬ·¡½º(ºÎ¸ð)'°¡ ¼º¸³ÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¸é Red is a Color´Â ¿Ã¹Ù¸¥ ¸íÁ¦ÀÌÁö¸¸ Engine is a Car´Â 'has a'°ü°èÀ̹ǷΠ»ó¼ÓÀ̶ó°í º¼ ¼ö ¾ø´Ù.
"µû¶ó¼ 'has a'°ü°è´Â »ó¼ÓÀÌ ¾Æ´Ï¹Ç·Î composition°ú delegationÀ» ÀÌ¿ëÇÏ¸é µÈ´Ù."
compositionÀº '°´Ã¼¸¦ field°¡ °®°Ô ÇÏ´Â ¹æ¹ý'À» ÀÇÇϹǷΠ'has a'°ü°è°¡ Á¤È®È÷ ¼º¸³ÇÑ´Ù.
"»ó¼Ó ´ë½Å composition°ú delegation(Á¶ÀÛÀ̳ª 󸮸¦ ´Ù¸¥ °´Ã¼¿¡ À§ÀÓ)À» »ç¿ëÇÏ¸é ´ÙÀ½°ú °°Àº ÀÌÁ¡ÀÌ ÀÖ´Ù."
- »ó¼Ó¿¡¼´Â ½´ÆÛŬ·¡½º°¡ Çã¿ëÇϰí ÀÖ´Â Á¶ÀÛÀ» ¼ºêŬ·¡½º¿¡¼ ¸ðµÎ Çã¿ëÇØ¾ß ÇÏÁö¸¸, composition°ú delegation¿¡¼´Â Á¶ÀÛÀ» Á¦ÇÑÇÒ ¼ö ÀÖ´Ù.
- Ŭ·¡½º´Â °áÄÚ º¯°æÇÒ ¼ö ¾øÁö¸¸, compositionÇϰí ÀÖ´Â °´Ã¼´Â ÀÚÀ¯·Ó°Ô º¯°æÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é Çлý Ŭ·¡½º°¡ ¿µ¿øÀÌ ÇлýÀÌ ¾Æ´Ï¶ó ³ªÁß¿¡ ÃëÁ÷À» ÇÏ¿© Á÷ÀåÀΠŬ·¡½º°¡ µÉ¼ö ÀÖ´Ù.
»ó¼ÓÀ» composition°ú delegationÀ¸·Î º¯°æÇÏ´Â ¿ä·ÉÀº? ¿©±â¼ Shape¸¦ »ó¼ÓÇÑ Polyline°ú CircleÀ» º¯°æÇÑ´Ù¸é ´ÙÀ½°ú °°´Ù.
- Shape(ºÎ¸ð)ÀÇ °øÅëµÈ ³»¿ëÀ» ±¸ÇöÇÑ ±¸Çö Ŭ·¡½º(ShapeImpl)¸¦ ¸¸µç´Ù.
- Polyline°ú Circle Ŭ·¡½º¿¡¼ ShapeImplÀ» compositionÇÏ°í ºÎ¸ð¿Í °øÅëµÇÁö ¾Ê´Â method¸¦ °¢°¢ À§ÀÓ ¹Þ´Â´Ù.
- ShapeImpl Ŭ·¡½ºÀÇ method¸¦ ÃßÃâÇÑ ShapeIF interface¸¦ ÀÛ¼ºÇϰí Polyline°ú Circle¿¡¼´Â implements ÇÑ´Ù.
4 package¿Í access Á¦¾î¿¡ °üÇÑ ÀÌÇØ #
4.1.1 "package´Â '°èÃþ±¸Á¶' Àΰ¡?" #
óÀ½ Java¸¦ Á¢ÇÏ¸é¼ package¿¡ ´ëÇØ ÀÌÇØÇÒ¶§ ¸¶Ä¡ ÆÄÀϽýºÅÛ°ú °°Àº °èÃþ±¸Á¶¶ó°í ÀÌÇØÇÏ°Ô µÇ¾î ' import /test/*.class '´Â ¿Ö ¾ÈµÇ´ÂÁö ÀǾÆÇØ Çß´ø ±â¾ïÀÌ ÀÖ´Ù. ±×¸®°í ºÎ¸ð directory¿¡ Àִ Ŭ·¡½º¿¡¼ ¿Ö ÀÚ½Ä directory¿¡ ÀÖ´Â Class¸¦ import¾øÀÌ »ç¿ëÇÒ ¼ö ¾ø´ÂÁöµµ ÀÌ»óÇß´Ù.
Áï, package¿¡¼ µ¿ÀÏ ºÎ¸ð¶óµµ ¼·Î ´Ù¸¥ package´Â ¿ÏÀüÈ÷ º°°³ÀÇ package¿´´ø °ÍÀÌ´Ù. ÀÌ ºÎºÐ¿¡ °üÇØ¼´Â JLS 7.1 ¿¡¼ ´ÙÀ½°ú °°ÀÌ ±â¼úµÇ¾î ÀÖ´Ù°í ÇÑ´Ù.
"package°¡ °èÃþÀûÀÎ À̸§ ±¸Á¶·Î µÇ¾î ÀÖ´Â °ÍÀº °ü·ÃµÈ package¸¦ ÀÏÁ¤ ±Ô¾à¿¡ µû¶ó ü°èÈÇϱâ À§ÇؼÀ̰í, package ¾È¿¡¼ ¼±¾ðµÇ¾î ÀÖ´Â top-levelÇü°ú µ¿ÀÏÇÑ À̸§À» °¡Áø ¼ºê package¸¦ °®´Â °ÍÀÌ ±ÝÁöµÇ¾î ÀÖ´Â Á¡À» Á¦¿ÜÇÏ¸é Æ¯º°ÇÑ Àǹ̴ ¾ø´Ù."
Áï, Java¿¡¼´Â packageÀ̸§À» °èÃþÀûÀ¸·Î ¸í¸íÇÒ ¼ö ÀÖÀ»»Ó package±¸Á¶ ÀÚü¿¡´Â ¾î¶² °èÃþÀûÀÎ ÀÇ¹Ì ºÎ¿©µµ ÇÒ ¼ö ¾ø´Â °ÍÀÌ´Ù. ´Ù½Ã ¸»Çؼ Java¿¡¼´Â packageÀ̸ªÀ» °èÃþÀûÀ¸·Î ¸í¸íÇÒ ¼ö ÀÖÀ» »Ó ±¸Á¶ÀÚü´Â ÆòÆòÇÑ °ÍÀÌ´Ù. ½ÇÁ¦·Î ¹ÙÀÌÆ® ÄÚµåÀÇ ³»¿ëÀ» º¸¸é ±ú¾îÁø ³»¿ëÁß¿¡ java/lang/String°ú °°ÀÌ ¿ÏÀüÇÑ ÇÑÁ¤À̸§À» classÀ̸§À¸·Î »ç¿ëµÊÀ» ¾Ë ¼ö ÀÖ´Ù.
4.1.2 "compiler °¡ ÀνÄÇÏ´Â class°Ë»ö ¼ø¼(¼Ò½ºÄڵ峻 Ŭ·¡½º°¡ ¹ß°ßµÉ °æ¿ì ±× Ŭ·¡½ºÀÇ À§Ä¡¸¦ ã´Â ¼ø¼)" #
- ±× classÀÚ½Å
- ´ÜÀÏÇü½ÄÀ¸·Î ÀÓÆ÷Æ®µÈ class
- µ¿ÀÏÇÑ ÆÐŰÁö¿¡ Á¸ÀçÇÏ´Â ´Ù¸¥ class
- ¿Âµð¸àµå Çü½Ä(..* ÇüÅÂ) ÀÓÆ÷Æ® ¼±¾ðµÈ class
4.2 access Á¦¾î #
publicÀº ´Ù¸¥ package¿¡¼ ÂüÁ¶ °¡´ÉÇϰí, ¹«ÁöÁ¤ÇÒ °æ¿ì µ¿ÀÏÇÑ package³»¿¡¼¸¸ ÂüÁ¶ °¡´ÉÇÏ´Ù.
4.2.1 "interfacde memberÀÇ access Á¦¾î" #
interfaceÀÇ member field/method´Â ¸ðµÎ publicÀÌ´Ù. interface member¿¡ protected³ª privateÀ» ÁöÁ¤ÇÒ ¼ö´Â ¾ø´Ù. ¶ÇÇÑ publicÀ» ÁöÁ¤ÇÒ Çʿ䵵 ¾ø´Ù. ÁöÁ¤Çصµ »ó°ü¾øÁö¸¸ JLS 9.4¿¡¼´Â ´ÙÀ½°ú °°ÀÌ ¸í½ÃµÇ¾î ÀÖ´Ù.
"interfaceÀÇ method¿¡ ´ëÇÏ¿© public ¼ö½ÄÀÚ¸¦ ÁöÁ¤ÇÏ´Â °ÍÀÌ Çã¿ëµÇ°í ÀÖÁö¸¸, style·Î¼´Â ÀüÇô ±ÇÀåÇÒ ¼ö ¾ø´Ù."
Áï, interface member´Â ¸ðµÎ publicÀ̶ó µÇ¾î ÀÖ´Â °ÍÀÌ´Ù. ¶ÇÇÑ James Goslingµµ ÁýÇÊ¿¡ Âü°¡ÇÑ 'ÇÁ·Î±×·¡¹Ö ¾ð¾î Java 3ÆÇ'¿¡¼´Â ´ÙÀ½°ú °°ÀÌ ±â¼úµÇ¾î ÀÖ´Ù°í ÇÑ´Ù.
"publicÀÌ ¾Æ´Ñ member¸¦ interface¿¡°Ô °®°Ô ÇÏ´Â °ÍÀº ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù. interfaceÀÇ member¿¡ ´ëÇÑ accessÁ¦¾î¿¡ interface ÀÚ½ÅÀÇ access Á¦ÇÑÀ» Àû¿ëÇÏ´Â °ÍÀ̹ǷΠÀ̰ÍÀº ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù."
4.2.2 ±×·¸´Ù¸é interface¸¦ ´Ù¸¥ package¿¡ ´ëÇÏ¿© ¼û±â°í ½ÍÀ¸¸é ¾î¶»°Ô Çϴ°¡? #
±×°ÍÀº interface ÀÚü ¼±¾ð¿¡ publicÀÌ ¾Æ´Ñ °ÍÀ» Àû¿ëÇÏ¸é µÇ´Â °ÍÀÌ´Ù. memberº°·Î Á¦¾îÇÒ ¼ö ¾ø¾î ºÒÆíÇÑ ¸éµµ ÀÖÁö¸¸, ³ª¸§´ë·Î ±×·² µíÇÑ ±ÔÄ¢ÀÌ´Ù. ÇÏÁö¸¸ À̰ÍÀº Á¤¸» ÀÌ»óÇÑ ³í¸®°¡ ¾Æ´Ò¼ö ¾ø´Ù. publicÀÌ ¾Æ´Ñ interface¿¡ public method°¡ ¹«½¼ Àǹ̰¡ ÀÖ´ÂÁö ¾Ë ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ÀÌ interface¸¦ ±¸ÇöÇÑ Å¬·¡½º¿¡¼µµ method´Â ¸ðµÎ publicÀÌ µÇ¾î¾ß Çϴµ¥, À̰͵µ ¾Æ¹«·¡µµ ÀÌ»óÇÏ´Ù.
5.1.1 "Multi Thread¿¡¼´Â È帧Àº º¹¼öÀÌÁö¸¸ data´Â °øÀ¯µÉ ¼ö ÀÖ´Ù." #
Multi processing¿¡¼´Â È帧Àº º¹¼öÀÌÁö¸¸ data´Â µ¶¸³µÇ¾î ÀÖ´Ù. ÇÏÁö¸¸ Multi Thread¿¡¼´Â Heap°ú static¿µ¿ª¿¡ °üÇÑ ÇÑ 2°³ ÀÌ»óÀÇ Thread »çÀÌ¿¡ °øÀ¯°¡ ÀÌ·ç¾î Áø´Ù. µû¶ó¼ 2°³ ÀÌ»óÀÇ Thread¿¡¼´Â µ¿ÀÏÇÑ static field¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ°í, µ¿ÀÏÇÑ °´Ã¼¿¡ Á¢±ÙÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª stack¸¸Àº Threadº°·Î µ¶¸³µÇ¾î ÀÖ´Ù. stackÀº method¿¡ µé¾î°¡´Â ½ÃÁ¡¿¡ È®º¸µÇ°í ºüÁ® ³ª¿À´Â ½ÃÁ¡¿¡ È®º¸µÇ°í ºüÁ® ³ª¿À´Â ½ÃÁ¡¿¡ Free µÇ¹Ç·Î 2°³ ÀÌ»óÀÇ Thread¿¡¼ °øÀ¯ÇÒ ¼ö´Â ¾ø´Â °ÍÀÌ´Ù.
5.1.2 "Thread´Â °´Ã¼¿Í Á÷±³ÇÏ´Â °³³äÀÌ´Ù." #
Multi Thread´Â ¾îµð±îÁö³ª Thread¶ó´Â ó¸® È帧ÀÌ ¿©·¯ °³ Á¸ÀçÇÒ ¼ö ÀÖ´Ù´Â ÀǹÌÀÌ´Ù. ¿ä¾àÇÏ¸é ´ÙÀ½ 3°¡Áö ÀÌ´Ù.
- Multi Thread¿¡¼´Â Thread¶ó´Â ó¸® È帧ÀÌ 2°³ ÀÌ»ó Á¸ÀçÇÒ ¼ö ÀÖ´Ù.
- ¾î¶² Thread¿¡¼ ¿òÁ÷À̱⠽ÃÀÛÇÑ method°¡ ´Ù¸¥ method¸¦ È£Ãâ ÇßÀ»¶§ È£ÃâµÈ ÃøÀÇ method´Â È£ÃâÇÑ ÃøÀÇ method¿Í µ¿ÀÏÇÑ Thread¿¡¼ µ¿ÀÛÇÑ´Ù.
- ThreadÀÇ °æ°è¿Í °´Ã¼ÀÇ °æ°è´Â ÀüÇô °ü°è°¡ ¾ø´Ù. Áï, Thread¿Í °´Ã¼´Â Á÷±³Çϰí ÀÖ´Ù.
5.1.3 "Synchronized ÀÇ ÀÌÇØ" #
Multi Thread ±â¹ÝÀÇ programming½Ã¿¡ synchronized¸¦ ³õÃÄ ÀÚÁÖ´Â ÀϾÁö ¾ÊÀ¸³ª ¹º°¡ À߸øµÇ¾î °¡´Â°ÍÀ» °æÇèÇÑ ÀûÀÌ ÀÖ´Ù. Áï, À̰ÍÀÌ ¿øÀÎÀÌ µÇ¾î ¹ö±×°¡ ¹ß»ýÇÑ °æ¿ì ±× ¹ö±×´Â ÀçÇö¼ºÀÌ Áö±ØÈ÷ ³·¾ÆÁö±â ¶§¹®¿¡ ²Ï °í»ýÀ» ÇÏ°Ô µÈ´Ù. ÀÌ·± »çŰ¡ ¹ß»ýÇÏ°Ô µÇ¸é ¹ö±×ÀÇ ¿øÀÎÀ» ã±â°¡ ¾î·Æ°Ô µÇ°í ÇØ´ç applicationÀº ¾ðÁ¦ ¹ß»ýÇÒÁöµµ ¸ð¸£´Â ¿À·ù°¡ ÀÖ´Â »óÅ ±×´ë·Î ¿î¿µµÇ±â ¶§¹®¿¡ ½É°¢¼ºÀÌ ³»Æ÷µÇ¾î ÀÖ´Ù°í ÇÒ ¼ö ÀÖ´Ù.
ÀÌ·¯ÇÑ »çŸ¦ ¹æÁöÇϱâ À§Çؼ´Â critical sectionÀ» 2°³ ÀÌ»óÀÇ Thread°¡ µ¿½Ã¿¡ ½ÇÇàµÇÁö ¾Êµµ·Ï '¹èŸ Á¦¾î'¸¦ ÇØ¾ßÇÑ´Ù. ±× Ű¿öµå°¡ ¹Ù·Î synchronizedÀÌ´Ù.
synchronized¿¡´Â synchronized(obj){} ÇüÅÂ¿Í method¿¡ synchronized ¸¦ ºÙÀÌ´Â µÎ°¡Áö ¹æ¹ýÀÌ Àִµ¥, ÀÌ µÑÀº ¹üÀ§¸¸ °°´Ù¸é °°Àº ÀǹÌÀÌ´Ù. ¿¹¸¦ µé¾î ¼³¸íÇϸé, ¾Æ·¡ÀÇ ¼Ò½º¿¡¼ method1()°ú method2()´Â µ¿ÀÏÇÏ´Ù.
synchronized void method1(){
...
}
void method2(){
synchronized(this){
...
}
}
ÀÌ·¸°Ô µ¿ÀÏÇÑ Àǹ̸¦ µÎ°¡Áö·Î ¸¸µç°ÍÀº method´ÜÀ§·Î synchronized¸¦ °É ÀÏÀÌ ±×¸¸Å ¸¹´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¸¹ÀÌµé ¿ÀÇØÇϰí ÀÖ´Â ºÎºÐÀÌ À§ÀÇ ¼Ò½º¿¡¼ ¾Ë¼ö ÀÖµíÀÌ method¿¡ synchronized¸¦ »ç¿ëÇÑ´Ù´Â °ÍÀº '±× °´Ã¼¿¡ ÇØÇÑ Á¶ÀÛÀº µ¿½Ã¿¡ ÇϳªÀÇ Thread¶ó´Â °ÍÀÌÁö method È£ÃâÀÌ ÇϳªÀÇ Thread°¡ ¾Æ´Ñ°ÍÀÌ´Ù'
±×·¸´Ù¸é, Thread A°¡ objÀÇ LockÀ» ¼³Á¤Çϰí ÀÖ´Â »óÅ¿¡¼ ´Ù½Ã Çѹø Thread A ÀÚ½ÅÀÌ objÀÇ LockÀ» ¼³Á¤ÇÏ¸é ¾î¶»°Ô µÉ±î? ÀÌ °æ¿ì Thread A´Â ÀÌ¹Ì ÀÌ obj¿¡ ´ëÇÏ¿© LockÀ» º¸À¯Çϰí ÀÖÀ¸¹Ç·Î ±â´Ù¸®Áö´Â ¾Ê¾Æµµ µÈ´Ù. À§ÀÇ ¼Ò½º¿¡¼ method1¿¡¼ method2¸¦ È£ÃâÇÑ´Ù¸é?
method1¿¡¼ ÀÌ¹Ì objÀÇ LockÀ» º¸À¯ ÇßÀ¸¹Ç·Î method2ÀÇ synchronized(this) ºÎºÐ¿¡¼´Â LockÀ» ±â´Ù¸®Áö ¾Ê¾Æµµ µÈ´Ù.
Áï, LockÀÇ ±âÁØÀÌ Æ¯Á¤Thread¿¡ ÀÖ¾î¼ LockÀÇ ±âÁØÀÌ method°¡ ¾Æ´Ñ objectÀÎ °ÍÀÌ´Ù. ÀÌ ±ÔÄ¢ ´öºÐ¿¡ synchronized methodµµ Àç±ÍÈ£ÃâÀÌ °¡´ÉÇØÁö°í, synchronized method°¡ µ¿ÀÏÇÑ instanceÀÇ synchronized method¸¦ È£ÃâÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù.
ÁÖÀÇÇÒ Á¡Àº static method¿¡ synchronized°¡ ÀÖ´Ù¸é staticÀº thisÂüÁ¶°¡ ¾ø´Ù°í À§¿¡¼ ¼³¸íÇÏ¿´À¸¹Ç·Î, ÀÌ Å¬·¡½ºÀÇ Class °´Ã¼¸¦ LockÇÏ°Ô µÈ´Ù. ±âÁØÀÌ xx.Class°¡ µÇ´Â °ÍÀÌ´Ù.
5.1.4 "Thread »ç¿ë¹ýÀÇ Á¤¼®Àº?" #
Thread »ç¿ë¹ý¿¡´Â ´ÙÀ½ µÎ°¡ÁöÀÇ Á¤¼®ÀÌ ÀÖ´Ù.
- RunnableÀ» implementsÇϰí ThreadÀÇ ÂüÁ¶¸¦ º¸À¯(composition) ÇÏ´Â ¹æ¹ý. À̰æ¿ì´Â ´ÜÁö Runnable¸¸ implementÇÔÀ¸·Î¼ ÇØ°áµÇ´Â °æ¿ì°¡ ´ëºÎºÐÀ̱ä ÇÏÁö¸¸, ±× class ³»¿¡¼ ÇØ´ç classÀÇ Thread¸¦ Á¶ÀÛÇÏ°Ô µÈ´Ù¸é compositionÇÑ Thread °´Ã¼¿¡ delegationÇÏ¸é µÈ±â ¶§¹®ÀÌ´Ù.
- Thread class¸¦ »ó¼ÓÇÏ´Â ¹æ¹ý. JDKÀÇ ¼Ò½º¸¦ º¸¸é Thread class¿¡´Â RunnableÀ» implements Çϰí ÀÖ´Ù. ±×¸®°í run method´Â native methodÀÌ´Ù. µû¶ó¼ Thread¸¦ »ó¼ÓÇÑ ¸ðµç Ŭ·¡½º´Â »ç½Ç RunnableÀ» implementsÇϰí ÀÖ´Â °ÍÀÌ´Ù. run method´Â abstract°¡ ¾Æ´Ï¹Ç·Î ±¸ÇöµÇ¾î ÀÖ°í ¿ì¸®´Â À̸¦ ¿À¹ö¶óÀ̵åÇÏ¿© »ç¿ëÇϰí ÀÖ´Ù. ÀÌ ¹æ½ÄÀ» »ç¿ëÇϸé ThreadÀÇ method¸¦ ¾ÈÆÅÀ¸·Î ÀÚÀ¯·Ó°Ô È£ÃâÇÒ ¼ö ÀÌÁö¸¸, ÀÌ¹Ì ´Ù¸¥ class¸¦ »ó¼ÓÇϰí ÀÖ´Ù¸é ÀÌ ¹æ½ÄÀ» »ç¿ëÇÒ ¼ö´Â ¾ø´Ù.
JDK API ReferenceÀÇ Runnable¿¡ °úÇÑ ¼³¸íÁß¿¡ ´ÙÀ½°ú °°Àº ³»¿ëÀÌ ÀÖ´Ù.
"Thread classÀÇ methodÁß run method¸¸À» ¿À¹ö¶óÀ̵åÇÏ¿© »ç¿ëÇÏ´Â °æ¿ì´Â Runnable interface¸¸ implementsÇÏ¿© »ç¿ëÇÏ¸é µÈ´Ù. ¿Ö³ÄÇϸé, classÀÇ ±âº»ÀûÀÎ µ¿ÀÛÀ» ¼öÁ¤ ¶Ç´Â È®ÀåÇÏÁö ¾Ê´ÂÇÑ ±× class¸¦ sub classÈ ÇÏ´Â °ÍÀº ¹Ù¶÷Á÷ÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù."
±×·¸´Ù¸é À§¿¡¼ ¾ðÁ¦³ª 1)¹ø ¹æ½ÄÀ» »ç¿ëÇÏ¸é µÇ´Â °Í ¾Æ´Ñ°¡ ¶ó´Â Àǹ®ÀÌ »ý±â°Ô µÈ´Ù. ¿Ö ±ÍÂú°Ô 2)ÀÇ ¹æ¹ýÀ» °í¹ÎÇÏ´Â °ÍÀΰ¡, ±Ø´ÜÀûÀ̱ä ÇÏÁö¸¸ ¸¸ÀÏ¿¡ »çÅ¿¡ ÀÌ Å¬·¡½º°¡ ´Ù¸¥ Ŭ·¡½º¸¦ »ó¼Ó¹Þ°Ô µÇ´Â °æ¿ìµµ ÀÖÀ»¼ö Àִµ¥.
ÇÏÁö¸¸ À̰ÍÀº ¾Æ´Ò°ÍÀÌ´Ù. ¸¸¾à ÀÌ·¸´Ù¸é Thread class°¡ RunnableÀ» implementsÇÒ Çʿ䰡 ¾ø¾úÀ» °ÍÀ̱⠶§¹®ÀÌ´Ù. ¶ÇÇÑ Thread´Â »ý¼ºÀÚÀÇ Àμö·Î RunnableÀÇ reference¸¦ ÃëµæÇÑ ÈÄ °è¼ÓÇØ¼ ±×°ÍÀ» º¸À¯ÇÑ´Ù´Â °Íµµ ÀÌ»óÇÏ´Ù. Thread¿¡ ÀÖ¾î RunnableÀÌ ÇÊ¿äÇÑ °ÍÀº start() ¶§ »ÓÀ̹ǷΠstart()ÀÇ Àμö·Î RunnableÀ» °Ç³×Á൵ ÁÁÀ» °ÍÀÌ´Ù.
±×·³¿¡µµ ºÒ±¸ÇÏ°í ±»ÀÌ Thread¿¡¼ °è¼ÓÀûÀ¸·Î RunnableÀ» º¸À¯Çϰí ÀÖ´Â °ÍÀº Runnable°´Ã¼¿Í Thread¸¦ °ÇÏ°Ô °áÇÕ½ÃŰ·Á´Â Àǵµ ¶§¹®ÀÌ´Ù. À̰ÍÀº ÀǵµÀûÀ¸·Î À§ÀÇ 2)ÀÇ ¹æ¹ýÀ» ±ÇÀåÇÏ´Â µíÇÑ ´À³¦À» ¹Þ°Ô Çϴµí ÇÏ´Ù.
±×·¸´Ù¸é API ReferenceÀÇ ¸»Àº ´ÜÁö »ó¼ÓÀ» ÇÇÇ϶ó´Â Àǹ̸¸ ÀÖ´Â °ÍÀΰ¡? ¸¶Áö¸·À¸·Î ÇѰ¡Áö ÃßÁ¤ÀÌ µÇ´Â ºÎºÐÀº Thread¿¡´Â suspend()³ª stop()µî°ú °°Àº method°¡ ÇöÀç ¸ðµÎ deprecateµÇ¾ú´Ù. ¶ÇÇÑ sleep()À̳ª yield()´Â ¸ðµÎ static methodÀ̹ǷΠ±»ÀÌ Thread °´Ã¼¸¦ º¸À¯ÇÒ Çʿ䰡 ¾ø´Ù.
±×·¸´Ù¸é À§ÀÇ 1)ÀÇ ¹æ¹ý¿¡¼ Thread°´Ã¼¸¦ compositionÇÒ Çʿ䰡 ¾ø¾îÁø´Ù.
"±×·¸´Ù¸é Thread¸¦ ¾Æ¹«µµ º¸À¯ÇÏÁö ¾Ê°í Runnable¸¸ implementsÇÑ ¹æ½ÄÀÌ ÃÖ¼±Àΰ¡?"
¹«¾ùÀÌ Á¤´äÀÎÁö µµ¹«Áö ¾Ë±æÀÌ ¾ø´Ù. ^^;
5.2.1 "finally ÀýÀº ¹Ýµå½Ã ¾î¶°ÇÑ °æ¿ì¿¡µµ ½ÇÇàµÇ´Â°¡?" #
try ~ catch ¹®ÀÇ finally ÀýÀº 'loop¶ó¸é break, method¶ó¸é return Àý'À» ¸¸³ªµµ µÚ¿¡ ÀÖ´Â finallyÀýÀº ¼öÇàµÈ´Ù. ÇÏÁö¸¸ ´ÙÀ½ÀÇ °æ¿ì´Â ±×·¸Áö ¾Ê´Ù.
try{
...
System.exit(1);
}catch(...){
}finally{
... //ÀÌ ºÎºÐÀº ½ÇÇàµÇÁö ¾Ê´Â´Ù.
}
5.2.2 "¿¹¿ÜÀÇ Á¾·ù 3°¡Áö (Error, RuntimeException, ±×¹ÛÀÇ Exception)" #
ÀÌ¿¡ °üÇØ¼± JLS 11.2.1¿¡ ´ÙÀ½°ú °°ÀÌ ±â¼úµÇ¾î ÀÖ´Ù. "üũµÇÁö ¾Ê´Â ¿¹¿Ü Ŭ·¡½º(Error¿Í ±× Sub class)´Â ÇÁ·Î±×·¥¾ÈÀÇ ´Ù¾çÇÑ À§Ä¡¿¡¼ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖÀ¸¸ç, ȸº¹ÀÌ ºÒ°¡´ÉÇϱ⠶§¹®¿¡ ÄÄÆÄÀϽà üũµÇÁö ¾Ê´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¿¹¿Ü¸¦ ÇÁ·Î±×·¥¿¡¼ ¼±¾ðÇÑ´Ù°í ÇØµµ ³ÀâÇÏ°í ¹«ÀǹÌÇÑ °ÍÀÌ µÉ »ÓÀÌ´Ù."
JavaÀÇ Å¬·¡½º librury¿¡¼ ErrorÀÇ sub class¸¦ »ìÆìºÁµµ AWTError, LinkageError, ThreadDeath, VirtualMachineError µî 'catchÇØµµ ¼Ò¿ë ¾øÀ» °Í' µé »ÓÀÌ´Ù. (OutOfMemoryError´Â VirtualMachineError ¾Æ·¡¿¡ À§Ä¡ÇÑ´Ù.)
5.2.2.2 RuntimeException #
À§ÀÇ Error ÀÌ¿ÜÀÇ ExceptionµéÀº application¿¡¼ catchÇÒ °¡´É¼ºÀÌ ÀÖ´Â ¿¹¿ÜµéÀÌ´Ù.(¹ö±×°¡ ¾øÀ¸¸é ¹ß»ýÇÏÁö ¾Ê´Â ¿¹¿Üµé) ±×¸®°í RuntimeExceptionÀº '¾îµð¼µç ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ´Â ¿¹¿Ü'ÀÌ´Ù. RuntimeExceptionÀÇ sub class·Î´Â NullPointerException, ArrayIndexOutOfBoundException, ClassCastException µîÀ» µé ¼ö ÀÖ´Ù. 'ÀÌ·¯ÇÑ ¿¹¿Ü´Â ¹ö±×°¡ ¾ø´Â ÇÑ ¹ß»ýÇÏÁö ¾ÊÀ¸¹Ç·Î ÀÏÀÏÀÌ throws ¸¦ ÀÛ¼ºÇÏÁö ¾Ê¾Æµµ µÈ´Ù.'
ÇÁ·Î±×·¥¿¡ ¹ö±×°¡ ¾ø´Â ÇÑ ¹ß»ýÇÒ ¼ö ¾ø´Â ¿¹¿Ü°¡ ¹ß»ýÇÑ °æ¿ì C ¾ð¾î¿Í °°ÀÌ ¿µ¿ª ÆÄ±«°¡ ÀϾ±â ½¬¿î ¾ð¾î¶ó¸é ÇÁ·Î±×·¥ Àüü¸¦ Á¾·á½ÃŰ´Â °ÍÀÌ Á¤´äÀ̰ÚÁö¸¸, Java¿Í °°ÀÌ ¿µ¿ªÆÄ±«°¡ ÀϾÁö ¾Êµµ·Ï ½ÇÇà½Ã üũ(JVM ClassloaderÀÇ formal verification process)¸¦ ÇÏ°í µ¿ÀûÀ¸·Î ÇÁ·Î±×·¥À» loadÇÏ´Â ¾ð¾î¿¡¼´Â ±¹¼ÒÀûÀÎ NullPointerException ¶§¹®¿¡ ÇÁ·Î±×·¥ Àüü¸¦ ÁßÁö½ÃÄѼ´Â ¾È µÉ °ÍÀÌ´Ù.
µû¶ó¼, RuntimeExceptionÀº catchÇÏÁö ¾Ê´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù°í º¼ ¼ö ÀÖ´Ù. ¹ö±×°¡ ÀÖ´Â ÇÁ·Î±×·¥Àº ½Å¼ÓÈ÷ Á¾·á½ÃŰ´Â °ÍÀÌ ´ëºÎºÐÀÇ °æ¿ì ÃÖ¼±ÀÇ ¹æÃ¥À̶ó »ý°¢Çϱ⠶§¹®ÀÌ´Ù.
5.2.2.3 ±×¹ÛÀÇ Exception #
À§ÀÇ RuntimeExceptionÀÌ¿ÜÀÇ ExceptionÀÇ sub class´Â »ç¿ëÀÚÀÇ À߸øµÈ Á¶ÀÛ µîÀ¸·Î ÀÎÇØ ÇÁ·Î±×·¥¿¡ ¹ö±×°¡ ¾ø¾îµµ ¹ß»ýÇÒ °¡´É¼ºÀÌ ÀÖ°í ±×¿¡ ´ëÇÏ¿© ÇÁ·Î±×·¥ÀÌ È®½ÇÈ÷ ´ëÀÀÇØ¾ß ÇÏ´Â °æ¿ì¿¡ »ç¿ëµÈ´Ù. ¿¹¸¦ µé¸é FileNotFoundExceptionµîÀÌ´Ù.
±×·±µ¥ °³¹ßÇÏ´Ù º¸¸é ÀÌ»óÇϰí ÀǾÆÇÑ °ÍÀÌ Çϳª ÀÖ´Ù. ¼ýÀÚ ºÎºÐ¿¡ ¹®ÀÚ¸¦ ³Ö¾úÀ»¶§ ¹ß»ýÇÏ´Â NumberFormatExceptionÀÌ´Ù. À̰ÍÀº ÀÌ»óÇϰԵµ RuntimeExceptionÀÇ sub classÀÌ´Ù. À̰ÍÀº RuntimeExceptionÀÌ ¾Æ´Ï¾úÀ¸¸é Çϴµ¥ NumberFormatüũ´Â Runtime½Ã¿¡¸¸ °¡´ÉÇÑ ¸ð¾çÀÌ´Ù.
5.2.3 "OutOfMemoryError´Â ¾î¶»°Ô ó¸®ÇØ¾ß Çϴ°¡?" #
¿¹Àü¿¡ Swing¿¡¼ Tree±¸Á¶¸¦ ÀÌ¿ëÇÏ´Â ÇÁ·ÎÁ§Æ®¸¦ ÇÑÀûÀÌ ÀÖ´Ù. À̶§ Tree¿¡ branch¿Í node°¡ ¹«¼öÈ÷ »ý±âÀÚ JVMÀº OutOfMemoryError¸¦ ³»¹ñ¾ú´Ù. ÀÌ¿¡ ±ÞÇÑ ¸¶À½¿¡ OutOfMemoryError¸¦ catchÇÏ¿© »ç¿ëÀÚ¿¡°Ô Àç½ÃÀÛÀ» ¿äûÇÏ´Â Dialog¸¦ ¶ç¿ìµµ·Ï ¼öÁ¤ÇÏ¿´´Ù¸é ÀÌ Dialog°¡ °ú¿¬ ¶¸À»±î? ÇöÀç ¸Þ¸ð¸®°¡ ºÎÁ·ÇÑ ÆÇ¿¡ Dialog¸¦ ¶ç¿ï ¸Þ¸ð¸®°¡ ³²¾ÆÀÖÁú ¾Ê¾Ò´ø °ÍÀÌ´Ù. ´ÙÇàÈ÷ Dialog°¡ ¶¹¾îµµ ÀÛ¾÷Àº °è¼ÓµÇÁö ¸øÇßÀ» °ÍÀÌ´Ù. NullPointerException°¡ ³ª±â ¶§¹®ÀÌ´Ù.
¿øÀÎÀº ³ªÁß¿¡ ã¾Ò´Âµ¥, Tree±¸Á¶¿¡¼ ºÎ¸ðºÎÅÍ ÀڽĵéÀ» ºÙÀÌ´Â ¼øÀ¸·Î Tree¸¦ ±¸¼ºÇϴµ¥ ÀڽĵéÀ» ÁÙÁÙÀÌ ºÙ¿©³ª°¡´Ù°¡ ¸Þ¸ð¸® ºÎÁ·Çö»óÀÌ ¹ß»ýÇÏ¿´°í NullPointerExceptionÀº ÀÚ½ÄÀÌ ¾øÀ¸´Ï Ŭ¸¯ÇÏ´Â ¼ø°£ nullÀ» ¹ÝȯÇÏ¿© ¹ß»ýÇÏ¿´´ø °ÍÀÌ´Ù.
OutOfMemoryErrorÀÇ °¡Àå ÁÁÀº ÇØ°áÃ¥Àº ºÒÇÊ¿äÇÑ °´Ã¼¸¦ ¸¸µéÁö ¾Ê´Â °ÍÀ̾ú´Ù. ±×¸®°í Tree»ý¼º½Ã¿¡µµ ÀڽĺÎÅÍ ¸¸µé°í ºÎ¸ð¸¦ ¸¸µå´Â ¼ø¼·Î ÇÁ·Î±×·¥À» ¼öÁ¤ÇÏ¿© ÇÁ·ÎÁ§Æ®¸¦ Á¤»óÀûÀ¸·Î ¸¶Ä¥¼ö ÀÖ¾ú´Ù.
¸¶Áö¸·¿¡ µå´Â ½ÉÁ¤Àº ÇÁ·Î±×·¥ÀÌ OutOfMemoryError¸¦ ÀÏÀ¸Å°´Â ¿øÀÎÀÌ °ú¿¬ ÀÌ·¸°Ô ±¸¼ºµÇ¾î ¹ß»ýÇß´ÂÁö ¾î¶»°Ô ¾Ë¼ö ÀÖÀ»±î ÇÏ´Â Àǹ®ÀÌ´Ù.
5.3 Object Serialize #
Java¿¡¼´Â ObjectOutputStreamÀÇ writeObject() method¿¡ µ¥ÀÌŸ ±¸Á¶ ÀúÀå¼ÒÀÇ ÂüÁ¶¸¸ °Ç³×Áֱ⸸ ÇÏ¸é ±× ¾È¿¡ ÀÖ´Â ¸ðµç °´Ã¼¸¦ 1Â÷¿ø streamÀ¸·Î Ãâ·ÂÇØ ÁØ´Ù. (ÆÄÀÏÀ̳ª ByteArrayOutputStreamÀ» ÀÌ¿ëÇÑ ¸Þ¸ð¸®·Î) ´Ü, static field´Â SerializeµÇÁö ¾Ê´Âµ¥ ÀÌ´Â SerializeÀÇ ´ë»óÀÌ instance °´Ã¼»ÓÀ̱⠶§¹®ÀÌ´Ù.
5.3.1 "Serialize¸¦ À§Çؼ´Â marker interfaceÀÎ java.io.Serializable interface¸¦ implementsÇØ¾ßÇÑ´Ù." #
¿©±â¼ marker interface´Â java.lang.Cloneable°ú °°ÀÌ method¿Í fieldÀÇ Á¤ÀÇ´Â ¾øÁö¸¸ °´Ã¼ TypeÀ» À§ÇÑ interfaceÀÌ´Ù. ¿¹Àü¿¡ Serialize¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌŸ¸¦ À¯ÁöÇÏ´Â ÇÁ·ÎÁ§Æ®¸¦ ÇÑ ÀûÀÌ Àִµ¥ ±×¶§ »ý°¢Çß´ø°ÍÀÌ '¸ðµç classµéÀÌ ±âº»ÀûÀ¸·Î SerializableÀ» implementsÇϰí ÀÖÀ¸¸é ÆíÇÒÅÙµ¥..'¶ó´Â »ý°¢À̾ú´Ù. ÇÏÁö¸¸ À̰ÍÀº »ó´çÈ÷ À§ÇèÇÑ ¹ß»óÀ̾ú´Ù.
SerializableÀÌ ±âº»À¸·Î implementsµÇ¾î ÀÕÀ¸¸é ¾û¶×ÇÑ °´Ã¼±îÁö SerializeµÇ°í ±×°ÍÀ» ¾Ë¾ÆÃ¤Áöµµ ¸øÇÏ´Â »çŰ¡ ÀϾ °¡´É¼ºÀÌ ³ô´Ù. SerializableÀÌ optionalÀÎ ÀÌÀ¯´Â ÀÌ·¯ÇÑ ÀÌÀ¯ ¶§¹®À̸®¶ó..
5.3.2 "super class´Â SerializableÀÌ ¾Æ´Ñµ¥ sub class¸¸ SerializableÀÎ °æ¿ìÀÇ ¹®Á¦Á¡" #
SerializeÀ» ÀÌ¿ëÇÏ¿© ÇÁ·ÎÁ§Æ®¸¦ ÇÒ¶§ ÇѹøÂë ½Ç¼öÇÒ ¼ö ÀÖ´Â ºÎºÐÀÌ »ó¼ÓµÈ classÀÇ SerializeÀÌ´Ù. ÄÄÆÄÀÏ ¿¡·¯µµ ¾ø°í Deserializeµµ Àß µÇ¾ú´Ù. ÇÏÁö¸¸ ۰¡ µÇ´Â °ªÀÌ null°ú 0À̾ú´Ù. ¿µ¹®À» ¸ô¶ó ´Ù¸¥°÷À» Çì¸Å¿©µµ º¸´Ù°¡ °á±¹ ãÀº ¿øÀÎÀº ºÎ¸ðÀÇ field´Â SerializeµÇÁö ¾Ê´Â´Ù´Â °ÍÀ» ¾Ë°Ô µÇ¾ú´Ù. transient¿Í ¸¶Âù°¡Áö·Î Çü½Äº° default °ªÀ¸·Î ä¿öÁ³¾ú´Ù. ÀÌ´Â ÄÄÆÄÀϰú ½ÇÇà½Ã ¾Æ¹«·± ¿À·ù¾øÀÌ ½ÇÇàµÇ¾î ³ª¸¦ Èûµé°Ô ÇÏ¿´±â¿¡ Java°¡ ¿ø¸Á½º·¯¿ü´ø ±âºÐÁÁÀº Ãß¾ïÀÌ´Ù. ^^;
5.3.3 "transient fieldÀÇ º¹¿ø(?)°ü·Ã" #
Serialize¸¦ ÀÌ¿ëÇÑ ÇÁ·ÎÁ§Æ®¸¦ ÇÒ¶§´Â writeObject¿Í readObject¸¦ ÀÌ¿ëÇÏ¿© ±âº»ÀûÀ¸·Î Á¦°øÇÏ´Â Serialize¸¦ customizingÇÒ¼öÀÖ´Ù.
Serializable¿¡ ´ëÇÑ API reference¿¡µµ ´ÙÀ½°ú °°ÀÌ ³ª¿ÍÀÖ´Ù.
"Serialize¿Í Deserialize¿¡ ´ëÇÑ Æ¯º°ÇÑ handlingÀ» À§Çؼ´Â ´ÙÀ½ µÎ°³ÀÇ Æ¯º°ÇÑ ¸Þ¼Òµå¸¦ ±¸ÇöÇÏ¸é µÈ´Ù."
private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
ÀÌ µÎ method°¡ privateÀ¸·Î µÇ¾î ÀÖ´Â °ÍÀ» º¸°í óÀ½¿¡´Â ÀǾÆÇØ Çß¾ú´ø ±â¾ïÀÌ ÀÖ´Ù. À̸¦ protected³ª publicÀ¸·Î Çϸé Á¦´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. ÀÌ´Â override°¡ À̴ϱ⠶§¹®ÀÌ´Ù. »ç½ÇÀº ¼Ó¿¡¼ reflectiondÀ» ÀÌ¿ëÇÏ¿© °Á¦ÀûÀ¸·Î È£ÃâµÇ°í Àִ°ÍÀÌ´Ù. reflection¿¡¼´Â private method±îÁö ãÀ» ¼ö Àֱ⠶§¹®ÀÌ´Ù.
¶ÇÇÑ privateÀ¸·Î ÇÑ °¡Àå Å« ÀÌÀ¯´Â Serialize¸¦ °´Ã¼ÀÚ½ÅÀÌ Á÷Á¢ ÇØ¾ß ¾ÈÀüÇÏ´Ù´Â Àǹ̵µ ÀÖÁö ¾ÊÀ»±î ÇÏ´Â »ý°¢µµ µç´Ù. ´Ù½Ã º»·ÐÀ¸·Î µé¾î°¡¼ transient¸¦ º¹¿øÇÏ´Â °Í¿¡ ¾ê±â¸¦ ÇÏÀÚ¸é, »ç½Ç transient´Â Serialize´ë»ó¿¡¼ Á¦¿ÜµÇ´Â °ÍÀε¥ º¹¿øÀ» ÇÒ ¼ö ÀÖ´Ù´Â ¸»ÀÌ ¾ÈµÈ´Ù. ÇÏÁö¸¸ ÇÁ·ÎÁ§Æ®¸¦ ÁøÇàÇÏ´Ù º¸¸é logic»ó °¡´ÉÇÑ °æ¿ì°¡ ¸¹ÀÌ ÀÖ´Ù.
Áï, ¸ðµç field¸¦ SerializeÇÏÁö ¾Ê°í ÇÊ¿äÇÑ °Í¸¸ ÇÏ°í Æ¯Á¤ field´Â SerializeÇÑ fieldµéÀ» ÀÌ¿ëÇÏ¿© º¹¿øÇÏ´Â ¹æ¹ýÀÌ´Ù. ¶ÇÇÑ Serialize´ç½ÃÀÇ °´Ã¼ »óÅÂ¿Í Deserialize½ÃÀÇ °´Ã¼»óŰ¡ ¼·Î ´Ù¸¦ ¼ö ÀÖ´Â fieldµµ ±×°Í¿¡ ÇØ´çµÈ´Ù. cafeid¸¸À¸·Î ³ª¸ÓÁö field´Â DB¿¡¼ Àоî¿À°Ô ÇÑ´Ù¸é ³ª¸ÓÁö field´Â transient·Î ó¸®Çϰí Deserialize½Ã readObject()¿¡¼ º¹¿øÇÏ´Â °ÍÀÌ´Ù.
5.3.4 "Stack Overflow¿¡ ÁÖÀÇÇ϶ó!" #
Serialize¸¦ ÇÏ´Ùº¸¸é ÂüÁ¶·Î ¿¬°áµÈ °´Ã¼¸¦ recursiveÇÏ°Ô °Å½½·¯ ¿Ã¶ó°¡¸ç À̰ÍÀÌ ³Ê¹« ±í¾îÁö¸é Stack Overflow°¡ ¹ß»ýÇÑ´Ù. °¡·É linked list°°Àº °æ¿ìÀÌ´Ù. À̰ÍÀ» SerializeÇÏ¸é ±× ¿ä¼Ò¼ö¸¸Å recursive È£ÃâÀÌ ¹ß»ýÇÑ´Ù. °ú°Å(JDK1.3.0½ÃÀý) ÇÁ·ÎÁ§Æ® ´ç½Ã JVMÀÌ 5111¿¡¼ Stack Overflow°¡ ¹ß»ýÇß´ø ±â¾ïÀÌ ÀÖ´Ù.
¹°·Ð ½ÇÇà½Ã java option¿¡ -Xss ¸¦ ÀÌ¿ëÇÏ¿© statck ũ۸¦ Á¶ÀýÇÒ ¼ö ÀÖÁö¸¸ À̰ÍÀº °³¹ßÀÚ°¡ ¾Æ´Ñ ½ÇÇàÇÏ´Â »ç¶÷µé¿¡°Ô ºÎ´ãÀ̾ú´Ù. JDKÀÇ LinkedList classÀÇ ¼Ò½º¸¦ º¸¸é writeObject()¿Í readObject()¸¦ ´ÙÀ½°ú °°ÀÌ º¯°æÇϰí ÀÖ´Ù.
private synchronized void writeObject(java.io.ObjectOutputStream s) throws IOException {
s.defaultWrtieObject(); //ÀÌ ÄÚµå´Â ¹«Á¶°Ç µé¾î°¡°Ô µÇ´Âµ¥ À̰÷ ¼Ò½ºÀÇ System.arraycopy()¿¡¼ overflow¹ß»ýÇÑ´Ù.
s.writeInt(size); //À̺κÐÀÌ ½ÇÁ¦ Ãß°¡µÇ¾î Stack Overflow¸¦ ¿¹¹æÇÑ´Ù.
for(Entry e = ...)
s.writeObject(e.element);
}
...
}
//readObject()µµ ÀÌ¿Í °°Àº °³³äÀ¸·Î º¯°æµÇ¾î ÀÖ´Ù.
5.4 "nested class / inner class / ÁßøŬ·¡½º" #
5.4.1 "ÁßøŬ·¡½ºÀÇ °³³ä" #
°³ÀÎÀûÀ¸·Î ÁßøŬ·¡½º¸¦ ¾î¶°ÇÑ °æ¿ì´Â »ç¿ëÇÏÁö ¾ÊÀ¸·Á ÇÑ´Ù. »ç¿ëÇϱⰡ ¸¸¸¸Ä¡ ¾Ê°í ÄÚµå ÀбⰡ Èûµé¾î Áö±â¶§¹®ÀÌ´Ù. ÇÏÁö¸¸ '¾î¶² Ŭ·¡½º ³»¿¡¼ ÀºÆóÇÒ ¸ñÀûÀ¸·Î »ç¿ëÇϴ Ŭ·¡½º°¡ ÀÖ´Ù¸é À̰ÍÀ» »ç¿ëÇØ¾ß ÇÑ´Ù' ½ÇÁ¦·Î JavaÀÇ AWT Ŭ·¡½º Event Handler¸¦ ºñ·ÔÇÏ¿© ¸¹Àº Ŭ·¡½º¿¡¼ ÁßøŬ·¡½º¸¦ »ç¿ëÇϰí ÀÖ´Ù. ¶ÇÇÑ ³»ºÎ class´Â ±×°ÍÀ» µÑ·¯½Î´Â classÀÇ instance(enclosing object¶ó°í ÇÏ´Â)ÀÇ field¸¦ ÂüÁ¶ ÇÒ¼ö Àִ°͵µ ÀåÁ¡ÀÌ´Ù. ÇÏÁö¸¸ ÀÌ´Â ³»ºÎŬ·¡½º°¡ ¾Æ´Ò°æ¿ì ºÎºÎ Ŭ·¡½º¸¦ newÇØ¼ »ç¿ëÇϴ°Ͱú º°¹Ý ´Ù¸¦²² ¾øÁö ¾ÊÀº°¡.
5.4.2 "³»ºÎŬ·¡½º´Â ºÎ¸ðÀÇ ÂüÁ¶¸¦ ¸ô·¡ º¸À¯Çϰí ÀÖ´Ù." #
³»ºÎ Ŭ·¡½ºÀÇ instance´Â ºÎ¸ðÀÇ instance¿¡ ´ëÇÑ ÂüÁ¶¸¦ ¸ô·¡ º¸À¯Çϰí Àֱ⠴빮¿¡ À§¿¡¼ ¾ê±âÇÑ ºÎ¸ðÀÇ field¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î static method¿¡¼´Â ³»ºÎŬ·¡½º¸¦ »ý¼ºÇÒ ¼ö ¾ø´Ù. ´ÙÀ½ ¿¹¸¦ º¸¸é ¹Ù·Î ¾Ë¼ö ÀÖ´Ù.
class Test{
class InnerClass {
int i;
...
}
public static void main(String[] args){
InnerClass icls = new InnerClass();
...
}
}
ÀÌ ¼Ò½º¸¦ compileÇÏ¸é ´ÙÀ½ÀÇ ¿À·ù°¡ ¹ß»ýÇÑ´Ù. "non-static variable this cannot be referenced from a static context..." main method´Â staticÀ̹ǷΠthis¸¦ ÂüÁ¶ÇÒ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù. ÀÌ´Â InnerClass°¡ new µÇ¸é¼ ¿ÜºÎ Ŭ·¡½º TestÀÇ this¸¦ º¸À¯ÇØ¾ß Çϴµ¥ ¿©±â¼ staticÀ» ¸¸³ª´Ï ¿À·ù¸¦ Ç¥Ãâ½ÃŲ°ÍÀÌ´Ù. ¹°·Ð ÀÏ¹Ý instance method¿¡¼´Â ¿À·ù°¡ ³ªÁö ¾Ê´Â´Ù.
5.4.3 "local inner class¿¡ ´ëÇÏ¿©" #
local inner class¶ó ÇÔÀº method³»¿¡¼ ¼±¾ðµÈ inner classÀÌ´Ù.
public class OuterClass {
public int get(){
int i = 9;
int id = 99;
int id2 = 99;
final int id3 = 100000;
class LocalInnerClass {
int id = 100;
LocalInnerClass(){
System.out.println("LocalInnerClass");
}
int getId(){
return id3 + id;
}
}
LocalInnerClass lic = new LocalInnerClass();
return id + lic.getId();
}
public static void main(String[] args){
OuterClass outer = new OuterClass();
System.out.println("id = " + outer.get());
//°á°ú °ªÀº "100000(id3) + 100(LocalInnerClass.id) + 99(OuterClass.get())" ÀÎ 100199°¡ ³ª¿Â´Ù.
}
}
À§ ¼Ò½ºÀÇ LocalInnerClass´Â get() À̶ó´Â method¿¡¼¸¸ º¸ÀÌ´Â classÀÌ´Ù. ±×¸®°í ƯÀÌÇÒ ¸¸ÇÑ ºÎºÐÀÌ OuterClassÀÇ get() method¿¡¼ final·Î ¼±¾ðµÈ id3ÀÌ LocalInnerClass¿¡¼ ÂüÁ¶ °¡´ÉÇØ Áø´Ù. id2¸¦ ÂüÁ¶Çϸé compile error°¡ ³ªÁö¸¸ final·Î ¼±¾ðµÈ °ÍÀº ¿À·ù°¡ ³ªÁö ¾Ê´Â´Ù.
ÀÌ´Â local variableÀº method¿¡¼ ³ª¿À´Â ¼ø°£ »ç¶óÁö´Âµ¥, local inner class´Â local variableº¸´Ù ¼ö¸íÀÌ Á¶±Ý´õ ±æ±â ¶§¹®¿¡ final¸¸ Çã¿ëÇÑ °ÍÀÌ´Ù.
5.4.4 "anonymous class(¹«¸íŬ·¡½º)¿¡ ´ëÇÏ¿©" #
¹«¸í Ŭ·¡½º´Â ¸»±×´ë·Î À̸§ÀÌ ¾ø´Â Ŭ·¡½ºÀÌ´Ù.
class AnonymousTest {
private interface Printable {
void print();
}
static void doPrint(Printable p){
p.print();
}
public static void main(String[] args){
doPrint( new Printable(){
public void print(){
System.out.println("this is new Printable print()");
}
});
}
}
À§ ¼Ò½ºÀÇ "doPrint( new Printable(){" ºÎºÐÀÌ ¹«¸íŬ·¡½º ÀÌ´Ù. compileÀ» ¼öÇàÇϸé AnonymousTest$Printable.class, AnonymousTest$1.class, AnonymousTest.class ¼¼°³ÀÇ Å¬·¡½º°¡ »ý±ä´Ù. ¿©±â¼ AnonymousTest$Printable.class´Â Printable interfaceÀ̰í AnonymousTest$1.classÀÌ ¹«¸íŬ·¡½ºÀÌ´Ù.
ÀÌ ¼Ò½º¸¦ º¸¸é óÀ½¿¡ µå´Â ÀǽÉÀÌ Printable interface¸¦ new Çß´Ù´Â °ÍÀÌ´Ù. ¿©±â¼ ±»ÀÌsuper class(ÀÌ ¼Ò½º¿¡¼´Â interface)¸¦ ÀúÁ¤ÇØ¾ß ÇÏ´Â ÀÌÀ¯´Â ¾Æ¹«°Íµµ »ó¼ÓÇÏÁö ¾Ê´Â ¹«¸í Ŭ·¡½ºÀÇ instance¸¦ ¸¸µé¾î ºÁ¾ß Àǹ̰¡ ¾ø±â ¶§¹®¿¡ ÀÌ·¸°Ô ÇѵíÇÏ´Ù.
"¹«¸íŬ·¡½º´Â ¾î¶² class³ª interface¸¦ »ó¼Ó/±¸Çö ÇØ¾ß¸¸ ±× instance¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù"
ÀÌó·³ ¹«¸í Ŭ·¡½º¸¦ »ç¿ëÇÏ¸é ¾î¶² ÀýÂ÷(¼öÇà)¸¦ ´Ù¸¥ methodÀÇ Àμö·Î °Ç³×ÁÙ ¼ö ÀÖ°Ô µÈ´Ù. ÇÏÁö¸¸ °£´ÜÇÑ ·ÎÁ÷¸¸ ±¸Çöó¸®ÇØ¾ß ÇÑ´Ù.
"¹«¸íŬ·¡½º´Â Á¶±Ý¸¸ º¹ÀâÇØÁ®µµ ±Þ°ÝÈ÷ ¼Ò½ºÀÇ °¡µ¶¼ºÀÌ ¶³¾îÁö°Ô µÇ¹Ç·Î ³²¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù"
6 ÀÌ·¡µµ Java°¡ °£´ÜÇѰ¡? #
6.1 method overload ¿¡¼ÀÇ È¥¶õ? #
6.1.1 "overload¶õ À̸§ÀÌ °¡°í Àμö°¡ ´Ù¸¥ method¿¡ compiler°¡ ´Ù¸¥ À̸§À» ºÙÀÌ´Â ±â´É" #
overload¸¦ ±¸ÇöÇϸé bytecode·Î º¯È¯½Ã ´Ù¸¥ À̸§À¸·Î method°¡ º¯È¯µÇ¾î º°°³ÀÇ method·Î 󸮵ȴÙ. À̸¦ JVM¿¡¼ method descripter¶ó ÇÏ¿© Oolong asembler·Î º¯È½Ã ´Ù¸¥ ÇüÅÂÀÇ method°¡ µÈ´Ù. ¿¹¸¦ µé¾î "void get(double d, long l)" Àº "get(DJ)V"·Î º¯°æµÈ´Ù. ¿©±â¼ D´Â double, J´Â long, V´Â void¸¦ ÀǹÌÇÑ´Ù.
±×·±µ¥ ¿©±â¼ "get(DJ)" ºÎºÐ¸¸ method À̸§À̹ǷΠreturn typeÀÌ ´Ù¸¥ µ¿ÀÏ method´Â overload ÇÒ ¼ö ¾ø´Ù. µû¶ó¼ overload´Â Á¤Àû(compile½Ã °áÁ¤)À̶ó´Â ¸íÁ¦°¡ ¼º¸³´Ï´Ù. ±×·¡¼ µ¿ÀûÀ¸·Î »ç¿ëµÇ¸é compile½Ã ¿À·ù¸¦ Ç¥ÃâÇÑ´Ù. ¾Æ·¡ÀÇ ¼Ò½º¸¦ º¸ÀÚ. ¿©±â¿¡´Â IFS¶ó´Â interface¿Í À̸¦ implementsÇÑ Impl1, Impl2 ¶ó´Â class°¡ ÀÖ´Ù.
//IFS.java
interface IFS {
public String getName();
}
//Impl1.java
class Impl1 implements IFS {
public String getName(){
return "Impl1";
}
}
//Impl2.java
class Impl2 implements IFS {
public String getName(){
return "Impl2";
}
}
//mainÀÌ ÀÖ´Â OverloadTest.java
public class OverloadTest {
static void pr(int i){
System.out.println("pr_int : " + i);
}
static void pr(String s){
System.out.println("pr_string : " + s);
}
static void pr(IFS ifs){
System.out.println("pr_string : " + ifs.getName());
}
static void pr_run(Impl1 i1){
System.out.println("pr_run : " + i1.getName());
}
static void pr_run(Impl2 i2){
System.out.println("pr_run : " + i2.getName());
}
public static void main(String[] args){
OverloadTest test = new OverloadTest();
test.pr(10);
test.pr("Jeid");
IFS ifs1 = new Impl1();
test.pr(ifs1);
IFS ifs2 = new Impl2();
test.pr(ifs2);
//pr_run(ifs1);
//pr_run(ifs2);
}
}
À§ÀÇ ¼Ò½º¸¦ ¼öÇàÇϸé Á¤»óÀûÀ¸·Î compileÀÌ µÉ°ÍÀΰ¡?
´ç¿¬È÷ Àß µÈ´Ù. pr()Àº overload¸¦ Àß ±¸ÇöÇß´Ù. ÇÏÁö¸¸ ¼Ò½º ÇÏ´ÜÀÇ µÎ ÁÖ¼®¹®À» Ç®¸é ¾î¶»°Ô µÉ±î? ÀÌ´Â compile¿À·ù¸¦ ³½´Ù.
OverloadTest.java:36: cannot resolve symbol
symbol : method pr_run (IFS)
location: class OverloadTest
pr_run(ifs1);
^
OverloadTest.java:37: cannot resolve symbol
symbol : method pr_run (IFS)
location: class OverloadTest
pr_run(ifs2);
^
2 errors
½ÇÁ¦ À§ µÑÀÇ pr_run method´Â bytecode·Î º¯È¯½Ã "pr_run(Lpackage_name.IFS)V"·Î µ¿ÀÏÇÏ°Ô »ý¼ºµÈ´Ù. µû¶ó¼ compile½Ã¿¡ ¿À·ù¸¦ Ç¥ÃâÇÑ´Ù. ÀÌ ¼Ò½º¸¦ º¸¸é ¾Ë ¼ö ÀÖµíÀÌ "method overload´Â Á¤Àû(compile½Ã)À¸·Î ¹Ì¸® °áÁ¤µÇ¸ç, µ¿Àû(½ÇÇà½ÃÆÇ´Ü)À¸·Î »ç¿ëÇÒ¼ö ¾ø´Ù."
6.1.2 "±×·¸´Ù¸é overload¿¡¼ ½ÇÁ¦·Î È¥µ¿µÇ´Â ºÎºÐÀº ¹«¾ùÀΰ¡?" #
´ÙÀ½ ¼Ò½º¸¦ º¸°í ½ÇÁ¦·Î ¼öÇàµÇ´Â method¸¦ ã¾Æº¸¶ó.
class OverloadTest2 {
static int base(double a, double b){ ... } //method A
static int count(int a, int b){ ... } //method B
static int count(double a, double b){ ... } //method C
static int sum(int a, double b){ ... } //method D
static int sum(double a, int b){ ... } //method E
}
- base(3,4) ¸¦ È£ÃâÇßÀ»¶§ ¼öÇàµÇ´Â method´Â? => ´ç¿¬È÷ method A (3°ú 4´Â Á¤¼ö¶óµµ doubleÀÌ µÇ¹Ç·Î Á¤»óÀûÀ¸·Î ¼öÇàµÊ)
- count(3,4) ¸¦ È£ÃâÇßÀ»¶§ ¼öÇàµÇ´Â method´Â? => B¿Í CÁß °¥µîÀÌ »ý±ä´Ù. ÀÌ·²°æ¿ì JVMÀº °¡Àå ÇÑÁ¤Àû(more specific)ÇÑ method¸¦ ã´Â´Ù. ¿©±â¼ 3°ú 4´Â Á¤¼öÇü¿¡ °¡±î¿ì¹Ç·Î method B °¡ È£ÃâµÈ´Ù.
- count(3, 4.0) À» È£ÃâÇßÀ»¶§ ¼öÇàµÇ´Â method´Â? => À̰ÍÀº 4.0 ÀÌ doubleÀ̹ǷΠmethod C °¡ ´õ ÇÑÁ¤ÀûÀ̹ǷΠmethod C °¡ È£ÃâµÈ´Ù.
- sum(3,4.0) À» È£ÃâÇßÀ»¶§ ¼öÇàµÇ´Â method´Â? => À̰ÍÀº ´ç¿¬È÷ typeÀÌ ÀÏÄ¡ÇÏ´Â method D.
- sum(3,4) ¸¦ È£ÃâÇßÀ»¶§ ¼öÇàµÇ´Â method´Â?? => ÀÌ·± Äڵ尡 ¼Ò½º³»¿¡ ÀÖÀ¸¸é ´ÙÀ½°ú °°Àº compile ¿À·ù¸¦ Ç¥ÃâÇÑ´Ù.
OverloadTest.java:48: reference to sum is ambiguous, both method sum(int,double)
in OverloadTest and method sum(double,int) in OverloadTest match
System.out.println("sum(3,4) = " + sum(3,4));
^
1 error
method D¿Í method E°¡ ¾Ö¸ÅÇÏ´Ù´Â compile ¿À·ùÀÌ´Ù. À̰ÍÀº µÑÁß ¾î´À°ÍÀÌ ´õ ÇÑÁ¤ÀûÀÎÁö ãÀ» ¼ö ¾øÀ¸¹Ç·Î bytecode ¸¦ »ý¼º ÇÒ ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù.
"ÀÌ·¸µí compiler¿¡°Ô ºÒÇÊ¿äÇÑ ¿ÀÇØ(È¥µ¿)¸¦ ÃÊ·¡ÇÏ´Â overload´Â »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ´Ù. °³ÀÎÀûÀ¸·Î overload¸¦ °¡´ÉÇÑ »ç¿ëÇÏÁö ¾ÊÀ¸·Á Çϰí ÇÊ¿äÇÏ´Ù¸é ÀμöÀÇ °³¼ö°¡ ´Ù¸¥ overload¸¦ »ç¿ëÇÏ´Â ÆíÀÌ´Ù."
6.1.3 (Âü°í) ¶Ç´Ù¸¥ È¥µ¿, overloadÇÑ method¸¦ override Çϸé? #
overload¶õ compiler°¡ bytecodeº¯È¯½Ã ´Ù¸¥ À̸§À» ºÙÀÌ´Â ±â´ÉÀ̶ó´Â °ÍÀ» À§¿¡¼ ¼³¸íÇß´Ù. µû¶ó¼ super class¿¡¼ overloadÇÑ method¸¦ »ó¼ÓÇÏ¿© overrideÇÏ¸é ¿ÏÀü º°°³ÀÇ method¸¦ overrideÇѰÍó·³ JVMÀº ÆÇ´ÜÇÑ´Ù. Áï, overload¿Í override´Â Á÷±³(ÀüÇô»ó°ü¾ø´Â)ÇÏ´Â °³³äÀÌ´Ù.
6.2 »ó¼Ó/override/ÀºÆó ¿¡¼ÀÇ º¹ÀâÇÔ #
6.2.1 "Java classÀÇ member 4 Á¾·ù" #
- instance field
- instance method
- static field
- static method
¿©±â¼ »ó¼ÓÀ» ÇÏ¿´À» °æ¿ì runtime½Ã °´Ã¼ÀÇ Çü½Ä¿¡ µû¶ó ¼±ÅõǴ °ÍÀº? 2¹ø instance method »ÓÀÌ´Ù. Áï, µ¿¸íÀÇ member¸¦ sub class¿¡¼ ¼±¾ðÇßÀ» ¶§ instance method¸¸ override µÇ°í ³ª¸ÓÁö´Â ¿ÏÀü º°°³ÀÇ member°¡ µÈ´Ù. µû¶ó¼ À§ÀÇ 1,3,4´Â sub class¿¡¼ µ¿ÀÏÇÏ°Ô ¼±¾ðÇßÀ» °æ¿ì º°°³ÀÇ °ÍÀ¸·Î ÀνĵǸç compile½Ã¿¡ ¹«¾ùÀ» access ÇÒÁö °áÁ¤µÈ´Ù.
Áï, instance method´Â overrideµÇÁö¸¸ instance field/static field´Â ÀºÆóµÈ´Ù. override´Â ½ÇÇà½Ã °´Ã¼ÀÇ Çü½Ä¿¡ µû¶ó ó¸® ÇÒ´çµÇÁö¸¸, ÀºÆóÀÇ °æ¿ì´Â compile½Ã¿¡ °áÁ¤µÇ°í ¸¸´Ù.
6.2.2 "override½Ã method À̸§¿¡ ´ëÇÑ ÇÔÁ¤" #
°ú°Å¿¡ ÄÚµùÀ» ÇÏ´øÁß Á¤¸»ÀÌÁö ¾îó±¸´Ï ¾ø´Â °æ¿ì¸¦ ´çÇß´Ù. override ÇÏ´Â methodÀ̸§À» À߸ø½á¼ Ȳ´çÇÑ(?) °í»ýÀ» ÇÑÀûÀÌ ÀÖ´Ù. super classÀÇ writable()À̶ó´Â method¸¦ writeable()À̶ó°í override(?)ÇÏ¿´´Âµ¥ ÇÁ·Î±×·¥ ¼öÇà Áß¿¡ writable()ÀÌ Ç×»ó false°¡ ³ª¿À´Â °ÍÀÌ ¾Æ´Ñ°¡? ±×·¡¼ ¼Ò½º¸¦ ÃßÀûÃßÀû ÇÏ´Ù ¸î½Ã°£À» ÇãºñÇß¾ú´ø ±â¾ïÀÌ ÀÖ´Ù.
java¸¦ Á¢ÇÑÁö ¾ó¸¶µÇÁö ¾Ê¾Ò°í ¿äÁò°°ÀÌ eclipse°°Àº ¿¡µðÅ͵µ ¾øÀÌ ¸Þ¸ðÀå¿¡¼ ÄÚµùÇÏ´ø ½ÃÀýÀ̶ó ´õ¿í °í»ýÇß´ø°Í °°´Ù. ÇÑÂü ÈÄ¿¡¾ß ¿ì¿¬È÷ ½ºÆç¸µÀÌ À߸øµÈ°É ¾Ë°í ¾ó¸¶³ª Ȳ´çÇß´øÁö... Áö±Ý »ý°¢Çϸé À̰͵µ ÁÁÀº Ãß¾ïÀ̸®¶ó.
¹«Á¶°Ç override Àß µÇ¾úÀ»°Å¶ó »ý°¢ Çß´ø ³ªÀÇ ºÒÂûµµ ÀÖ¾úÁö¸¸ compile¶§³ª runtime½Ã ¾Æ¹«·± ¹ÝÀÀÀ» º¸ÀÌÁö ¾Ê´ø Javaµµ ¿ø¸Á½º·¯¿ü´Ù. 2003³âµµ¿¡ C#À¸·Î ÇÁ·ÎÁ§Æ®¸¦ Çߴµ¥ C#Àº »ó¼ÓÀÇ override¿¡ ´ëÇÏ¿© "override void writalbe().."°ú °°ÀÌ Á¤Àǽà override¸¦ ¸í½ÃÇØ¾ß µÈ´Ù´Â °ÍÀ» º¸°í »ó´çÈ÷ ¸¶À½¿¡ µé¾î Çß´ø ±â¾ïÀÌ ÀÖ´Ù. °¡µ¶¼ºµµ ¶Ù¾î³¯ »Ó´õ·¯ ³ªÀÇ ¸î½Ã°£µ¿¾ÈÀÇ Çì¸ÞÀÓµµ ¾øÀ» °ÍÀ̱⠶§¹®´Ù. Javaµµ ÀÌ·¸°Ô È®½ÇÇÑ ¸í¼¼¿´À¸¸é Á¤¸» ÁÁ°Ú´Ù.
6.2.3 "¶Ç´Ù¸¥ ³ªÀÇ(?) ½Ç¼ö - ¸»µµ ¾ÈµÇ´Â ¿ÀŸ" #
À§ÀÇ methodÀ̸§À» À߸ø½á¼ °í»ýÇϱâ ÀÌÀü¿¡ ¾ÆÁÖ ºñ½ÁÇÑ °í»ýÀ» ÇÑÀûÀÌ ÀÖ´Ù.
'³ Á¤¸» ¹Ùº¸Àΰ¡'¶ó´Â »ý°¢À» µé°Ô Çß´ø ¹®Á¦¿´´Ù. Ãʺ¸ ½ÃÀý¿¡´Â ¿ÖÀ̸®µµ ¿ÀŸ°¡ ¸¹ÀÌ ³ª´øÁö... ¿äÁòÀº ´ëÃæ Űº¸µå µÎµå·Áµµ ¿ÀŸ°¡ Àß ¾È³ª´Âµ¥ ±× ½ÃÀý¿¡ ¿ÀŸ ¶§¹®¿¡ ´À¸° CPU¿¡¼ ÄÄÆÄÀÏÀ» ¸î¹øÀ» Çß´ÂÁö...
±â¾ïÀ» µÇ»ì¸®¸é ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.
public class Member {
private int memberNo;
public int getMemberNo(){
return this.memberNo;
}
public void setMemberNo(int menberNo){
this.memberNo = memberNo;
}
......
}
À§ ¼Ò½ºÀÇ Member¿¡´Â ´Ù¸¥ ¿©·¯°¡Áö member field°¡ Àִµ¥ DBÀÇ member table¿¡ memberid Ä÷³ÀÌ memberno·Î º¯°æµÇ¸é¼ Member classÀÇ memberId¸¦ memberNo·Î º¯°æÇÏ°Ô µÇ¾ú´Ù. À§¿Í °°ÀÌ ¼öÁ¤ÇÏ¿© ¹èÆ÷ÇØ³õ°í Å×½ºÆ®¸¦ Çϴµ¥ ½Ã½ºÅÛÀÌ ¿ÏÀüÈ÷ µÚÁ×¹ÚÁ×À¸·Î µ¹¾Æ¹ö¸®´Â °ÍÀÌ ¾Æ´Ñ°¡. ÀÌ °æ¿ìµµ method À̸§Ã³·³ ¸î½Ã°£À» Çì¸Å¾ú´Ù.
À̹ø¿¡ argumentÀÇ ¿ÀŸ·Î ÀÎÇÑ ¾îó±¸´Ï ¾ø´Â ½Ç¼ö¿´´Ù. setMemberNo(int menberNo)¿¡¼ ¹®Á¦°¡ ¹ß»ýµÇ¾ú´ø °ÍÀÌ´Ù. ÀμöÀÇ memberNo¸¦ menberNo·Î À߸øÄ£°ÍÀÌ´Ù. ±×·¡¼ memberNo¿¡´Â ÇØ´ç memberÀÇ memberno°¡ ¾Æ´Ñ 0ÀÌ ¸ðµÎ µé¾î°¬¾î´ø °ÍÀÌ´Ù. ½Ã½ºÅÛÀº memberno¸¦ ±âÁØÀ¸·Î µµ´Â ºÎºÐÀÌ ³Ê¹«³ª ¸¹¾Ò±â¿¡ ¿À·ù³ª´Â ºÎºÐµµ ¸¹¾ÒÀ¸¸ç DB¿¡¼´Â Á¦´ë·Î µÈ membernoÀ» ÀÐ¾î ¿ÔÀ¸¸ç, compile°ú runtime½Ã ¾Æ¹«·± ¹ÝÀÀµµ ¾ø¾ú±â¿¡, Ãʺ¸ÀÚ¸¦ ±×·¸°Ôµµ °í»ý½ÃÄ׳ª º¸´Ù.
À̰͵µ member field¸é ¹«Á¶°Ç this¸¦ ºÙÀ̵µ·Ï ÇÏ´øÁö Java°¡ Àμö´Â 'm_'¿Í prefix¸¦ ºÙÀ̵µ·Ï Coding StyleÀ» Á¤ÀÇ- SUN»çÀÌÆ®ÀÇ Java Coding ±Ô¾à¿¡´Â "Variable names should not start width underscore_ or dollar sign $ characters, even though both are allowed." ¿Í °°ÀÌ ¸í½ÃµÇ¾î ÀÖ´Ù - Çß´õ¶ó¸é ¹ß»ýÇÏÁö ¾Ê¾ÒÀ» ¹®Á¦ÀÌ´Ù.
¶ÇÇÑ C¾ð¾î³ª C#¿¡¼ ó·³ compile °æ°í·¹º§À» ³ô¿©³õÀ¸¸é "menberNo´Â ¾îµð¼µµ »ç¿ëÇÏÁö ¾Ê½À´Ï´Ù."¿Í °°Àº ¸Þ¼¼Áö¸¦ º¸¿© Áá´õ¶ó¸é °í»ýÀ» ´ú ÇÏÁö ¾Ê¾ÒÀ»±î?
6.2.4 "static member¸¦ instance¸¦ °æÀ¯ÇÏ¿© ÂüÁ¶Çؼ´Â ¾È µÈ´Ù." #
¿¹¸¦ µé¾î ClassA ¿¡ public static int AA ¶ó´Â static field°¡ ÀÖÀ» °æ¿ì ClassA.AA ·Î Á¢±ÙÇØ¾ß Çϴµ¥, ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÏ´Â ½Ç¼ö¸¦ ¹üÇÑ´Ù.(¹°·Ð ¿À·ù´Â ¾øÁö¸¸)
ClassA a = new ClassA();
int i = a.AA; //instance¸¦ °æÀ¯ÇÏ¿© Á¢±Ù
int j = ClassA.AA; //¿Ã¹Ù¸£°Ô Á¢±Ù
±×·³ ¿Ö ±»ÀÌ ClassA.AA¿Í °°ÀÌ instance°¡ ¾Æ´Ñ classÀ̸§À» ºÙ¿©¾ß ÇÒ±î?
static member(static field/static method)´Â compile½Ã¿¡ ÀÌ¹Ì ¾î´À°ÍÀ» È£ÃâÇÒ Áö °áÁ¤Çϱ⠶§¹®¿¡ À§ÀÇ a.AA¿Í °°Àº °ÍÀº staticÀÌ ¾Æ´Ñ°Í °°Àº ¿ÀÇØ¿Í È¥¶õ¸¸ °¡Á®¿À±â ¶§¹®ÀÌ´Ù. ½ÉÁö¾î °³ÀÎÀûÀ¸·Î´Â µ¿ÀÏ class ³» - À§ ¼Ò½º¿¡¼ ClassAÀÇ member method - ¿¡¼ ClassA.AA¶ó°í »ç¿ëÇÏ´Â ÆíÀÌ´Ù.
ÀÌ´Â local variable°ú È¥µ¿µÉ ¿°·Áµµ ¾øÀ»»Ó´õ·¯ AA¶ó´Â º¯¼ö°¡ staticÀ̶ó´Â °Íµµ È®½ÇÈ÷ ¾Ë ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¹°·Ð private static ÀÇ °æ¿ì´Â ClassA.BB ¿Í °°ÀÌ ÇÏÁö ¾Ê°í BB ¶ó°í ÇØµµ ¹«¹æÇϰÚÁö¸¸ ¸»ÀÌ´Ù.
6.2.5 "super keyword´Â ºÎ¸ðÀÇ this" #
Java °³¹ßÀÚ ´ëºÎºÐÀº 'super' ¿¡ ´ëÇÏ¿© ±×·¸°Ô ¹Î°¨ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ±×°Å super() ³ª super.method1() °ú °°ÀÌ »ç¿ëµÇÁö ±× ÀÌ»ó¿¡ ´ëÇØ¼± ±íÀÌ »ý°¢ÇÏÁö ¾Ê°Ô µÈ´Ù. super¸¦ ÇѸ¶µð·Î Á¤¸®ÇÏ¸é ´ÙÀ½°ú °°´Ù.
"super keyword´Â instance methodµî¿¡¼ this¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â °÷¿¡¼¸¸ ¾µ ¼ö ÀÖ´Ù. thisÀÇ ÀÚ¸®¿¡ super¶ó°í ¾²¸é ÇöÀç classÀÇ member°¡ ÂüÁ¶µÇ´Â ´ë½Å ºÎ¸ð classÀÇ member°¡ ÂüÁ¶µÇ´Â °ÍÀÌ´Ù."
6.3 »ó¼Ó¿¡ °üÇÑ ¶Ç ´Ù¸¥ ¹®Á¦ #
6.4.1 "»ý¼ºÀÚ¿¡ void ¸¦ ºÙÀδٸé?" #
»ý¼ºÀÚ¿¡ void¸¦ ºÙÀÎ´Ù¸é ±× class°¡ new µÉ¶§ ±× »ý¼ºÀÚ(?)°¡ ½ÇÇàµÉ±î?? ¾Æ·¡ÀÇ 'Constuctor'¶ó´Â ¹®ÀÚ¿Àº Ãâ·ÂµÉ±î?
public class ConstructorTest{
void ConstructorTest(){
System.out.println("Constuctor");
}
.....
}
Ãâ·ÂµÇÁö ¾Ê´Â´Ù. ¹°·Ð compile½Ã ¾Æ¹«·± °æ°íµµ ¾ø¾ú´Ù. Áï, void°¡ ºÙÀº ConstructorTest()´Â »ý¼ºÀÚ°¡ ¾Æ´Ï¶ó instance methodÀÏ »ÓÀ̾ú°í new½Ã¿¡´Â default constructor°¡ ½ÇÇà µÇ¾ú´ø °ÍÀÌ´Ù.
6.4.2 "if / switch ÀÇ ÇÔÁ¤" #
Java °³¹ßÀÚ¶ó¸é ´ëºÎºÐÀÌ Ãʺ¸½ÃÀý¿¡ if Á¶°ÇÀý¿¡ '==' ´ë½Å '='À» ½áº» ±â¾ïÀÌ ÀÖÀ»°ÍÀÌ´Ù. ¿¹¸¦ µé¾î "if( isListenLecture == Student.STUDENT )" ¸¦ "if( isListenLecture = Student.STUDENT )" ·Î À߸ø ¾´ °æ¿ìÀÌ´Ù. ¿©±â¼ Student.STUDENT´Â boolean typeÀÌ´Ù. ¿©±â¼ isListenLecture´Â Ç×»ó Student.STUDENT °ªÀ» °®°Ô µÇ´Â ¹ö±×°¡ »ý±ä´Ù. ÀÌ´Â compile½Ã¿¡ ¾Æ¹«·± °æ°íµµ ¾ø´Ù. ÀÌ·¸°Ô Çѹø ´çÇÏ°í ³ª¸é ¾ÕÀ¸·Î´Â '=='¸¦ Á¤È®È÷ ¾²°Ô µÇ°Å³ª ¾Æ´Ï¸é ´ÙÀ½°ú °°ÀÌ ¾´´Ù.
"if( isListenLecture )" ¶Ç´Â "if( !isListenLecture )" ¶ó°í ¸»ÀÌ´Ù. À̰ÍÀÌ ´õ¿í °£°áÇϰí Àǹ̵µ ºÐ¸íÇØ Áö±â ¶§¹®ÀÌ´Ù. ¶ÇÇÑ ´ÙÀ½ ¼Ò½º¿Í °°Àº ¿À·ùµµ ¹üÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ÀÌ´Â À߸øµÈ indentationÀ¸·Î ºú¾îÁö´Â Ãʺ¸ÀÇ ÇÔÁ¤ÀÌ´Ù.
À̱ÛÀ» Àд ºÐ²² ÇѰ¡Áö ´çºÎµå¸®°í ½ÍÀº°ÍÀº ¿©±â¼ Ãʺ¸¶ó°í ´Ù ±×·±°Ç ¾Æ´Ï¶ó´Â °ÍÀÌ´Ù.
....
if( a < 5 )
b = 3;
c = 10; //À̺κÐÀº ³ªÁß¿¡ Ãß°¡µÈ ¶óÀÎÀÌ´Ù.
if( isStudent )
if( isFemale )
sayHello("Hi~~");
else
sayHello("Hello Professor~");
À§ÀÇ ¼Ò½ºÁß c = 10; ÀÌ if( a < 5 )ÀÇ ÂüÀ϶§ ¼öÇàµÈ´Ù°í ¿ÀÇØÇÒ ¼öµµ ÀÖ°í, sayHello("Hello Professor~"); ºÎºÐÀÌ if( isStudent )ÀÇ else ºÎºÐÀ̶ó°í ¿ÀÇØ ÇÒ ¼öµµ ÀÖ´Ù. À̰ÍÀº ÀüÀûÀ¸·Î indentation(µé¿©¾²±â)ÀÇ ºÒÂû·Î °³¹ßÀÚ°¡ À߸ø ÀÐÀ» ¼ö ÀÖ´Â ºÎºÐÀÌ´Ù. Java Coding Style¿¡¼´Â if¹® ´ÙÀ½¿¡ ÇÑÁÙÀÇ Äڵ尡 ÀÖ´õ¶óµµ {} ¸¦ »ç¿ëÇÏ±æ ±Ç°íÇÑ´Ù. ±×·¯¸é ù¹øÂ° if¹®°ú °°Àº ¿À·ù¸¦ ¹æÁöÇÒ ¼ö ÀÖ°í µÎ¹øÂ° if¹®¿¡¼µµ º¸´Ù °¡µ¶¼ºÀÌ »ý±æ °ÍÀÌ´Ù.
ÀÌ¿Í À¯»çÇÑ °ÍÀ¸·Î switch¹®ÀÇ case Àý¿¡¼ break¸¦ ¾²Áö ¾Ê¾Æ Ç×»ó µ¿ÀÏÇÏ°Ô Ã³¸®µÇ´Â ¹ö±×µµ °æÇèÇØ º¸¾ÒÀ» °ÍÀÌ´Ù.
7 Java ±â´É Àû¿ë ¸î°¡Áö #
7.1 ´ë±Ô¸ð °³¹ß¿¡¼ interface ºÐ¸®Çϱâ #
7.1.1 "interface ºÐ¸®ÀÇ Çʿ伺" #
Java¿Í °°Àº °´Ã¼ÁöÇâ¾ð¾î¿¡¼´Â °ø°³ÇØ¾ß ÇÒ method¸¸À» publicÀ¸·Î Çϰí, °ø°³ÇÒ Çʿ䰡 ¾ø´Â °ÍÀº privateÀ¸·Î ÇÏ¿© classÀÇ »ó¼¼ÇÑ ³»¿ëÀ» ÀºÆóÇÒ ¼ö ÀÖ°Ô µÇ¾î ÀÖ´Ù. ±×·±µ¥ private ºÎºÐÀÌ ÀºÆóµÇ¾î ÀÖ´Â°Í Ã³·³ º¸À̴°¡?
¼Ò½º¸¦ º¸¸é ÈÍÈ÷ µé¿©´Ù º¸À̴µ¥?
´ë±Ô¸ð °³¹ßÀº ÇϺΠclassºÎÅÍ bottom-upÀ¸·Î ÁøÇàÇÏ´Â °ÍÀÌ ÀÌ»óÀûÀÎ ÇüÅÂÀÏ °ÍÀÌ´Ù. ±×·± ÇüÅ·Π°³¹ßÇϸé ÀÓÀÇÀÇ ½ÃÁ¡¿¡¼ Å×½ºÆ®¸¦ ÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª Çö½ÇÀûÀ¸·Î ´Ü±â°£¿¡ ¸¹Àº ¼öÀÇ °³¹ßÀÚ°¡ ºÙ¾î¼ ´Ü½Ã°£¿¡ °³¹ßÀ» ÁøÇàÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ¶ÇÇÑ ¼·Î È£ÀÀÇÏ´Â °ü°è¿¡ ÀÖ´Â classµéÀº ¾î´ÀÂÊÀÌ ÇϺÎÀÎÁö Á¤ÀÇÇϱⰡ ³°¨ÇÒ¶§°¡ ¸¹´Ù. ÀÌ·±°æ¿ì ¿ì¸®´Â ÈçÈ÷ package´ÜÀ§·Î ³ª´©¾î °³¹ßÇÑ´Ù. ÇÏÁö¸¸ ÀÌ·²°æ¿ì ¾î´ÀÁ¤µµ ÄÚµùÀÌ Á¾·áµÉ¶§±îÁö Å×½ºÆ®ÇϱⰡ »ó´çÈ÷ Èûµé¾î Áø´Ù. Java¿¡¼´Â private member¿Í method ±¸Çö±îÁö ÇϳªÀÇ ÆÄÀÏ¿¡ ÄÚµùÇϴµ¥ °³¹ß Áß°£¿¡ °ø°³ÇÏ¿© ´Ù¸¥ °³¹ßÀÚ°¡ ÀÌ¿ëÇØ¾ß ÇÏ´Â class¸¦ ¹èÆ÷ÇÒ ¼ö ¾øÀ¸¹Ç·Î µ¿½Ã °³¹ßÀÌ ±îÄ¥ÇØ Áø´Ù.
ÀÌ »óȲ¿¡¼ ´Ù¸¥ package(°³¹ßÀÚ)¿¡ °ø°³ÇØ¾ß ÇÏ´Â class ºÎºÐÀ» interface·Î °ø°³ÇÏ¸é ¸¹Àº ºÎºÐ À¯¿¬ÇÏ°Ô µÈ´Ù. ÀÌ interface¸¦ ´Ù¸¥ °³¹ßÀÚ´Â °³¹ßÀ» Çϰí Å×½ºÆ®°¡ ÇÊ¿äÇÏ´Ù¸é TestImpl class¸¦ ¸¸µé¾î ÇϸéµÈ´Ù. RMI³ª CORBA¿¡¼µµ StubÀº ÀÌ·±½ÄÀ¸·Î IDLÀ» Á¤ÀÇÇÑ´Ù.
7.2 Java¿¡¼ÀÇ ¿°ÅÇü #
Java¿¡¼´Â ¿°ÅÇü-CÀÇ ±¸Á¶Ã¼, °ø¿ëü-ÀÌ ¾ø´Ù. ¿°ÅÇüÀÌ ¿Ö ÇÊ¿äÇÏ³Ä°í ¹Ý¹®ÇÏ´Â °³¹ßÀÚµµ ÀÖÀ» °ÍÀÌ´Ù.
ÇÏÁö¸¸ ¿°ÅÇüÀÌ ¾ø¾î °ï¶õÀ» °æÇèÇÑ °³¹ßÀÚµµ ²Ï ÀÖÀ¸¸®¶ó º»´Ù. ÃÖ±Ù¾ð¾î(ƯÈ÷ °´Ã¼ÁöÇâ ¾ð¾î) - Java, Eiffel, Oberonµî - ¿¡´Â ¿°ÅÇüÀº Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù. C#¿¡´Â ÀÖ±ä ÇÏÁö¸¸.
ÀÌ·± ÀÌÀ¯·Î Java AWTÀÇ Label class´Â ´ÙÀ½°ú °°ÀÌ ±¸ÇöµÇ¾î ÀÖ´Ù.(ÅØ½ºÆ®ÀÇ Á¤·Ä°ª°ü·Ã)
public static final int LEFT = 0;
public static final int CENTER = 1;
public static final int RIGHT = 2;
...
label.setAlignment(Label.CENTER);
...
ÇÏÁö¸¸ À§ÀÇ ¼Ò½º¿¡´Â ¹®Á¦°¡ ÀÖ´Ù. setAlignment() methodÀÇ ÀÎÀÚ°¡ intÀÎ °ÍÀÌ´Ù. ¸¸¾à À§¿¡ Á¤ÀÇÇÑ 0, 1, 2°¡ ¾Æ´Ñ ´Ù¸¥ int °ªÀÌ µé¾î°¡µµ compile/runtime½Ã ¾Ë¼ö°¡ ¾ø´Ù. ±×·¡¼ ÁÖ¼®À» ´Þ°Ô µÇ´Âµ¥, ÁÖ¼®À̶ó ÇÔÀº Á¤¸»ÀÌÁö ÃÖÈÄÀÇ ¼ö´ÜÀ̶ó°í ºÁ¾ß ÇÑ´Ù.
½ÇÁ¦·Î ¿ì¸®°¡ °³¹ßÇØ ³õÀº ¼Ò½º¿¡µµ ÀÌ·±ºÎºÐÀÌ ÀÖÀ¸¸®¶ó ¿¹»óµÈ´Ù. ÀÌ ¹®Á¦¸¦ ¾î¶»°Ô Çϸé ÇØ°áÇÒ ¼ö ÀÖÀ»±î?
Java¿¡¼ ¿°ÅÇüÀ» Çѹø ¸¸µé¾î º¸ÀÚ.
//LabelAlignment.java
public class LabelAlignment {
private LabelAlignment() {} //ÀÌ´Â »ý¼ºÀÚ¸¦ privateÀ¸·Î ÇÏ¿© ´Ù¸¥µ¥¼´Â ¸¸µéÁö ¸øÇϵµ·Ï ÇϱâÀ§ÇÔÀÌ´Ù.
public static final LabelAlignment LEFT = new LabelAlignment():
public static final LabelAlignment CENTER = new LabelAlignment():
public static final LabelAlignment RIGHT = new LabelAlignment():
}
//º¯ÇüµÈ Label.java ÀÇ ÀϺÎ..
public synchronized void setAlignment(LabelAlignment alignment){
if( alignment == LabelAlignment.LEFT ){
...//¿ÞÂÊÀ¸·Î ¸ÂÃß±â..
}else if( ...
...
}
}
...
À§¿¡¼ ÀÛ¼ºÇÑ ¼Ò½º´Â Àß ÀÛµ¿ÇÑ´Ù. ¼·Î ´Ù¸¥ 3°³ÀÇ instanceÀ̹ǷΠreference°¡ ´Þ¶ó '==' ¿¬»êµµ °¡´ÉÇϰí, ÈǸ¢ÇÏ´Ù.
ÇÏÁö¸¸ ÇѰ¡Áö ¹®Á¦°¡ ÀÖ´Ù. LabelAlignment°¡ SerializableÇÑ class¿¡¼ serializeµÇ¾ú´Ù deserialize µÈ´Ù¸é?
LabelAlignment alignment ´Â »õ·Î¿î instance°¡ µÇ°í serializeÀüÀÇ reference¿Í ´Ù¸¥ ÂüÁ¶ À§Ä¡¸¦ °®°Ô µÇ¾î '==' ¿¬»êÀº ¹ö±×¸¦ ¹ß»ý½ÃŲ´Ù.
±×·³ À̰͸¸ ÇØ°áÇÏ¸é µÇ°Ú´Âµ¥, ¾î¶»°Ô refactoringÇÏ¸é µÉ °ÍÀΰ¡? '==' ¿¬»ê ´ë½Å equals·Î º¯ÇüÇÏ¸é µÇ°Ú´Âµ¥.
//LabelAlignment.java
public class LabelAlignment {
private int flag;
private LabelAlignment(int flag){
this.flag = flag;
}
public static final LabelAlignment LEFT = new LabelAlignment(0):
public static final LabelAlignment CENTER = new LabelAlignment(1):
public static final LabelAlignment RIGHT = new LabelAlignment(2):
public boolean equals(Object obj){
return ((LabelAlignment)obj).flag == this.flag;
}
}
//º¯ÇüµÈ Label.java ÀÇ ÀϺÎ..
public synchronized void setAlignment(LabelAlignment alignment){
if( LabelAlignment.LEFT.equals(alignment) ){
...//¿ÞÂÊÀ¸·Î ¸ÂÃß±â..
}else if( ...
...
}
}
...
ÇÏÇÏ, Serialize±îÁö Àß ÀÛµ¿ÇÑ´Ù. ^^;
¿©±â¼ Debug¸¦ °í·ÁÇÑ´Ù¸é 0, 1, 2 ´ë½Å ¹®ÀÚ¿·Î "LEFT", "CENTER", "RIGHT"·Î ÇÑ´Ù¸é ´õ¿í ¸íÈ®ÇÏÁö ¾ÊÀ»±î?
(ÁÖÀÇ) À§¿¡¼Ã³·³ LabelAlignment.LEFT ¶ó°í ¾²±â ½È¾î¼ »ó¼ö interface¸¦ ¸¸µé¾î ±×°É implements ÇÏ¿© ±×³É LEFT ¶ó°í ¾²´Â °ÍÀ» »ÑµíÇØ ÇÏ¸ç ¾²´Â °³¹ßÀÚµéÀÌ ÀÖ´Ù. ¹°·Ð SwingÀÇ ¼Ò½ºµéÀ» º¸´Ùº¸¸é SwingConstants¶ó´Â interface¿¡ LEFT¸¦ ºñ·ÔÇÏ¿© ¿Â°® Àâ´ÙÇÑ »ó¼ö¸¦ Áý¾î³Ö¾î³õ°í ¿©±â Àú±â¼ implementsÇØ¼ »ç¿ëÇϰí ÀÖ´Ù. ÀÌ·± ÄÚµù ½ºÅ¸ÀÏÀº '³» ½ºÅ¸ÀÏÀ̾ß~' °¡ ¾Æ´Ï¶ó ³¿»õ³ª´Â ÄÚµåÀÌ´Ù.
LEFT¶ó´Â °ÍÀÌ ±¸ÇöÇÑ class¿¡ ÀÌ¹Ì ÀÖÀ» ¼ö ÀÖÀ» ¼ö ÀÖÀ»»Ó¾Æ´Ï¶ó ±¸ÇöÇÑ ¸ðµç Ŭ·¡½º¿¡¼ LEFT¸¦ º¸À¯ÇÏ¿© SwingConstants.LEFT»Ó ¾Æ´Ï¶ó Impl.LEFT·Îµµ »ç¿ëµÇ°Ô µÇ¾î ¿Â°® È¥¶õÀ» ÃÊ·¡ÇÏ°Ô µÈ´Ù. ÀԷ·®À» ÁÙÀ̱â À§ÇØ interface¸¦ implements ÇØ¼´Â ¾ÈµÇÁö ¾ÊÀ»±î?
7.3 Debug write #
C¿¡¼´Â ´ÙÀ½°ú °°ÀÌ pre-process·Î Á¤ÀÇÇϸé DEBUG¶ó´Â ½Äº°ÀÚ¸¦ #defineÇÏÁö ¾ÊÀ¸¸é ÄÄÆÄÀÏÈÄ ÇØ´ç ¼Ò½ºÀÇ ºÎºÐÀÌ »èÁ¦µÈ´Ù.
#ifdef DEBUG
fprintf(stderr, "error...%dn", error);
#endif /* DEBUG */
±×·³ Java¿¡¼´Â?
Java¿¡¼´Â Pre-process°¡ ¾øÁö¸¸ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇßÀ»¶§ Debug.isDebug °¡ final·Î ¼±¾ðµÇ¾î ÀÖÀ¸¸é compileÈÄ ¾Æ·¡ 3ÁÙ ¸ðµÎ »èÁ¦ µÈ´Ù.(´Ü Debug.isDebug °¡ false ·Î ÃʱâÈ µÇ¾ú´Ù¸é Á¦°ÅµÈ´Ù.)
if( Debug.isDebug ){
System.out.println("error..." + error);
}
Java´Â compile½Ã byte code »ý¼º½Ã finalÀº Á¤ÀûÀ¸·Î ÆÇ´ÜÇÏ¿© ¹Ì¸® Á¤ÀÇÇϱ⠶§¹®¿¡ À§ÀÇ 3ÁÙÀº »èÁ¦µÉ ¼ö ÀÖ´Ù. if¹®°ú ÇÔ²² ¾ø¾îÁö°Ô µÇ¹Ç·Î ó¸® ¼Óµµ¿¡ ÇÇÇØ¸¦ ÁÖÁö ¾Ê´Â´Ù. ´Ü, ÁÖÀÇÇØ¾ß ÇÒ Á¡Àº Debug.isDebug °ªÀÌ º¯°æµÇ¸é ÀÌ °ÍÀ» »ç¿ëÇϰí ÀÖ´Â Ãøµµ ¸ðµÎ ÇÔ²² ´Ù½Ã compileÇØ¾ß ÇÑ´Ù. bytecode¸¦ ´Ù½Ã ¸¸µé¾î¾ß Çϱ⠶§¹®ÀÌ´Ù.
±×·±µ¥, ÀÌ ¼Ò½º¸¦ Debug.write()¿Í °°ÀÌ static À¸·Î ÇÏ¿© ÀÌ method³»¿¡¼ ÆÇ´ÜÇÏ°Ô ÇÏ¸é Æí¸®ÇÒÅÙµ¥. ±×¸®°í classº°·Î ON/OFF 󸮸¦ ÇÒ ¼ö ÀÖÀ¸¸é ÁÁÀ»ÅÙµ¥, ¾îÂî ÇÏ¸é °¡´ÉÇÒ °ÍÀΰ¡?
±×·³ ¸ÕÀú È£ÃâÇÑ ÂÊÀÇ classÀ̸§À» ã¾Æº¸ÀÚ. Á¢±ÙÀº ExceptionÀÇ printStackTrace()·Î ºÎÅÍ ½ÃÀ۵Ǿú´Ù. ÇÏÁö¸¸ ÀÌ ¼Ò½º¿¡´Â Exception °´Ã¼¸¦ newÇÑ ½ÃÁ¡¿¡ °áÁ¤µÇ¾î ÀÖ´Ù. ±×·¡¼ ºÎ¸ðÀÎ ThrowableÀÇ »ý¼ºÀÚ¸¦ È®ÀÎÇØ º¸´Ï fillInStackTrace() ·Î µÇ¾îÀִµ¥ ÀÌ method´Â native method¿´´Ù.
API Reference¸¦ º¸¸é Thread class¿¡¼´Â dumpStackTrace()¶ó´Â method°¡ ÀÖ¾ú´Ù. ¼Ò½º¸¦ º¸´Ï, ±×°Íµµ »ý¼º½ÃÁ¡À̾ú´Ù. ¾Æ¹«·¡µµ ¿¹¿Ü¹æ¸é¿¡¼ ã´Â°Ç ¹«¸®Àεí Çß´Ù.
±×·¡¼ classÀÇ È£Ãâ°èÃþÀ» ³ªÅ¸³»´Â java.lang.SecurityManagerÀÇ getClassContext() method·Î Á¢±ÙÇÏ¿´´Ù. sample ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.
// 1. GetCallerSecurityManager.java
public final class GetCallerSecurityManager extends SecurityManager {
public Class[] getStackTrace(){
return this.getClassContext();
}
}
// 2. GetCallerClass.java
public final class GetCallerClass {
private static GetCallerSecurityManager mgr;
static{
mgr = new GetCallerSecurityManager();
System.setSecurityManager(mgr);
}
public static void writeCaller(String str){
Class[] stk = mgr.getStackTrace();
int size = stk.length;
for(int i = 0; i < size; i++){
System.out.println("stk[" + i + "] = " + stk[i]);
}
String className = stk[2].getName();
System.out.println("className is " + className + " : " + str);
}
}
// 3. GetCallerClassMain1 : È£ÃâÇϴ Ŭ·¡½º ¿¹Á¦ 1
public class GetCallerClassMain1 {
public static void main(String[] args){
GetCallerClass.writeCaller(", real is 1.");
}
}
// 4. GetCallerClassMain1 : È£ÃâÇϴ Ŭ·¡½º ¿¹Á¦ 2
public class GetCallerClassMain2 {
public static void main(String[] args){
GetCallerClass.writeCaller(", real is 2.");
}
}
À§ÀÇ 3¹ø ÁÖ¼®°ú 4¹ø ÁÖ¼® ºÎºÐÀ» ¼öÇàÇÏ¸é ´ÙÀ½°ú °°Àº °á°ú°¡ ³ª¿Â´Ù.
className is GetCallerClassMain1 : , real is 1.
className is GetCallerClassMain2 : , real is 2.
Á¤È®È÷ È£ÃâÇÑ Å¬·¡½º¸¦ Ç¥ÇöÇϰí ÀÖ´Ù. À̰ÍÀ» ºñ±³Çؼ Ŭ·¡½ºº° ON/OFF¸¦ ±¸ÇöÇÏ¸é µÈ´Ù.
8 Java 5.0 Tiger ¿¡ ´ëÇÏ¿© #
Tiger¿¡¼´Â »õ·Î¿î °³³äÀÇ Àû¿ëÀÌ ¸¹Àº ºÎºÐ ½Ãµµ µÇ¾ú´Ù. ÀÌÁß °¡Àå ±âº»ÀÌ µÇ´Â ¸î°¡Áö¸¦ »ìÆìº¸ÀÚ.
8.1 Working with java.util.Arrays #
Tiger¿¡¼´Â ¹«¾ùº¸´Ùµµ Collection classµé¿¡ ´ëÇØ ¸¹Àº ºÎºÐ Á¤ºñÇÏ¿´´Ù. ¿¹¸¦ µé¸é for/in ±¸¹® Áö¿ø°ú Generic Type member¿Í Arrays Utility class µîÀÌ´Ù. ±×·³ Collection¿¡ ´ëÇÑ static methodµéÀ» ´ã°í ÀÖ´Â Arrays ¿¡ ´ëÇØ ´ÙÀ½ example·Î ÇÑ´«¿¡ »ìÆìº¸ÀÚ.
package com.jeid.tiger;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class ArraysTester {
private int[] arr;
private String[] strs;
public ArraysTester(int size) {
arr = new int[size];
strs = new String[size];
for (int i = 0; i < size; i++) {
if (i < 10) {
arr[i] = 100 + i;
} else if (i < 20) {
arr[i] = 1000 - i;
} else {
arr[i] = i;
}
strs[i] = "str" + arr[i];
}
}
public int[] getArr() {
return this.arr;
}
public String[] getStrs() {
return this.strs;
}
public static void main(String[] args) {
int size = 50;
ArraysTester tester = new ArraysTester(size);
int[] testerArr = tester.getArr();
int[] cloneArr = tester.getArr().clone();
String[] testerStrs = tester.getStrs();
String[] cloneStrs = tester.getStrs().clone();
// clone test
if (Arrays.equals(cloneArr, testerArr)) {
System.out.println("clonse int array is same.");
} else {
System.out.println("clonse int array is NOT same.");
}
if (Arrays.equals(cloneStrs, testerStrs)) {
System.out.println("clonse String array is same.");
} else {
System.out.println("clonse String array is NOT same.");
}
// 2ºÎÅÍ 10±îÁö °ª ¼ÂÆÃ
Arrays.fill(cloneArr, 2, 10, new Double(Math.PI).intValue());
testerArr[10] = 98;
testerStrs[10] = "corea";
testerStrs[11] = null;
List<String> listTest = Arrays.asList(testerStrs);
System.out.println("listTest[10] = " + listTest.get(10));
System.out.println("------- unsorted arr -------");
System.out.println("Arrays.toString(int[]) = " + Arrays.toString(testerArr));
System.out.println("Arrays.toString(String[]) = " + Arrays.toString(testerStrs));
Arrays.sort(testerArr);
// Arrays.sort(testerStrs); //NullPointerException in sort method..(nullÀÌ ¾ø´õ¶óµµ ±æÀÌ¿¡ ´ëÇÑ Å©±â üũ´Â ¸øÇÔ)
Arrays.sort(testerStrs, new Comparator<String>() {
public int compare(String s1, String s2) {
if (s1 == null && s2 == null) {
return 0;
} else if (s1 == null && s2 != null) {
return -1;
} else if (s1 != null && s2 == null) {
return 1;
} else if (s1.length() < s2.length()) {
return -1;
} else if (s1.length() > s2.length()) {
return 1;
} else if (s1.length() == s2.length()) {
return 0;
} else {
return s1.compareTo(s2);
}
}
});
System.out.println("------- sorted arr -------");
System.out.println("Arrays.toString(int[]) = " + Arrays.toString(testerArr));
System.out.println("Arrays.toString(String[]) = " + Arrays.toString(testerStrs));
System.out.println("------------------------------------------------");
String[][] mstrs1 = { { "A", "B" }, { "C", "D" } };
String[][] mstrs2 = { { "a", "b" }, { "c", "d" } };
String[][] mstrs3 = { { "A", "B" }, { "C", "D" } };
System.out.println("Arrays.deepToString(mstrs1) = " + Arrays.deepToString(mstrs1));
System.out.println("Arrays.deepToString(mstrs2) = " + Arrays.deepToString(mstrs2));
System.out.println("Arrays.deepToString(mstrs3) = " + Arrays.deepToString(mstrs3));
if( Arrays.deepEquals(mstrs1, mstrs2)) {
System.out.println("mstrs1 is same the mstrs2.");
}else {
System.out.println("mstrs1 is NOT same the mstrs2.");
}
if( Arrays.deepEquals(mstrs1, mstrs3)) {
System.out.println("mstrs1 is same the mstrs3.");
}else {
System.out.println("mstrs1 is NOT same the mstrs3.");
}
System.out.println("mstrs1's hashCode = " + Arrays.deepHashCode(mstrs1));
System.out.println("mstrs2's hashCode = " + Arrays.deepHashCode(mstrs2));
System.out.println("mstrs3's hashCode = " + Arrays.deepHashCode(mstrs3));
}
}
8.2 Using java.util.Queue interface #
Queue¸¦ ÀÌ¿ëÇÏ¿© First In First OutOrderingÇÑ Queue¸¦ ±¸Çö °¡´ÉÇÏ´Ù.
package com.jeid.tiger;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
public class QueueTester {
public static void main(String[] args) {
System.out.println("---------- testFIFO ----------");
testFIFO();
System.out.println("---------- testOrdering ----------");
testOrdering();
}
private static void testFIFO() {
Queue<String> q = new LinkedList<String>();
q.add("First");
q.add("Second");
q.add("Third");
String str;
while ((str = q.poll()) != null) {
System.out.println(str);
}
}
private static void testOrdering() {
int size = 10;
Queue<Integer> qi = new PriorityQueue<Integer>(size);
Queue<String> qs = new PriorityQueue<String>(size);
for (int i = 0; i < size; i++) {
qi.offer(10 - i);
qs.offer("str" + (10 - i));
}
for (int i = 0; i < size; i++) {
System.out.println("qi[" + i + "] = " + qi.poll() + ", qs[" + i + "] = " + qs.poll());
}
}
}
8.3 java.lang.StringBuilder »ç¿ëÇϱâ #
StringBuffer°¡ synchronizeÇÏÁö ¾ÊÀº methodµé·Î ±¸¼ºµÈ µíÇÑ StringBuilder¸¦ »ç¿ëÇϹǷΠ¼º´É Çâ»óÀ» µµ¸ðÇÒ¼ö ÀÖ´Ù. »ç¿ë¹ýÀº StringBuffer¿Í µ¿ÀÏÇÏ´Ù.
package com.jeid.tiger;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class StringBuilderTester {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("str1");
list.add("str2");
list.add("str3");
String ret = appendItems(list);
System.out.println("ret = " + ret);
}
private static String appendItems(List<String> list) {
StringBuilder sb = new StringBuilder();
for (Iterator<String> iter = list.iterator(); iter.hasNext();) {
sb.append(iter.next()).append(" ");
}
return sb.toString();
}
}
8.4 Using Type-Safe Lists #
Collection¿¡ typeÀ» ¸í½ÃÇÏ¿© type-safe ÇÏ°Ô Ã³¸® °¡´É. ¾Æ·¡¿¡¼ typeÀ» ¸í½ÃÇÏÁö ¾ÊÀ» °æ¿ì compile error°¡ ³²À» º¸¿©ÁØ´Ù. tipÀ¸·Î Number¸¦ ÀÌ¿ëÇÏ¿© byte, short, int, long, double, float µ¿½Ã »ç¿ëÇÏ´Â ºÎºÐ ÂüÁ¶.
package com.jeid.tiger;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class ListTester {
public static void main(String[] args) {
List<String> list = new LinkedList<String>();
list.add("str1");
list.add("str2");
list.add(new Integer(123)); // <-- StringÀÌ ¾Æ´Ï¹Ç·Î compile error!!
//Iterator¿¡ String typeÀ» ¸í½ÃÇϹǷΠÁ¤»èÀÛµ¿µÊ.
for (Iterator<String> iter = list.iterator(); iter.hasNext();) {
String str = iter.next();
System.out.println("srt = " + str);
}
//Iterator¿¡ String typeÀ» ¸í½ÃÇÏÁö ¾Ê¾ÒÀ¸¹Ç·Î ¾Æ·¡ A ºÎºÐ¿¡¼ compile ¿À·ù ¹ß»ý!!
for (Iterator iter = list.iterator(); iter.hasNext();) {
String str = iter.next(); //A
System.out.println("srt = " + str);
}
//byte, short, int, long, double, float µ¿½Ã »ç¿ë
List<Number> lstNum = new LinkedList<Number>();
lstNum.add(1);
lstNum.add(1.2);
for (Iterator<Number> iter = lstNum.iterator(); iter.hasNext();) {
Number num = iter.next();
System.out.println("num = " + num);
}
}
}
8.5 Writing Generic Types #
class ³ª interface keyword¿¡ typeÀ» ¸í½ÃÇÏ¿© µ¿ÀÏ Å¸ÀÔ ¸í½Ã °¡´É. ÁÖÀÇ ÇÒ Á¡Àº any typeÀº static ÀÏ ¼ö ¾ø´Ù.(µ¿ÀûÀ¸·Î typeÀÌ Á¤ÇØÁö¹Ç·Î)
class AnyTypeList<T> {
//class AnyTypeList<T extends Number> { // <-- ÀÌ´Â Number¸¦ »ó¼ÓÇÑ typeÀº Çã¿ëÇϰڴٴ ÀǹÌ.
private List<T> list;
//private static List<T> list; // <-- ÀÌ´Â Á¤ÀûÀ̹ǷΠcompile error ¹ß»ý!!!
public AnyTypeList(){
list = new LinkedList<T>();
}
public boolean isEmpty(){
return list == null || list.size() == 0;
}
public void add(T t){
list.add(t);
}
public T grap(){
if (!isEmpty() ) {
return list.get(0);
} else {
return null;
}
}
}
8.6 »õ·Î¿î static final enum #
¿¹Á¦¸¦ ÅëÇØ ¾Ë¾Æº¸ÀÚ.
package com.jeid.tiger;
import com.jeid.BaseObject;
import com.jeid.MyLevel;
public class EnumTester extends BaseObject {
private static long start = System.currentTimeMillis();
public static void main(String[] args) {
try {
test();
enum1();
} catch (Exception e) {
e.printStackTrace();
}
printEllapseTime();
}
private static void test() throws Exception {
byte[] b = new byte[0];
System.out.println(b.length);
}
private static void enum1() {
//enum TestEnum { A, B }; //enum cannot be local!!!
for(MyVO.TestEnum te: MyVO.TestEnum.values()){
System.out.println("Allow TestEnum value : " + te);
}
System.out.println("---------------------------------------");
MyVO vo = new MyVO();
vo.setName("enum1");
vo.setLevel(MyLevel.A);
System.out.println(vo);
System.out.println("isA = " + vo.isA() + ", isGradeA = " + vo.isLevelA()+ ", isValueOfA = " + vo.isValueOfA());
System.out.println("getLevelInKorean = " + vo.getLevelInKorean());
}
private static void printEllapseTime() {
System.out.println("==> ellapseTime is " + (System.currentTimeMillis() - start) + " ms.");
}
}
package com.jeid.tiger;
import com.jeid.BaseObject;
import com.jeid.MyLevel;
public class MyVO extends BaseObject {
enum TestEnum {
A, B
}; // this is same public static final
private int id;
private String name;
private MyLevel grade;
// private List<T> list;
public MyLevel getLevel() {
return grade;
}
public void setLevel(MyLevel grade) {
this.grade = grade;
}
public boolean isA() {
return "A".equals(this.grade);
}
public boolean isValueOfA() {
return MyLevel.valueOf("A").equals(grade);
}
public boolean isLevelA() {
return MyLevel.A.equals(this.grade);
}
//A,B,C..´ë½Å 0,1,2... µµ µ¿ÀÏÇÔ.
public String getLevelInKorean() {
switch(this.grade){
case A:
return "¼ö";
case B:
return "¿ì";
case C:
return "¹Ì";
case D:
return "¾ç";
case E:
return "°¡";
default:
return "¾øÀ½";
}
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
8.7 Using java.util.EnumMap #
java.util.Map°ú µ¿ÀÏÇϳª key°¡ enum typeÀ̾î ÇÑ´Ù. ¿¹Á¦·Î »ìÆìº¸ÀÚ.
package com.jeid.tiger;
import java.util.EnumMap;
public class EnumMapTester {
private enum MyEnum {
A, B, C
}; // this is same the static final..
public static void main(String[] args) {
MyEnum[] enums = MyEnum.values();
System.out.println("MyEnum is " + enums[0] + ", " + enums[1] + ", " + enums[2]);
EnumMap<MyEnum, String> em = new EnumMap<MyEnum, String>(MyEnum.class);
em.put(MyEnum.A, "¼ö");
em.put(MyEnum.B, "¿ì");
em.put(MyEnum.C, "¹Ì");
em.put(MyEnum.B, "°¡"); //key Áߺ¹Àº HashMap°ú µ¿ÀÏÇÏ°Ô overwriteÀÓ.
for (MyEnum myEnum : MyEnum.values()) {
System.out.println(myEnum + " => " + em.get(myEnum));
}
}
}
8.8 Using java.util.EnumSet #
java.util.Set°ú µ¿ÀÏÇϳª value°¡ enum typeÀ̾î ÇÑ´Ù. ¿¹Á¦·Î »ìÆìº¸ÀÚ.
package com.jeid.tiger;
import java.util.EnumSet;
public class EnumSetTester {
private enum MyEnum {
A, B, C, a, b, c
}; // this is same the static final..
public static void main(String[] args) {
MyEnum[] enums = MyEnum.values();
System.out.println("MyEnum is " + enums[0] + ", " + enums[1] + ", " + enums[2]);
EnumSet<MyEnum> es1 = EnumSet.of(MyEnum.A, MyEnum.B, MyEnum.C);
EnumSet<MyEnum> es2 = EnumSet.of(MyEnum.a, MyEnum.b, MyEnum.c);
EnumSet<MyEnum> es3 = EnumSet.range(MyEnum.a, MyEnum.c);
if (es2.equals(es3)) {
System.out.println("e2 is same e3.");
}
for (MyEnum myEnum : MyEnum.values()) {
System.out.println(myEnum + " contains => " + es1.contains(myEnum));
}
}
}
8.9 Convert Primitives to Wrapper Types #
int, short, char, long, doubleµî primitive¿Í À̵éÀÇ Object Wrapper ÀÎ Integer, Shrt, Charµî °£ÀÇ converting¿¡ ÀÖ¾î ÀÚµ¿À¸·Î ó¸®ÇØÁÖ´Â boxing°ú unboxingÀÌ Áö¿ø µÊ¿¡ µû¶ó type¿¡ ´ëÇÑ À¯¿¬ÇÑ Ã³¸®°¡ °¡´ÉÇØÁ³´Ù. ¿¹Á¦·Î »ìÆìº¸ÀÚ.
package com.jeid.tiger;
public class AutoBoxingTester {
public static void main(String[] args) {
int i = 0;
Integer ii = i; // boxing. JDK 1.4¿¡¼´Â incompatible type error°¡ ¹ß»ý Çß¾úÀ¸³ª Tiger¿¡¼´Â ±¦Âú´Ù.
int j = ii; // unboxing
for (ii = 0; ii < 5; ii++) { // IntegerÀε¥µµ ++ ¿¬»êÀÚ Áö¿ø.
}
i = 129;
ii = 129;
if (ii == i) {
System.out.println("i is same ii.");
}
// -128 ~ 127 »çÀÌÀÇ ¼ö´Â unboxingÀÌ µÇ¾î == ¿¬»êÀÌ Çã¿ëµÇÁö¸¸,
// ±× ¹üÀ§ ¿ÜÀÇ °æ¿ì Integer·Î boxingµÈ »óŹǷΠequals¸¦ ÀÌ¿ëÇØ¾ßÇÔ.
// ÀÌ´Â ¹ö±×°¡ ¹ß»ýÇßÀ» °æ¿ì ã±â ½±Áö ¾ÊÀº ´ÜÁ¡µµ ³»Æ÷Çϰí ÀÖ´Ù.!!
checkIntegerSame(127, 127); // same
checkIntegerSame(128, 128); // Not same
checkIntegerEquals(128, 128); // equals
checkIntegerSame(-128, -128); // same
checkIntegerSame(-129, -129); // Not same
checkIntegerEquals(-129, -129); // equals
System.out.println("--------------------------------------------");
Boolean arriving = false;
Boolean late = true;
String ret = arriving ? (late ? "µµÂøÇßÁö¸¸ ´Ê¾ú³×¿ä." : "Á¦½Ã°£¿¡ Àß µµÂøÇß±º¿ä.") :
(late ? "µµÂøµµ ¸øÇÏ°í ´Ê¾ú±º¿ä." : "µµÂøÀº ¸øÇßÁö¸¸ ´ÊÁø ¾Ê¾Ò±º¿ä.");
System.out.println(ret);
StringBuilder sb = new StringBuilder();
sb.append("appended String");
String str = "just String";
boolean mutable = true;
CharSequence chSeq = mutable ? sb : str;
System.out.println(chSeq);
}
private static void checkIntegerSame(Integer ii, Integer jj) {
if (ii == jj) {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is same ii.");
} else {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is NOT same ii!!");
}
}
private static void checkIntegerEquals(Integer ii, Integer jj) {
if (ii.equals(jj)) {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is equals ii.");
} else {
System.out.println("ii = " + ii + ", jj = " + jj + " ==> jj is NOT equals ii!!");
}
}
}
8.10 Method Overload resolution in AutoBoxing #
int°¡ 127À» ÃʰúÇÒ °æ¿ì boxingÀÌ ÀÌ·ç¾î Áúµí ÇÏÁö¸¸, method overload¿¡ À־ boxingÀÌ ÀÌ·ç¾î ÁöÁö ¾Ê¾Æ JDK1.4¿Í µ¿ÀÏÇÑ °á°ú¸¦ ¾ò´Â´Ù. ¿¹Á¦·Î »ìÆìº¸ÀÚ.
package com.jeid.tiger;
public class OverloadTester {
public static void main(String[] args) {
double d = 10;
Integer ii = new Integer(10);
doSomething(10);
doSomething(1000);
doSomething(ii);
doSomething(d);
}
private static void doSomething(Integer ii) {
System.out.println("This is doSomething(Integer)");
}
private static void doSomething(double d) {
System.out.println("This is doSomething(double)");
}
}
8.11 °¡º¯ÀûÀÎ argument °³¼ö ... #
Àμö°¡ °¡º¯ÀûÀÏ °æ¿ì ÀμöÀÇ °³¼ö°¡ ¾ø´Â°Í ºÎÅÍ ´Ù¼ö°³±îÁö ¸ðµÎ Áö¿ø. ¿¹Á¦·Î »ìÆìº¸ÀÚ.
package com.jeid.tiger;
public class VarArgsTester {
public static void main(String[] args) {
setNumbers(1, 2);
setNumbers(1, 2, 3, 4);
setNumbers(1);
// setNumbers(); //ÇØ´ç µÇ´Â method°¡ ¾ø¾î compile error!!
System.out.println("==============================================");
setNumbers2(1, 2, 3, 4);
setNumbers2(1);
setNumbers2();
}
// this is same setNumbers(int first, int[] others)
private static void setNumbers(int first, int... others) {
System.out.println("-----------setNumbers()----------- : " + first);
for (int i : others) {
System.out.println("i = " + i);
}
}
// this is same setNumbers(int[] others)
private static void setNumbers2(int... others) {
System.out.println("-----------setNumbers2()----------- : "
+ (others != null && others.length > 0 ? others[0] : "null"));
for (int i : others) {
System.out.println("i = " + i);
}
}
}
8.12 The Three Standard Annotation #
@Override - sign the override from superclass.
//Á¤»óÀûÀÎ »ç¿ë
@Override
public int hashCode(){
return toString().hashCode();
}
//½ºÆç¸µÀÌ Æ²·Á compile error!!
@Override
public int hasCode(){ //misspelled => method does not override a method from its superclass error!!
return toString().hashCode();
}
@Deprecated deprecated ÁÖ¼®°ú µ¿ÀÏÇϳª ºÎ¸ðÀÇ method°¡ deprecatedµÇ¸é ÀÚ½ÄÀÇ method¸¦ »ç¿ëÇØµµ deprecated·Î ³ª¿Â´Ù.
package com.jeid.tiger;
public class AnnotationDeprecateTester {
public static void main(String[] args){
DeprecatedClass dep = new DeprecatedTester();
dep.doSomething(10); //deprecated
}
}
class DeprecatedClass {
@Deprecated
public void doSomething(int ii){ //deprecated
System.out.println("This is DeprecatedClass's doSomething(int)");
}
public void doSomethingElse(int ii){
System.out.println("This is DeprecatedClass's doSomethingElse(int)");
}
}
class DeprecatedTester extends DeprecatedClass {
@Override
public void doSomething(int ii){
System.out.println("This is DeprecatedTester's doSomething(int)");
}
}
@SuppressWarnings SuppressWarnings¿¡ ÀÎÀÚ´Â String[] typeÀ¸·Î ¿©·¯°³¸¦ ¹è¿ÇüÅ·Π¾µ¼ö ÀÖ´Ù.
package com.jeid.tiger;
import java.util.ArrayList;
import java.util.List;
public class AnnotationSuppressWarningsTester {
@SuppressWarnings({"unchecked", "fallthrough"} )
private static void test1(){
List list = new ArrayList();
list.add("aaaaaa");
}
@SuppressWarnings("unchecked")
private static void test2(){
List list = new ArrayList();
list.add("aaaaaa");
}
//warningÀÌ ¾ø´Â ¼Ò½º.
private static void test3(){
List<String> list = new ArrayList<String>();
list.add("aaaaaa");
}
}
8.13 Creating Custom Annotation Types #
³ª¸¸ÀÇ annotationÀ» Á¤ÀÇÇÒ ¼ö Àִµ¥ Ű¿öµå´Â @interfaceÀÌ °¢ methodÁ¤Àǰ¡ member¶ó°í º¸¸é µÈ´Ù. °£´ÜÇÑ ¿¹¸¦ º¸¸é ´ÙÀ½°ú °°´Ù.
package com.jeid.tiger;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target( { ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String columnName();
String methodName() default "";
}
//»ç¿ëÇÏ´Â ÂÊ..
public class AnnotationTester {
@MyAnnotation(columnName = "test", methodName = "setTest")
private String test;
@MyAnnotation(columnName = "grpid")
public String grpid;
....
}
//À§ÀÇ test ¸â¹öÀÇ °æ¿ì ´ÙÀ½°ú °°ÀÌ Á¢±Ù °¡´ÉÇÏ´Ù.
Field testField = cls.getDeclaredField("test");
if (testField.isAnnotationPresent(MyAnnotation.class)) {
Annotatioin anno = testField.getAnnotation(MyAnnotation.class);
System.out.println(anno.columnName() + ", method = " + anno.methodName());
}
9.1 for/in ÀÇ ÀÚÁÖ »ç¿ëµÇ´Â ÇüÅ #
for/inÀº ¹«¾ùº¸´Ù ´Ù¾çÇÑ À¯ÇüÀÇ ¿¹Á¦¸¦ º¸´Â°ÍÀÌ Á¦ÀÏ ºü¸¦°ÍÀÌ´Ù. Çüź° »ç¿ë ¿¹Á¦¸¦ »ìÆìº¸¸é ´ÙÀ½°ú °°´Ù.
//1. °¡Àå ´Ü¼øÇÑ ÇüÅÂÀÎ ¹è¿(array)
String[] strs = { "aaa", "bbb", "ccc" };
for (String str : strs) {
System.out.println(str);
}
//2. List by using Iterator
List<Number> lstNum = new LinkedList<Number>();
lstNum.add(1);
lstNum.add(1.2);
for (Iterator<Number> iter = lstNum.iterator(); iter.hasNext();) {
Number num = iter.next();
System.out.println("num = " + num);
}
//3. List¸¦ ¹Ù·Î »ç¿ë
List<String> lst = new LinkedList<String>();
lst.add("aaaaa");
lst.add("bbbbb");
lst.add("ccccc");
lst.add("ddddd");
for (String str : lst) {
System.out.println("str = " + str);
}
// 4. List of List
List[] lists = { lst, lst };
for (List<String> l : lists) {
for (String str : l) {
System.out.println("str = " + str);
}
}
10.1 static member/method import #
Tiger¿¡¼´Â ´Ù¸¥ Ŭ·¡½ºÀÇ member¿Í method¸¦ import ÇÒ¼ö ÀÖ´Ù. ´Ü, static ÀÏ °æ¿ì¸¸ °¡´ÉÇÏ´Ù.
//¿¹¸¦ µé¾î System.out.println() À̶ó´Â °ÍÀ» »ç¿ëÇϱâ À§Çؼ´Â ´ÙÀ½ÀÇ import ¹®ÀÌ ÇÊ¿äÇÏ´Ù.
import java.lang.System; //¹°·Ð java.lang À̱⿡ import ¹®ÀÌ ÇÊ¿ä¾øÁö¸¸ ¿¹¸¦ µéÀÚ¸é ±×·¸´Ù´Â °ÍÀÌ´Ù.&^^
//Ç㳪, Tiger¿¡¼´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ¼ö ÀÖ´Ù.
import static java.lang.System.out;
...
out.println(...);
// method¸¦ import ÇÑ´Ù¸é..
import static java.lang.System.out.println;
...
println(...);