.
.
Core Java
Technologies Technical Tips
.
 
2004³â 12¿ù 28ÀÏ  


Core Java Technologies Tech Tips¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù. Java 2 Platform, Standard Edition (J2SE)¿¡ ±â¹ÝÇÑ core Java technologies ¿Í APIsÀÇ »ç¿ë¿¡ °üÇÑ ÃֽŠÁ¤º¸¸¦ ¾ò¾î °¡½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ ±Û¿¡¼­´Â Java 2 Platform Standard Edition Development Kit 5.0(JDK 5.0)À» »ç¿ëÇÕ´Ï´Ù.
Download JDK 5.0

À̹ø È£¿¡¼­´Â,

-JAVA.UTIL.SCANNER·Î ÅØ½ºÆ® ½ºÄµÇϱâ
-°øº¯ ¸®ÅÏ Å¸ÀÔ(Covariant Return Type)

À» ´Ù·ç°Ô µË´Ï´Ù.

ÀúÀÚ Daniel H. Steinberg

.

JAVA.UTIL.SCANNER·Î ÅØ½ºÆ® ½ºÄµÇϱâ

J2SE 5.0¿¡´Â ÀÏ»óÀû ŽºÅ©¸¦ Á» ´õ ½±°Ô ±¸ÇöÇÒ ¼ö ÀÖµµ·Ï Çϴ Ŭ·¡½º¿Í ¸Þ¼ÒµåµéÀÌ Ãß°¡µÇ¾ú´Ù. À̹ø ÆÁ¿¡¼­´Â »õ·Î Ãß°¡µÈ java.util.ScannerŬ·¡½º¸¦ ÀÌ¿ëÇÔÀ¸·Î½á ÀÏ¹Ý Ç¥Çö¹®À» »ç¿ëÇÏ´Â ½ºÆ®¸µ°ú ÇÁ¸®¹ÌƼºê ŸÀÔÀ» ÀÐ°í ÆÄ½Ì(parsing)ÇÏ´Â °ÍÀÌ ¾î¶»°Ô Á» ´õ ½¬¿öÁ³´ÂÁö ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

J2SE 5.0ÀÇ Ãâ½Ã ÀÌÀü¿¡´Â ÆÄÀÏ¿¡¼­ ÅØ½ºÆ®¸¦ ÀÐÀ¸·Á¸é ´ÙÀ½ÀÇ TextReader Ŭ·¡½º °°Àº Äڵ带 ÀÛ¼ºÇؾßÇß´Ù.

   import java.io.BufferedReader;
   import java.io.FileReader;
   import java.io.IOException;
   import java.io.File;

   public class TextReader {
     private static void readFile(String fileName) {
       try {
         File file = new File(fileName);
         FileReader reader = new FileReader(file);
         BufferedReader in = new BufferedReader(reader);
         String string;
         while ((string = in.readLine()) != null) {
           System.out.println(string);
         }
         in.close();
       } catch (IOException e) {
         e.printStackTrace();
       }
     }

     public static void main(String[] args) {
       if (args.length != 1) {
         System.err.println("usage: java TextReader "
           + "file location");
         System.exit(0);
       }
       readFile(args[0]);
     }
   }

ÀÌ¿Í °°Àº Ŭ·¡½º¿¡¼­ÀÇ ±âº»ÀûÀÎ Á¢±Ù¹ýÀº ÇÏµå µå¶óÀ̺êÀÇ ½ÇÁ¦ ÆÄÀϰú ÀÏÄ¡ÇÏ´Â File ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÏ´Â °ÍÀÌ´Ù. ±×¸®°í ³ª¼­ ±× ÆÄÀϰú °ü·ÃµÈ FileReader¿Í ±× FileReaderÀÇ BufferedReader¸¦ »ý¼ºÇϰí, ±× ÈÄ BufferedFile ¸®´õ¸¦ »ç¿ëÇÏ¿© Çѹø¿¡ ÇÑ ÁÙ¾¿ Àд´Ù.

½ÇÇàµÇ´Â TextReaderŬ·¡½º¸¦ º¸±âÀ§Çؼ­´Â Ŭ·¡½º¿¡ ´ëÇÑ ¹®¼­¸¦ »ý¼ºÇÏ¿© ÀÐ°í ÆÄ½ÌÇØ¾ßÇÑ´Ù. ¹®¼­¸¦ »ý¼ºÇϱâ À§Çؼ­´Â TextReader¿Í °°Àº µð·ºÅ丮 ¾È¿¡ ÀÖ´Â TextSample.txt¶ó´Â ÆÄÀÏ¿¡ ´ÙÀ½°ú °°Àº µÎ ÁÙÀÇ ÅØ½ºÆ®¸¦ ÀúÀåÇØ¾ß ÇÑ´Ù.

   Here is a small text file that you will
   use to test java.util.scanner.

TextReader¸¦ ÄÄÆÄÀÏÇÏ°í ´ÙÀ½À» ÀÔ·ÂÇÏ¿© ±¸µ¿½ÃÄѺ¸ÀÚ.

   java TextReader TextSample.txt

Ç¥ÁØ Ãâ·ÂÀ¸·Î µÇµ¹¾Æ¿Â ¿øº» ÆÄÀÏÀ» º¸°Ô µÉ °ÍÀÌ´Ù.

ÇÁ¸®¹ÌƼºê ŸÀÔ°ú ½ºÆ®¸µÀ» ÆÄ½ÌÇϴ Ŭ·¡½ºÀÎ java.util.Scanner¸¦ ÀÌ¿ëÇÏ¿© TextReaderÀÇ Äڵ带 °£´ÜÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù.

   import java.io.File;
   import java.io.FileNotFoundException;
   import java.util.Scanner;

   public class TextScanner {

     private static void readFile(String fileName) {
       try {
         File file = new File(fileName);
         Scanner scanner = new Scanner(file);
         while (scanner.hasNext()) {
           System.out.println(scanner.next());
         }
         scanner.close();
       } catch (FileNotFoundException e) {
         e.printStackTrace();
       }
     }

     public static void main(String[] args) {
       if (args.length != 1) {
         System.err.println("usage: java TextScanner1"
           + "file location");
         System.exit(0);
       }
       readFile(args[0]);
     }
   }

TextScanner¸¦ ÄÄÆÄÀÏÇÏ°í ´ÙÀ½°ú °°ÀÌ ±¸µ¿ÇÏÀÚ.

   java TextScanner TextSample.txt

´ÙÀ½°ú °°Àº °á°ú°¡ ³ªÅ¸³­´Ù.

   Here
   is
   a
   small
   text
   file
   that
   you
   will
   use
   to
   test
   java.util.scanner.

TextScanner ´Â ÆÄÀϷκÎÅÍ Scanner ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÑ´Ù. Scanner´Â ÆÄÀÏÀÇ ÄÁÅÙÃ÷¸¦ ±¸È¹ÀÚ ÆÐÅÏÀ» ÀÌ¿ëÇÏ¿© ºÐÇØÇÑ´Ù. ±¸È¹ÀÚ ÆÐÅÏÀÇ µðÆúÆ® °ªÀº Èò ¿©¹éÀÌ´Ù. ±× ÈÄ TextScanner´Â ScannerÀÇ hasNext() ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. ÀÌ ¸Þ¼Òµå´Â Scanner ÀԷ°ª¿¡ ÆÄÀÏÀÇ ¸¶Áö¸· ºÎºÐ¿¡ À̸¦ ¶§±îÁö ´Ù¸¥ tokenÀÌ ÀÖÀ¸¸é 'true'¸¦ ¸®ÅÏÇÑ´Ù. next() ¸Þ¼Òµå´Â ´ÙÀ½ tokenÀ» ³ªÅ¸³»´Â ½ºÆ®¸µÀ» ¸®ÅÏÇÑ´Ù. µû¶ó¼­ TextScanner´Â ÆÄÀÏÀÇ ¸¶Áö¸·ºÎºÐ¿¡ À̸¦ ¶§±îÁö °¢ ¶óÀο¡¼­ next()¿¡ ÀÇÇØ ¸®ÅϵǴ ½ºÆ®¸µÀ» ÇÁ¸°Æ®ÇÑ´Ù.

ScannerÀÇ useDelimiter ¸¦ ÀÌ¿ëÇØ ÀԷ¹°À» ÅäūȭÇÏ´Â µ¥ ÀÌ¿ëÇÏ´Â ±¸È¹ÀÚ¸¦ º¯°æ½Ãų ¼öµµ ÀÖ´Ù. ¸Þ¼Òµå¿¡ ½ºÆ®¸µ ¶Ç´Â java.util.regex.Pattern¿¡ Àü´ÞÇØÁÖ¸é µÈ´Ù. ¾î¶² ÆÐÅϵéÀÌ ÀûÀýÇÑ Áö¿¡ ´ëÇØ¼­´Â JavaDocs page for Pattern¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù. ¿¹¸¦ µé¾î newline(\n)À» ±¸È¹ÀÚ·Î ÀÌ¿ëÇÏ¿© Çѹø¿¡ ÇÑ ÁÙÀÇ ÀԷ¹°À» ÀÐÀ» ¼ö ÀÖ´Ù. ´ÙÀ½Àº »õÁÙ ¹®ÀÚ¸¦ ±¸È¹ÀÚ·Î ÀÌ¿ëÇÏ´Â ¼öÁ¤µÈ readFile() ¸Þ¼ÒµåÀÌ´Ù.

   private static void readFile(String fileName) {
     try {
       Scanner scanner = new Scanner(new File(fileName));
       scanner.useDelimiter
         (System.getProperty("line.separator")); 
       while (scanner.hasNext()) {
         System.out.println(scanner.next());
       scanner.close();
     } catch (FileNotFoundException e) {
       e.printStackTrace();
     }
   } 

¸¶Áö¸· ÁÙÀ» ã´Â ´Ù¸¥ ¿É¼Çµéµµ ÀÖ´Ù. ¿¹¸¦ µé¾î »õÁÙ ¹®ÀÚ·Î ³¡³ª´Â ¶óÀÎÀ̳ª ij¸®Áö ¸®ÅÏ(enterŰ)°ú newlineÀ¸·Î ³¡³ª´Â ¶óÀεéÀ» Á¶»çÇÒ ¼ö ÀÖ´Ù. "\r\n|\n" ÀÏ¹Ý Ç¥Çö¹®À» ÀÌ¿ëÇÏ¿© À̸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. java.util.regex.PatternÀÇ JavaDocs´Â ¶Ç´Ù¸¥ ¶óÀÎ Á¾°á±âµéÀ» º¸¿©ÁֹǷΠÁ» ´õ º¹ÀâÇÑ ºÐ¼®Àº "\r\n|[\r\n\u2028\u2029\u0085]"Ç¥Çö¹®À» ÀÌ¿ëÇÑ´Ù. ¶ÇÇÑ Scanner Ŭ·¡½ºÀÇ hasNextLine()°ú nextLine() ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. ¾î´À °æ¿ìÀÌ´ø ¼öÁ¤µÈ TextScanner¸¦ »ç¿ëÇÏ¸é °á°ú¹°Àº TextSample.txtÀÇ ÄÁÅÙÃ÷¿Í ·¹À̾ƿô¿¡ ºÎÇÕµÉ °ÍÀÌ´Ù. ´ÙÀ½À» Âü°íÇϱ⠹ٶõ´Ù.

   Here is a small text file that you will
   use to test java.util.scanner.

Scanner¿¡ ÀÇÇØ »ç¿ëµÈ ±¸È¹ÀÚÀÇ ÆÐÅÏÀ» °£´ÜÇÏ°Ô º¯°æÇÏ¿© Å« È¿°ú¿Í À¯¿¬¼ºÀ» ¾òÀ» ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½ÀÇ ±¸È¹ÀÚ¸¦ ÁöÁ¤Çϸé,

   scanner.useDelimiter("\\z");

Çѹø¿¡ Àüü ÆÄÀÏÀ» Àд´Ù. ÀÌ´Â Pat Niemeyer°¡ java.net blog¿¡¼­ Á¦¾ÈÇϰí ÀÖ´Â ¿ä·É°úµµ ºñ½ÁÇÏ´Ù. ¸î °³ÀÇ Áß°£ ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÏÁö ¾Ê°íµµ À¥ÆäÀÌÁöÀÇ ¸ðµç ÄÁÅÙÃ÷¸¦ ÀÐÀ» ¼ö ÀÖ´Â °ÍÀÌ´Ù. ´ÙÀ½ WebPageScannerŬ·¡½ºÀÇ ÄÚµå´Â java.net homepageÀÇ ÇöÀç ÄÁÅÙÃ÷¸¦ Àаí ÀÖ´Ù.

   import java.net.URL;
   import java.net.URLConnection;
   import java.io.IOException;
   import java.util.Scanner;

   public class WebPageScanner {
     public static void main(String[] args) {
       try {
         URLConnection connection =
           new URL("http://java.net").openConnection();
         String text = new Scanner(
           connection.getInputStream()).
           useDelimiter("\\Z").next();
       } catch (IOException e) {
         e.printStackTrace();
       }
     }
   }

Scanner Ŭ·¡½º·Î ½ºÆ®¸µ ÀÌ¿ÜÀÇ °Íµéµµ ´Ù·ê ¼ö ÀÖ´Ù. ÇÁ¸®¹ÌƼºê ŸÀÔÀ¸·Î ÀÌ·ç¾îÁø µ¥ÀÌÅ͸¦ ÆÄ½ÌÇÏ´Â µ¥¿¡µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ¿¡ ´ëÇÑ ¿¹Á¦·Î, ´ÙÀ½ÀÇ ¼¼ ¶óÀÎÀ» Employee.data¶ó´Â À̸§ÀÇ ÆÄÀÏ(TextSample¿Í °°Àº µð·ºÅ丮 ¾È)¿¡ ÀúÀåÇÏÀÚ.

   Joe, 38, true
   Kay, 27, true
   Lou, 33, false

À̸¦ ÇϳªÀÇ Å« ½ºÆ®¸µÀ¸·Î Ãë±ÞÇÏ¿© ÀÌ ½ºÆ®¸µÀ» ÆÄ½ÌÇÑ ÈÄ¿¡ ´ëÈ­¹®À» ½ÇÇàÇÒ ¼öµµ ÀÖÁö¸¸, ´ë½Å¿¡ ÀÌ ÆÄÀÏÀ» µÎ°¡Áö ´Ü°è·Î ÆÄ½ÌÇØº¸ÀÚ. ÀÌ´Â ´ÙÀ½ÀÇ Å¬·¡½º DataScanner¿¡ ¼³¸íµÇ¾î ÀÖ´Ù.

   import java.util.Scanner;
   import java.io.File;
   import java.io.FileNotFoundException;

   public class DataScanner {

     private static void readFile(String fileName) {
       try {
         Scanner scanner =
           new Scanner(new File(fileName));
         scanner.useDelimiter
           (System.getProperty("line.separator")); 
         while (scanner.hasNext()) {
           parseLine(scanner.next());
         }
         scanner.close();
       } catch (FileNotFoundException e) {
         e.printStackTrace();
       }
     }

     private static void parseLine(String line) {
       Scanner lineScanner = new Scanner(line);
      lineScanner.useDelimiter("\\s*,\\s*");
       String name = lineScanner.next();
       int age = lineScanner.nextInt();
       boolean isCertified = lineScanner.nextBoolean();
       System.out.println("It is " + isCertified +
         " that " + name + ", age "
         + age + ", is certified.");
     }

     public static void main(String[] args) {
       if (args.length != 1) {
         System.err.println("usage: java TextScanner2"
           + "file location");
         System.exit(0);
       }
       readFile(args[0]);
     }
   }

DataScannerÀÇ ¹Ù±ùÂÊ Scanner ¿ÀºêÁ§Æ®´Â Çѹø¿¡ ÇÑ ¶óÀξ¿ ÆÄÀÏÀ» Àд´Ù. readFile() ¸Þ¼Òµå´Â °¢ ¶óÀÎÀ» µÎ¹øÂ° ½ºÄ³³Ê¿¡ Àü´ÞÇϰí, ÀÌ µÎ¹øÂ° ½ºÄ³³Ê´Â ÄÞ¸¶·Î ,±¸È¹µÈ µ¥ÀÌÅ͸¦ ÆÄ½ÌÇϰí ÄÞ¸¶ ¾çÂÊÀÇ Èò ¿©¹éÀ» »èÁ¦ÇÑ´Ù. ´ÙÀ½ tokenÀÌ Æ¯Á¤Å¸ÀÔÀÇ tokenÀÎÁö ¾Æ´ÑÁö ºÐ¼®ÇÏ¿© ´ÙÀ½ tokenÀ» ±× ŸÀÔÀÇ ÀνºÅϽº·Î Ãë±ÞÇϵµ·Ï ÇÏ´Â hasNext()³ª next()¸Þ¼Òµåµéµµ ÀÖ´Ù. ¿¹¸¦ µé¾î nextBoolean()Àº ´ÙÀ½ tokenÀ» booleanÀ¸·Î Ãë±ÞÇÏ¿© "true" ¶Ç´Â "false" ½ºÆ®¸µ°ú ¸ÅÄ¡½ÃŲ´Ù. ¸ÅĪÀÌ ÀÌ·ïÁöÁö ¾ÊÀ¸¸é java.util.InputMismatchExceptionÀÌ ´øÁ®Áø´Ù. DataScannerÀÇ parseLine() ¸Þ¼Òµå´Â °¢ ¶óÀÎÀÌ ¾î¶»°Ô String, int, booleanÀ¸·Î ÆÄ½ÌµÇ´ÂÁö º¸¿©ÁØ´Ù.

Compile DataScanner. Then run it as follows:

DataScanner¸¦ ÄÄÆÄÀÏÇÏ°í ´ÙÀ½°ú °°ÀÌ ±¸µ¿½ÃŰÀÚ.

   java DataScanner Employee.data

´ÙÀ½°ú °°Àº °á°ú°¡ ³ªÅ¸³­´Ù.

   It is true that Joe, age 38, is certified.
   It is true that Kay, age 27, is certified.
   It is false that Lou, age 33, is certified.

ÄÞ¸¶¸¦ ±¸È¹¹®ÀÚ·Î »ç¿ëÇÏ°í ½ÍÀ» °ÍÀÌ´Ù. ´Ù½Ã ¸»ÇØ ´ÙÀ½°ú °°ÀÌ ½ÃµµÇغ¸·Á°í ÇÒ °ÍÀÌ´Ù.

   lineScanner.useDelimiter(",");

ÀÌ´Â °á±¹ InputMismatchException·Î ³¡³¯ °ÍÀÌ´Ù. ÀÌ´Â booleanÀ¸·Î º¯°æÇÏ·Á´Â token¿¡ ¿©ºÐÀÇ °ø°£ÀÌ Æ÷ÇԵǸç ÀÌ °ø°£Àº "true"³ª "false" ¿¡ ¸ÅÄ¡µÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÀϹÝÀûÀΠǥÇö¹®ÀÇ ¸ðµç ¾ÖÇø®ÄÉÀ̼ǿ¡ ÇØ´çµÇ´Â ÄÉÀ̽ºÀ̹ǷΠÆÐÅÏÀ» ±¸ÃàÇÏ´Â µ¥ À־ ƯÈ÷ ¼¼½ÉÇÑ ÁÖÀǰ¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù.

Scanner¿¡ ´ëÇÑ Á» ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â formal documentation¸¦ Âü°íÇϱ⠹ٶõ´Ù.

.
.

°øº¯ ¸®ÅÏ Å¸ÀÔ(Covariant Return Type)

ÇÑ Å¬·¡½º ¾È¿¡¼­ ¸®ÅÏ Å¸ÀÔ¸¸ ´Ù¸¥, ¼­¸íµÈ µÎ °³ÀÇ ¸Þ¼Òµå¸¦ °¡Áú ¼ö ¾ø´Ù. J2SE 5.0 Ãâ½Ã ÀÌÀü¿¡´Â ¶ÇÇÑ ¼öÆÛÇ÷¡½º¿¡¼­ »ó¼Ó ¹ÞÀº ¸Þ¼ÒµåÀÇ ¸®ÅÏ Å¸ÀÔÀ» Ŭ·¡½º°¡ ¿À¹ö¶óÀ̵ù ÇÏ´Â °Íµµ ºÒ°¡´ÉÇß´Ù. À̹ø ÆÁ¿¡¼­´Â °øº¯ ¸®ÅÏ Å¸ÀÔ(Covariant Return Type)À» Çã¿ëÇÏ´Â J2SE 5.0ÀÇ »õ·Î¿î ¼Ó¼º¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸±â·Î ÇÏÀÚ. À̰ÍÀº ¼­ºêŬ·¡½ºÀÇ ¸Þ¼Òµå°¡ ¼öÆÛŬ·¡½º¿¡ ÀÖ´Â °°Àº ¼­¸íÀÇ ¸Þ¼Òµå¿¡ ÀÇÇØ ¸®ÅÏµÈ ¼­ºêŬ·¡½º ŸÀÔÀÇ ¿ÀºêÁ§Æ®¸¦ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù´Â ÀǹÌÀÌ´Ù. ÀÌ ¼Ó¼º¿¡ ÀÇÇØ Áö³ªÄ£ ŸÀÔ È®Àΰú ij½ºÆÃÀÌ ÇÊ¿ä ¾ø¾îÁ³´Ù.

´ÙÀ½ÀÇ ConfusedClass·Î ½ÃÀÛÇØº¸ÀÚ. ÀÌ Å¬·¡½º´Â µ¿ÀÏÇÑ ¼­¸íÀ» °¡Áø µÎ°³ÀÇ ¸Þ¼Òµå¸¦ ¼±¾ðÇÏ·Á°í ÇÑ´Ù. ±× Áß Çϳª´Â JTextField¸¦ ¸®ÅÏÇÏ°í ´Ù¸¥ ¸Þ¼Òµå´Â JPasswordField¸¦ ¸®ÅÏÇÑ´Ù.

   import javax.swing.JTextField;
   import javax.swing.JPasswordField;

   public class ConfusedClass {

     public JTextField getTextField(){
       return new JTextField();
     }
  
     public JPasswordField getTextField(){
       return new JPasswordField();
     }
   }

ConfusedClass¸¦ ÄÄÆÄÀÏÇÏ·Á°í ½ÃµµÇÏ¸é ´ÙÀ½°ú °°Àº ÄÄÆÄÀÏ ¿¡·¯¸¦ ¾ò°Ô µÉ °ÍÀÌ´Ù.

   ConfusedClass.java:10: getTextField() is already defined in 
   ConfusedClass
     public JPasswordField getTextField(){
                                  ^
   1 error

getTextField()¸¦ È£ÃâÇϴ Ŭ·¡½ºÀÇ °üÁ¡¿¡¼­ ÀÌ »óȲÀ» µé¿©´Ùº¸¸é, ÄÄÆÄÀÏ Å¸ÀÓ ¿¡·¯¿¡ ´ëÇÑ ÀÌÀ¯¸¦ º¼ ¼ö ÀÖ´Ù. µÑ Áß Ç¥ÀûÀ¸·Î »ï´Â ¸Þ¼Òµå°¡ ¾î¶² °ÍÀÎÁö ¾î¶»°Ô ÁöÀûÇÒ °ÍÀΰ¡? ±× ¿¹·Î ´ÙÀ½À» »ý°¢Çغ¸ÀÚ.

   ConfusedClass cc = new ConfusedClass();
   JTextField field = cc.getTextField();

JPasswordField°¡ JTextField¸¦ È®ÀåÇϱ⠶§¹®¿¡ ¾î¶² ¸Þ¼ÒµåÀ̵çÁö Á¤È®È÷ È£ÃâµÉ ¼ö ÀÖ´Ù.

±× ´ÙÀ½À¸·Î ´Ù¸¥ ¹öÀüÀÇ getTextField() ¸Þ¼Òµå¸¦ °®´Â µÎ °³ÀÇ Å¬·¡½º¸¦ »ý¼ºÇÏÀÚ. ÀÌ µÎ ¸Þ¼Òµå´Â ±¸Çö°ú ¸®ÅÏ Å¸ÀÔÀÌ ¼­·Î ´Ù¸£´Ù. ´ÙÀ½°ú °°ÀÌ ±âÃʺÎÅÍ ½ÃÀÛÇÏÀÚ.

   import javax.swing.JTextField;

   public class ConfusedSuperClass {

     public JTextField getTextField(){
       System.out.println("Called in " + this.getClass());
       return new JTextField();
     }
  
   }

ConfusedSuperClass¸¦ ±¸µ¿ÇÏ¸é ¿¡·¯¾øÀÌ ÄÄÆÄÀϵǴ °ÍÀ» º¼ ¼ö ÀÖ´Ù. ÀÌÁ¦ ConfusedSuperClass¸¦ È®ÀåÇÏ´Â ÆÄ»ý Ŭ·¡½º¸¦ »ý¼ºÇÏÀÚ. ÀÌ ÆÄ»ý Ŭ·¡½º´Â ConfusedSuperClass Ŭ·¡½ºÀÇ getTextField() ¸Þ¼Òµå¿¡¼­ ¸®ÅÏµÈ JTextField´ë½Å JPasswordFieldÀÇ ÀνºÅϽº¸¦ ¸®ÅÏÇÏ·Á°í ÇÑ´Ù.
   import javax.swing.JPasswordField;

   public class ConfusedSubClass extends ConfusedSuperClass {

     public JPasswordField getTextField(){
       System.out.println("Called in " + this.getClass());
       return new JPasswordField();
     }
  
   }

J2SE 5.0 ÀÌÀüÀÇ JDK ¹öÀüÀ» ÀÌ¿ëÇϰí ÀÖ´Ù¸é ConfusedSubClass´Â ÄÄÆÄÀÏ µÇÁö ¾Ê°í ´ÙÀ½°ú °°Àº ¿¡·¯°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù.

   ConfusedSubClass.java:5: getTextField() in ConfusedSubClass 
   cannot override getTextField() in ConfusedSuperClass;
   attempting to use incompatible return type
   found   : javax.swing.JPasswordField
   required: javax.swing.JTextField
     public JPasswordField getTextField(){
                                  ^
   1 error

ÀÌ ¿¡·¯´Â ¸ð¼øµÈ ¸®ÅÏ Å¸ÀÔÀ» ÀÌ¿ëÇÏ·Á Çϱ⠶§¹®¿¡ ¹ß»ýÇÑ´Ù. »ç½Ç ¸®ÅϽÃŰ·Á´Â JPasswordFieldÀº JTextFieldÀÇ ¼­ºê ŸÀÔÀÌ´Ù. µ¿ÀÏÇÑ Äڵ尡 J2SE 5.0¿¡¼­´Â Á¦´ë·Î ÄÄÆÄÀϵȴÙ. J2Se 5.0¿¡¼­´Â ¸Þ¼ÒµåÀÇ ¸®ÅÏŸÀÔÀ» ¿À¸®Áö³¯ ŸÀÔÀÇ ¼­ºêŸÀÔ°ú ¿À¹ö¶óÀ̵ù ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ±× ¿¹·Î ConfusedSuperClassÀÇ getTextField() ¸Þ¼Òµå´Â JTextFieldŸÀÔÀÇ ÀνºÅϽº¸¦ ¸®ÅÏÇϸç, ConfusedSubClassÀÇ getTextField() ¸Þ¼Òµå´Â JPasswordField ŸÀÔÀÇ ÀνºÅϽº¸¦ ¸®ÅÏÇÑ´Ù.

´ÙÀ½ÀÇ NotConfusedClient Ŭ·¡½º·Î ÀÌ µÎ Ŭ·¡½ºµéÀ» ¿¬½ÀÇØº¼ ¼ö ÀÖ´Ù. NotConfusedClient Ŭ·¡½º´Â ConfusedSuperClass ŸÀÔ°ú ConfusedSubClass ŸÀÔÀÇ ÀνºÅϽº¸¦ »ý¼ºÇϰí, °¢ ÀνºÅϽº¿¡ getTextField()¸¦ È£Ãâ, ¸Þ¼Òµå¿¡¼­ ¸®ÅÏµÈ ¿ÀºêÁ§Æ®¿¡ ÀÏÄ¡Çϴ ŸÀÔÀ» º¸¿©ÁØ´Ù.

   import javax.swing.JTextField;

   public class NotConfusedClient {
     static JTextField jTextField;

     public static void main(String[] args) {
       System.out.println("===== Super Class =====");
       jTextField = new ConfusedSuperClass().getTextField();
       System.out.println("Got back an instance of "
         + jTextField.getClass());
       System.out.println("===== Sub Class =====");
       jTextField = new ConfusedSubClass().getTextField();
       System.out.println("Got back an instance of  "
         + jTextField.getClass());
     }
   }

NotConfusedClient¸¦ ÄÄÆÄÀÏÇÏ°í ±¸µ¿ÇÏÀÚ. ´ÙÀ½°ú °°Àº °á°ú°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù.

   ===== Super Class =====
   Called in class ConfusedSuperClass
   Got back an instance of class javax.swing.JTextField
   ===== Sub Class =====
   Called in class ConfusedSubClass
   Got back an instance of  class javax.swing.JPasswordField

½ÇÁ¦·Î getTextField()ÀÇ ¸®ÅÏ Å¸ÀÔÀ» ConfusedSubClassÀÇ JTextField·Î º¯°æÇÏ¸é °°Àº °á°ú¸¦ °®°Ô µÉ °ÍÀÌ´Ù. getTextField()¸¦ È£ÃâÇÏ¿© ¸®ÅÏµÈ ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÒ ¶§ À̵æÀÌ µÈ´Ù. J2SE 5.0 ÀÌÀü ¹öÀü¿¡¼­´Â ±âº» Ŭ·¡½º¿¡´Â ¾ø°í ÆÄ»ý Ŭ·¡½º¿¡¸¸ Á¸ÀçÇÏ´Â ¸Þ¼Òµå¸¦ »ç¿ëÇÏ·Á¸é ´Ù¿îij½ºÆ®¸¦ ÇØ¾ßÇÑ´Ù. ±×·¯³ª J2SE 5.0¿¡¼­ ConfusedSubClass´Â ¼öÆÛŬ·¡½º¿¡ Á¸ÀçÇÏ´Â ´ë½Å getTextField()·Î ÁöÁ¤µÈ ¿©·¯ ŸÀÔÀ¸·Î ÄÄÆÄÀϵȴÙ. ÀÌÁ¦ ¼­ºêŸÀÔ¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Â ¸Þ¼Òµå¸¦ È£ÃâÇϱâ À§ÇØ °øº¯ ¸®ÅÏ Å¸ÀÔÀ» »ç¿ëÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ù¹øÂ°·Î, ¼öÆÛŬ·¡½º¸¦ ´ÙÀ½°ú °°ÀÌ °íÃĺ¸ÀÚ.

   public class SuperClass {

     public SuperClass getAnObject(){
       return this;
     }

   }

ÀÏÄ¡ÇÏ´Â ¼­ºêŬ·¡½º¿¡ ÇÑÁ¤ ¸Þ¼Òµå¸¦ Ãß°¡Çϰí getAnObject() ¸Þ¼ÒµåÀÇ ¸®ÅÏ Å¸ÀÔÀ» º¯°æÇÏÀÚ.

   public class SubClass extends SuperClass {

     public SubClass getAnObject(){
       return this;
     }

     public void exclusiveMethod(){
       System.out.println("Exclusive in Subclass.");
     }
  
     public static void main(String[] args) {
         System.out.println("===== Call Exclusive method =====");
         new SubClass().getAnObject().exclusiveMethod();
     } 

   }

SuperClass¿Í SubClass¸¦ ÄÄÆÄÀÏÇϰí,SubClass¸¦ ±¸µ¿ÇÏÀÚ. ´ÙÀ½°ú °°Àº °á°ú°¡ ³ªÅ¸³­´Ù.

   ===== Call Exclusive method =====
   Exclusive in Subclass.

main() ¸Þ¼Òµå´Â ¼­ºêŬ·¡½ºÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÑ ÈÄ getAnObject()¸¦ È£ÃâÇÑ´Ù. ÀÌ´Â SubClassŸÀÔÀÇ ¸®ÅÏ ¿ÀºêÁ§Æ®¿¡ exclusiveMethod()¸¦ È£ÃâÇÏ¿© ½ÇÇàµÈ´Ù. getAnObject()ÀÇ ¸®ÅÏŸÀÔÀÌ SubClass.javaŬ·¡½ºÀÇ SuperClass¶ó¸é ±× ÄÚµå´Â ÄÄÆÄÀϵÇÁö ¾Ê´Â´Ù.

.
.
.

Reader Feedback

  ¸Å¿ì ÁÁ´Ù    ÁÁ´Ù    ±×Àú ±×·¸´Ù 

 

ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀÌ ±Ã±ÝÇϼ¼¿ä? Java Online SupportÀ» Âü°íÇϼ¼¿ä.

.
.

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SKDN@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦ Ŭ¸¯ÇØ ÁÖ¼¼¿ä.

Copyright 2003-2005 Sun Korea, Inc. All rights reserved.

Sun Microsystems, Inc.
.
.