.
.
Core Java
Technologies Technical Tips
.
 
2005³â 4¿ù 26ÀÏ  


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

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

-JTABLE Ãâ·ÂÇϱâ
-STRINGTOKENIZER¿¡¼­ SCANNER±îÁö

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

ÀúÀÚ Daniel H. Steinberg

.

JTABLE Ãâ·ÂÇϱâ

J2SE 5.0ÀÌÀü¿¡´Â °£´ÜÇÑ JTableÀ» Ãâ·ÂÇÏ´Â °Íµµ ¾î·Á¿î ÀÏÀ̾ú´Ù. J2SE 5.0¿¡´Â API¿¡ print() ¸Þ¼Òµå°¡ Ãß°¡µÇ¾î Å×À̺í Ãâ·Â, °á°ú¹°¿¡ ¸Ó¸®±Û/¹Ù´Ú±Û »ðÀÔ, Ãâ·Â ÆäÀÌÁö¿¡ Å×À̺íÅ©±â ¸ÂÃ߱⠵îÀÇ ¼³Á¤ÀÌ °¡´ÉÇØÁ³´Ù. À̹ø Å×Å©ÆÁ¿¡¼­´Â ÀÌ·± »õ·Î¿î ±â´ÉµéÀ» »ç¿ëÇÏ¿© °£´ÜÇÑ JTableÀ» Ãâ·ÂÇÏ´Â ¹ý¿¡ ´ëÇØ ¾Ë¾Æº»´Ù. ¶ÇÇÑ ÇÑ ÁÙ °É·¯ À½¿µ ³Ö±â, ±×¸²ÀÚ À¯¹«¿¡ µû¶ó Å×À̺í Ãâ·ÂÇϱ⠵îÀÇ »ç¿ëÀÚ Á¤ÀÇ¿¡ ´ëÇØ¼­µµ ¼³¸íÇÑ´Ù.

Swing Æ©Å丮¾ó¿¡ ³ª¿ÍÀÖ´Â SimpleTableDemo programÀ» ¸®ÆÑÅ丵ÇÏ´Â °ÍºÎÅÍ ½ÃÀÛÇÏÀÚ. ¸®ÆÑÅ丵Àº À̹ø Å×Å©ÆÁ ³» ¸ðµç ¿¹Á¦ÀÇ °øÅë Äڵ带 ÃëÇÕÇϰí ÀÖ´Ù. Å×ÀÌºí¿¡ ´ëÇÑ µ¥ÀÌÅÍ´Â private static final variablesÇüÀÇ columnNames¿Í code>data(°¢ ÄÚµå ¸®½ºÆÃÀÇ ¸¶Áö¸· ºÎºÐ¿¡ ³ªÅ¸³²)¿¡ Æ÷ÇԵǾî ÀÖ´Ù. ´Ù¸¥ °øÅë ÄÚµå´Â setUpJFrame()°ú getTablePanel()¿¡ Æ÷ÇԵǾî ÀÖ´Ù. ÀÌ ¸Þ¼ÒµåµéÀº JTableÀ» º¸¿©ÁÖ´Â µ¥ »ç¿ëÇÏ´Â JFrame°ú JPanelÀ» ¼³Á¤ÇÏ´Â µ¥ »ç¿ëµÈ´Ù.(°øÅë ÄÚµå´Â ´ÙÀ½ÀÇ ¿¹Á¦¿¡ ³ªÅ¸³ªÁö¸¸, ±× ÈÄÀÇ ¿¹Á¦¿¡´Â Æ÷ÇÔµÇÁö ¾Ê´Â´Ù.)

´ÙÀ½Àº BaseTable Ŭ·¡½ºÀÌ´Ù.

   import javax.swing.JTable;
   import javax.swing.SwingUtilities;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import javax.swing.JScrollPane;
   import java.awt.Dimension;
   import java.awt.GridLayout;
   
   public class BaseTable extends JTable {
   
         public BaseTable() {
           super(data, columnNames);
           setUpJFrame();
         }
   
         public static void main(String[] args) {
           SwingUtilities.invokeLater(new Runnable() {
             public void run() {
               new BaseTable();
             }
           });
         }
   
         // Table Frame common to all examples in this tip
   
          private void setUpJFrame() {
          JFrame frame = new JFrame();
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           frame.add( getTablePanel());
           frame.pack();
           frame.setVisible(true);
         }
   
        private JPanel getTablePanel(){
           JPanel jPanel = new JPanel(new GridLayout(1,0));
           jPanel.setOpaque(true);
          setPreferredScrollableViewportSize(
                                 new Dimension(500, 70));
           jPanel.add(new JScrollPane(this));
           return jPanel;
         }
   
         // Table Data common to all examples in this tip
   
         private static final String[] columnNames =
           {"First Name", "Last Name", "Sport",
            "# of Years", "Vegetarian"};
   
         private static final Object[][] data = {
           {"Mary", "Campione", "Snowboarding",
            new Integer(5), new Boolean(false)},
           {"Alison", "Huml", "Rowing",
            new Integer(3), new Boolean(true)},
           {"Kathy", "Walrath", "Knitting",
            new Integer(2), new Boolean(false)},
           {"Sharon", "Zakhour", "Speed reading",
            new Integer(20), new Boolean(true)},
           {"Philip", "Milne", "Pool",
            new Integer(10), new Boolean(false)}
         };
       }

BaseTableÀº invokeLater()¸¦ ÅëÇØ À̺¥Æ® µð½ºÆÐÄ¡ ¾²·¹µå(event dispatch thread)¿¡ GUI¸¦ »ý¼ºÇÏ°í º¸¿©ÁÖ´Â ¹æ¹ýÀ» ±ÇÀåÇÑ´Ù. BaseTableÀ» ÄÄÆÄÀÏÇÏ°í ±¸µ¿ÇÏÀÚ. data¿¡¼­ °ø±ÞÇÑ µ¥ÀÌÅ͵éÀÌ ³ªÅ¸³ª´Â 5Çà Å×À̺íÀÌ ³ªÅ¸³­´Ù.

BaseTable

ÇÑ ÁÙ °É·¯ À½¿µÀ» ³Ö´Â °ÍÀº ÀǿܷΠ¾î·ÆÁö ¾Ê´Ù. ÀÌ´Â javax.swing.JTable prepareRenderer() ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵ùÇÏ¿© ¸¸µé ¼ö ÀÖ´Ù. ¸ÕÀú, »ç¿ëÀÚ°¡ ¿À¹ö¶óÀ̵ùÇÏ´Â prepareRenderer() ¸Þ¼Òµå·ÎºÎÅÍ ÇöÀç ¼¿ÀÌ ·»´õ¸µµÇµµ·Ï ÇÑ´Ù. ´ÙÀ½À¸·Î, rowIndex°¡ ¦¼öÀÎÁö Ȧ¼öÀÎÁö °áÁ¤ÇÑ´Ù. Ȧ¼öÇàÀº ¹è°æ»öÀ» º¯°æÇϰí ¦¼öÇàÀº ÇöÀç»öÀÌ ¹è°æ»öÀÌ µÇµµ·Ï ÇÑ´Ù. ÀÌ´Â ´ÙÀ½ ColorTable Ŭ·¡½º¿¡ ³ª¿ÍÀÖ´Ù.

   import javax.swing.JTable;
   import javax.swing.SwingUtilities;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import javax.swing.JScrollPane;
   import javax.swing.table.TableCellRenderer;
   import java.awt.Dimension;
   import java.awt.GridLayout;
   import java.awt.Component;
   import java.awt.Color;
   
   public class ColorTable extends JTable {
   
         public ColorTable() {
           super(data, columnNames);
           setUpJFrame();
         }
   
      public Component prepareRenderer(
                                TableCellRenderer renderer,
                                int row, int col) {
           Component c = super.prepareRenderer(renderer,
                                      row, col);
           if (row % 2 == 0 && !isCellSelected(row,col)) {
             c.setBackground(Color.LIGHT_GRAY);
           } else {
             c.setBackground(getBackground());
           }
           return c;
         }
   
         public static void main(String[] args) {
           SwingUtilities.invokeLater(new Runnable() {
             public void run() {
               new ColorTable();
             }
           });
         }
         // put common code here . . .
     }

ColorTableÀ» ÄÄÆÄÀÏÇÏ°í ±¸µ¿ÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ È¦¼öÇà¿¡ À½¿µÀÌ »ý±â°Ô µÉ °ÍÀÌ´Ù.

ColorTable

ÀÌÁ¦ BaseTable¿¡ ÀÇÇØ º¸¿©Áö´Â ²Ù¸çÁöÁö ¾ÊÀº Å×À̺íÀ» Ãâ·ÂÇÏÀÚ. À̸¦ À§Çؼ­´Â JTable¿¡ Ãß°¡µÈ Ãâ·Â ¸Þ¼Òµå¸¦ È£ÃâÇØ¾ßÇÑ´Ù. À̹ø ¿¹Á¦¿¡¼­´Â print()°¡ ÄÁ½ºÆ®·°ÅͷκÎÅÍ È£ÃâµÈ´Ù. µ¶¸³º¯¼ö°¡ ¾ø´Â print() ¸Þ¼Òµå´Â JTableÀ» ¸Ó¸®±ÛÀ̳ª ¹Ù´Ú±Û ¾øÀÌ Ãâ·ÂÇϰí, FIT_WIDTH Ãâ·Â ¸ðµå(NORMALÀÇ ¹Ý´ë)¸¦ ¼±ÅÃÇÑ´Ù. ³ªÅ¸³¯ ¼ö ÀÖ´Â PrinterExceptionÀ» ÇÚµé¸µÇØ¾ßÇϴµ¥, »ùÇÿ¡¼­´Â ½ºÅà Ʈ·¡À̽º(stack trace)¸¦ ÀÌ¿ëÇÏ¿© ³ªÅ¸³¯ ¼ö ÀÖ´Â ¿¹¿Ü»óȲÀ» Çڵ鸵ÇÑ´Ù.

   import javax.swing.JTable;
   import javax.swing.SwingUtilities;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import javax.swing.JScrollPane;
   import java.awt.Dimension;
   import java.awt.GridLayout;
   import java.awt.print.PrinterException;
   
   public class BasePrintableTable extends JTable {
   
         public BasePrintableTable() {
           super(data, columnNames);
           setUpJFrame();
           try {
             print();
           } catch (PrinterException e) {
             e.printStackTrace();
           }
         }
   
         public static void main(String[] args) {
           SwingUtilities.invokeLater(new Runnable() {
             public void run() {
               new BasePrintableTable();
             }
           });
         }
         // put common code here . . .
  } 

BasePrintableTableÀ» ÄÄÆÄÀÏÇÏ°í ±¸µ¿ÇÏÀÚ. Å×À̺íÀÌ ³ªÅ¸³­´Ù(ÀÌÀüÀÇ ¿¹Á¦º¸´Ù´Â ³ªÅ¸³ª´Â µ¥ Á¶±Ý ´õ ¿À·¡ °É¸± °ÍÀÌ´Ù). ±× ÈÄ Ãâ·Â ´ÙÀ̾ó·Î±×°¡ ³ªÅ¸³­´Ù.

printing

ÇÁ¸°Å͸¦ ¼±ÅÃÇϰí Print ¹öưÀ» ´©¸¥´Ù. »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ ÇÁ¸°ÅÍ¿¡ Å×À̺íÀÌ º¸³»Áú °ÍÀÌ´Ù.

Å×À̺íÀÇ ÁúÀ» ³ôÀÌ´Â ¹æ¹ý Áß Çϳª´Â Ãâ·Â¹°¿¡ ¸Ó¸®±Û°ú ¹Ù´Ú±ÛÀ» Ãß°¡ÇÏ´Â °ÍÀÌ´Ù. À̸¦ À§Çؼ­´Â MessageFormat¿ÀºêÁ§Æ® °°ÀÌ ¸Ó¸´±Û°ú ¹Ù´Ú±ÛÀ» ÀÔ·ÂÇÏ´Â ¸Å°³º¯¼ö¸¦ ¹Þ´Â print() ¹öÀüÀÇ »ç¿ëÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ ¿ÀºêÁ§Æ®µéÀº ÆäÀÌÁöÀÇ À­ºÎºÐ°ú ¾Æ·§ ºÎºÐ¿¡ °¡¿îµ¥ Á¤·Ä ÅØ½ºÆ®µéÀ» »ý¼ºÇϵµ·Ï ¸¸µé¾îÁ³À¸¸ç, ù¹øÂ° Æ÷Áö¼Ç¿¡ Á¦°øµÈ µ¥ÀÌÅ͸¦ Âü°íÇÏ¿© ÆäÀÌÁö ¼ýÀÚ¸¦ »ðÀÔÇÒ ¼öµµ ÀÖ´Ù. ´ÙÀ½Àº JTableÀ» Ãâ·ÂÇϴµ¥ ¸Ó¸®±Û°ú ¹Ù´Ú±ÛÀ» Ãß°¡Çϱâ À§ÇØ ÇÊ¿äÇÑ ÄÁ½ºÆ®·°ÅÍÀÇ º¯°æ»çÇ×µéÀÌ´Ù.

   public BasePrintableTable() {
     super(data, columnNames);
     setUpJFrame();
     try {
           print(PrintMode.NORMAL, new MessageFormat(
             "Personal Info"),
           new MessageFormat("Page {0,number}"));
         } catch (PrinterException e) {
           e.printStackTrace();
         }
    } 

¸Ó¸®±ÛÀº ±½Àº ±ÛÀÚ·Î °¡¿îµ¥ Á¤·ÄµÇ¸ç, "Personal Info" ÅØ½ºÆ®·Î ±¸¼ºµÉ °ÍÀÌ´Ù. ¹Ù´Ú±ÛÀº °¡¿îµ¥ Á¤·ÄµÈ "Page 1" ÅØ½ºÆ®·Î µÇ¾îÀÖÀ¸¸ç, ¿©·¯ ÆäÀÌÁöÀÇ ¹®¼­¿¡¼­´Â {0, number}ÀÌ ÇöÀç ÆäÀÌÁöÀÇ ¼ýÀÚ Çü½ÄÀ¸·Î ¹Ù²ð °ÍÀÌ´Ù.

footer

Á» ´õ °í³­µµÀÇ Ãâ·Â¹°À» ¿øÇÑ´Ù¸é, print() ¼­¸íÀ» ÀÌ¿ëÇÏ¿© ÇÁ¸°Æ® ´ÙÀ̾ó·Î±×ÀÇ Ç¥½Ã À¯¹«, ÇÁ¸°Æ®°¡ µÇ´Â µ¿¾ÈÀÇ Çü½Ä ´ÙÀ̾ó·Î±× Ç¥½Ã À¯¹« µîÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÀÌ ¼­¸íÀ¸·Î PrintRequestAttributeSet¸¦ Àü´ÞÇÏ¿© ÇÁ¸°Æ®Çϴµ¥ »ç¿ëÇÏ´Â ¼Ó¼ºµéÀ» ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù.

ÇÁ¸°Æ® ±â´Éµé°ú JTable¿¡¼­ ÇÑ ÁÙ °É·¯ À½¿µÀÌ µé¾î°¡´Â ColorTable ¹öÀüÀ» ¾î¶»°Ô °áÇÕ½Ãų °ÍÀÎÁö °í·ÁÇØº¸ÀÚ. °£´ÜÇÑ ¹æ¹ýÀ¸·Î´Â ´ÙÀ½°ú °°ÀÌ BasePrintableTable°ú ColorTableÀ» PrintableColorTable·Î µ¿½Ã¿¡ Æ÷ÇÔ½ÃŰ´Â °ÍÀÌ´Ù.

   import javax.swing.JTable;
   import javax.swing.SwingUtilities;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import javax.swing.JScrollPane;
   import javax.swing.table.TableCellRenderer;
   import java.awt.Dimension;
   import java.awt.GridLayout;
   import java.awt.Component;
   import java.awt.Color;
   import java.awt.print.PrinterException;
   
   public class PrintableColorTable extends JTable {
   
         public PrintableColorTable() {
           super(data, columnNames);
           setUpJFrame();
           try {
             print();
           } catch (PrinterException e) {
             e.printStackTrace();
           }
         }
   
      public Component prepareRenderer(
                                TableCellRenderer renderer,
                                int row, int col) {
           Component c = super.prepareRenderer(renderer,
                                      row, col);
           if (row % 2 == 0 && !isCellSelected(row,col)) {
             c.setBackground(Color.LIGHT_GRAY);
           } else {
             c.setBackground(getBackground());
           }
           return c;
         }
   
         public static void main(String[] args) {
           SwingUtilities.invokeLater(new Runnable() {
             public void run() {
               new PrintableColorTable();
             }
           });
         }
         // common code here . . .
  } 

PrintableColorTableÀº Ȧ¼öÇàÀÇ ¹è°æ»öÀ» ¿¶Àº ȸ»öÀ¸·Î ¼³Á¤ÇÏ¿© JTableÀ» È­¸é¿¡ ³ªÅ¸³»°í Ãâ·ÂÇÑ´Ù. ±×·¯³ª Ãâ·Â Å×À̺íÀÇ Çü½ÄÀÌ Ç¥½ÃµÈ Å×À̺í°ú ´Ù¸£µµ·Ï Çϰí½Í´Ù¸é ´Ù¸¥ ¹æ¹ýÀÌ ÇÊ¿äÇÏ´Ù. ¿¹¸¦ µé¾î, Ç¥½ÃµÇ´Â Å×ÀÌºí¿¡¼­´Â ÁÙ¹«´Ì(ÇÑ ÁÙ °É·¯ À½¿µ)¸¦ À¯ÁöÇÏ°í ½ÍÁö¸¸, Ãâ·ÂµÇ´Â Å×ÀÌºí¿¡¼­´Â º¸ÀÌÁö ¾Êµµ·Ï Çϰí½Í´Ù°í °¡Á¤ÇÏÀÚ. Swing ¿£Áö´Ï¾îÀÎ Shannon Hickey´Â ´Ù¸¥ Çü½ÄÀ» »ç¿ëÇÏ¿© JTableÀ» È­¸é¿¡ ³ªÅ¸³»°í Ãâ·ÂÇÏ´Â µ¥ ´ÙÀ½ÀÇ ¹æ¹ýÀ» Á¦¾ÈÇÑ´Ù. JavaDesktop Æ÷·³ JTable.print() - different TableCellRendererÀ» Âü°íÇϱ⠹ٶõ´Ù.

ShannonÀÇ ¹æ¹ý¿¡¼­´Â ÇöÀç Ãâ·Â ÁßÀÎÁö Æ®·¡Å·ÇÏ´Â booleanÀ» µµÀÔÇÑ´Ù. ±× ÈÄ JTable.print(Graphics g) ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵ùÇÏ¿© booleanÀ» ¿òÁ÷ÀδÙ. ÀÌ´Â ´ÙÀ½°ú °°´Ù.

   public void print(Graphics g) {
     printing = true;
     try {
       super.print(g);
     }  finally {
       printing = false;
     }
   }

´ÙÀ½À¸·Î, ¼¿ÀÇ ¹è°æ»öÀ» ¼³Á¤ÇÒ ¶§ booleanÀ» Å×½ºÆ®ÇÑ´Ù.

   if (row % 2 == 0 && !isCellSelected(row,col)) {
       c.setBackground(Color.LIGHT_GRAY);
   // cell is selected, use the highlight color
   } else if (isCellSelected(row, col)) {
       c.setBackground(getSelectionBackground());
   } else {
       c.setBackground(getBackground());
   } 

´ÙÀ½ÀÇ FancyPrintableColor Ŭ·¡½º¿¡¼­´Â ÀÌ ´Ü°èµéÀ» ¸ðµÎ Æ÷ÇÔÇÑ´Ù. JTableÀÇ À½¿µ ¹öÀüÀ» È­¸é¿¡ ³ªÅ¸³»Áö¸¸, Ãâ·Â¹°¿¡´Â À½¿µÀÌ Æ÷ÇԵǾî ÀÖÁö ¾Ê´Ù.

   import javax.swing.JTable;
   import javax.swing.SwingUtilities;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import javax.swing.JScrollPane;
   import javax.swing.table.TableCellRenderer;
   import java.awt.Dimension;
   import java.awt.GridLayout;
   import java.awt.Component;
   import java.awt.Color;
   import java.awt.Graphics;
   import java.awt.print.PrinterException;
   
   public class FancyPrintableColorTable extends JTable {
       private boolean printing = false;
   
         public FancyPrintableColorTable() {
           super(data, columnNames);
           setUpJFrame();
           try {
             print();
           } catch (PrinterException e) {
             e.printStackTrace();
           }
         }
      public void print(Graphics g) {
         printing = true;
         try {
           super.print(g);
         }  finally {
           printing = false;
         }
       }
   
      public Component prepareRenderer(
                                TableCellRenderer renderer,
                                int row, int col) {
           Component c = super.prepareRenderer(renderer,
                                      row, col);
           // if printing, only use plain background
           if (printing) {
              c.setBackground(getBackground());
           } else {
               if (row % 2 == 0 && !isCellSelected(row,col)) {
                   c.setBackground(Color.LIGHT_GRAY);
           // cell is selected, use the highlight color
           } else if (isCellSelected(row, col)) {
               c.setBackground(getSelectionBackground());
           } else {
               c.setBackground(getBackground());
           }
         }    
           return c;
        }
   
         public static void main(String[] args) {
           SwingUtilities.invokeLater(new Runnable() {
             public void run() {
               new FancyPrintableColorTable();
             }
           });
         }
       // common code here . . .
   } 

Å×À̺íÀ» Ãâ·ÂÇÏ´Â »õ·Î¿î ±â´Éµé¿¡ ´ëÇØ Á» ´õ ¾Ë°í½Í´Ù¸é, Swing API changes in JDK 5.0ÀÇ JTable needs printing support¸¦ Âü°íÇϱ⠹ٶõ´Ù.

.
.

STRINGTOKENIZER¿¡¼­ SCANNER±îÁö

2004³âµµ 12¿ù 28ÀÏÀÚ Å×Å©ÆÁ JAVA.UTIL.SCANNER·Î ÅØ½ºÆ® ½ºÄµÇϱ⿡¼­´Â ÅØ½ºÆ® ±â¹Ý ÀÇ ÆÄÀÏÀ» ÀÐ°í ÆÄ½ÌÇϱâ À§ÇÑ »õ·Î¿î Scanner Ŭ·¡½º¿¡ ´ëÇØ ¼³¸íÇÏ¿´´Ù. Scanner Ŭ·¡½º°¡ java.util.StringTokenizer¿Í ´Ù¸¥Á¡ÀÌ ¹«¾ùÀΰ¡ ÇÏ´Â Áú¹®ÀÌ °è¼ÓµÇ¾î ¿Ô´Âµ¥, À̹ø Å×Å©ÆÁ¿¡¼­´Â ÀÌ¿¡ ´ëÇØ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. StringTokenizer¸¦ »ç¿ëÇÏ¿© Scanner Å×Å©ÆÁ¿¡¼­ ´Ù·ç¾ú´ø ¸î °¡Áö ÀÛ¾÷À» ½ÇÇàÇÏ´Â ¹ýÀ» ¼³¸íÇÑ´Ù. ¶ÇÇÑ StringTokenizerÀ» ÀÌ¿ëÇÏ´Â °Íº¸´Ù String Ŭ·¡½º¿¡ Æ÷ÇԵǾî ÀÖ´Â split() ±â´ÉÀ» ÀÌ¿ëÇϰųª Scanner¿Í °°Àº ´Ù¸¥ Á¤±Ô½Ä ±â¹Ý ¼Ö·ç¼ÇÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù´Â °Í¿¡ ´ëÇØ¼­µµ º¸¿©ÁØ´Ù.

ScannerÅ×Å©ÆÁÀÇ ¸¶Áö¸· ¿¹Á¦¿¡¼­´Â Scanner Ŭ·¡½º¸¦ ÀÌ¿ëÇÏ¿© °¢ ¶óÀο¡ °í¿ëÀÚ Á¤º¸¸¦ Æ÷ÇÔÇÏ´Â µ¥ÀÌÅÍ ÆÄÀÏÀ» ÆÄ½ÌÇÏ´Â ¹ý¿¡ ´ëÇØ ³ª¿ÍÀÖ¾ú´Ù. °¢ °í¿ëÀÚ Á¤º¸¿¡´Â °í¿ëÀÚÀÇ À̸§, ³ªÀÌ, °í¿ëÀÚÀÇ Áõ¸í ¿©ºÎ¸¦ °¡¸®Å°´Â booleanÀÌ Æ÷ÇԵǾî ÀÖÀ¸¸ç, °¢ °ªµéÀº ÄÞ¸¶·Î ºÐ¸®µÇ¾î ÀÖ´Ù. ÀϹÝÀûÀÎ ¶óÀÎÀº ´ÙÀ½°ú °°´Ù.

   Joe,38,true

ÀÌ ¶óÀÎÀ» ´ÙÀ½°ú °°Àº ÇÁ·Î±×·¥À¸·Î Scanner Ŭ·¡½º¸¦ ÀÌ¿ëÇÏ¿© ÆÄ½ÌÇÒ ¼ö ÀÖ´Ù.

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

   public class DataScanner {

     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();

       if (isCertified)
         System.out.println(name + " is certified.");
       if (age > 30)
         System.out.println(name + " is old enough.");
     }

     public static void main(String[] args) {
       if (args.length != 1) {
         System.err.println("usage: java DataScanner"
           + " \"Name,age,boolean\"");
         System.exit(0);
       }
       parseLine(args[0]);
     }
   }

DataScanner¸¦ ÄÄÆÄÀÏÇϰí, ´ÙÀ½°ú °°Àº ¸í·É¹®À¸·Î ±¸µ¿ÇÏÀÚ.

   java DataScanner "Joe,38,true"

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

   Joe is certified.
   Joe is old enough.

StringTokenizerÀ¸·Îµµ °°Àº ±â´ÉÀÌ ½ÇÇàµÉ ¼ö ÀÖ´Ù. À̸¦ À§Çؼ­´Â parseLineÀ» ","¿¡ ±â¹ÝÇÏ¿© tokenizeÇϰí nextToken()¸¦ È£ÃâÇÑ´Ù. ´ÙÀ½Àº ÀÌ¿Í °ü·ÃµÈ ÄÚµåÀÌ´Ù.

   import java.util.StringTokenizer;

   public class DataTokenizer {

     private static void parseLine(String line) {
       StringTokenizer tokenizer =
                          new StringTokenizer(line, ",");
       String name = tokenizer.nextToken();
       int age = Integer.parseInt(tokenizer.nextToken());
       boolean isCertified =
             Boolean.parseBoolean(tokenizer.nextToken());
             
       if (isCertified)
         System.out.println(name + " is certified.");
       if (age > 30)
         System.out.println(name + " is old enough.");
     }

     public static void main(String[] args) {
       if (args.length != 1) {
         System.err.println("usage: java DataTokenizer"
           + " \"Name,age,boolean\"");
         System.exit(0);
       }
       parseLine(args[0]);
     }
   }

DataTokenizer¸¦ ÀÌÀü ¿¹Á¦¿Í °°Àº µ¥ÀÌÅÍ¿¡ ±¸µ¿ÇÑ´Ù.

   java DataTokenizer "Joe,38,true"

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

   Joe is certified.
   Joe is old enough.

±×·¯³ª °¢ °ª »çÀÌ¿¡ °ø°£À» µÐ´Ù¸é tokenizer°¡ failµÉ °ÍÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ ±¸µ¿Çغ¸ÀÚ.

   java DataTokenizer "Joe, 38, true"

ÆÄ½Ì ¿¹¿Ü»óȲ¿¡ ´ëÇÑ ½ºÅà Ʈ·¡À̽º°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù.

ÄÞ¸¶·Î ºÐ¸®µÈ °ªµé(CSVs; comma-separated values) »çÀÌ¿¡´Â °ø°£ÀÌ ¾ø¾î¾ßÇÑ´Ù°í ÁÖÀåÇÒ ¼öµµ ÀÖ´Ù. ¸Â´Â ¸»ÀÌÁö¸¸ Ian DarwinÀÌ Java Cookbook¿¡¼­ ÁöÀûÇÏ¿´µíÀÌ, ÀÌ ¼³Á¤¿¡¼­ µû¿ÈÇ¥¸¦ º¸°ÔµÇ´Â °ÍÀº º¸±âµå¹® »óȲÀÌ ¾Æ´Ï´Ù. DarwinÀº Á¤±Ô½ÄÀÇ ÀÌÁ¡À» ¾òÁö ¾ÊÀ» ¶§ CSVµéÀ» ÆÄ½ÌÇÏ´Â µ¥ ÇÊ¿äÇÑ »ó´ç·®ÀÇ ÇÁ·Î±×·¡¹ÖÀ» ½Ã¿¬Çϱâ À§ÇØ Kernighan°ú Pike C++ ÇÁ·Î±×·¥ÀÇ Java ¹öÀüÀ» Á¦°øÇϰí ÀÖ´Ù.

½ÇÁ¦·Î, Á¤±Ô½Ä ±â´ÉÀº String Ŭ·¡½º¿¡ Ãß°¡µÇ¾î ¿Ô´Ù. J2SE 5.0 JavaDocs¿¡´Â ÀÌÁ¦ ´ÙÀ½°ú °°ÀÌ ¾ð±ÞÇÏ¿©, StringTokenizerÀÇ ÃßÈÄ ÀÌ¿ëÀ» ±ÇÀåÇÏÁö ¾Ê°í ÀÖ´Ù.

  StringTokenizer´Â »õ·Î¿î Äڵ忡¼­´Â »ç¿ëÀÌ ±ÇÀåµÇÁö ¾ÊÀ¸³ª 
  ȣȯ¼ºÀÇ ÀÌÀ¯·Î º¸À¯µÇ°í ÀÖ´Â »ó¼Ó Ŭ·¡½ºÀÔ´Ï´Ù. ÀÌ ±â´ÉÀ» »ç¿ëÇÏ·Á´Â »ç¿ëÀÚ´Â 
  StringÀÇ ºÐ¸® ¸Þ¼Òµå ¶Ç´Â java.util.regex ÆÐŰÁö ÀÌ¿ëÀ» ±ÇÀåÇÕ´Ï´Ù. 

StringÀÇ split()À» »ç¿ëÇϸé DataTokenizer ¿¹Á¦ÄÚµå´Â ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.

   public class DataSplitter {

     private static void parseLine(String line) {
       String[] token = line.split("\\s*,\\s*");
       String name = token[0];
       int age = Integer.parseInt(token[1]);
       boolean isCertified = Boolean.parseBoolean(token[2]);

       if (isCertified)
         System.out.println(name + " is certified.");
       if (age > 30)
         System.out.println(name + " is old enough.");
     }

     public static void main(String[] args) {
       if (args.length != 1) {
         System.err.println("usage: java DataSplitter"
           + " \"Name,age,boolean\"");
         System.exit(0);
       }
       parseLine(args[0]);
     }
   }

°£´ÜÇÑ Æ÷Æ®°¡ ´ÙÀ½ÀÇ ¶óÀÎÀ» ´ë½Å ÀÌ¿ëÇÒ °ÍÀÌ´Ù.

   String[] token = line.split(",");

ÀÌÁ¦ Á¤±Ô½ÄÀÇ ÀÌÁ¡À» ÀÌ¿ëÇÏ¿© ","ÀÇ ¾çÂÊ¿¡¼­ ¸ðµÎ ¿©¹éÀ» ¼ö¿ëÇÒ ¼ö ÀÖ´Ù. Á¤±Ô½ÄÀÇ "," Ç¥½Ã ÀÌÀü°ú ÀÌÈÄ¿¡ "\\s*"¸¦ »ðÀÔÇÔÀ¸·Î½á À̸¦ ½ÇÇàÇÑ´Ù. ¾î¶² °æ¿ì¿¡µµ "token"Àº ½ºÆ®¸µµéÀÇ ¹è¿­ÀÌ´Ù. DataSplitter¿¡ ³²¾ÆÀÖ´Â ÄÚµå´Â µÎ¹øÂ° StringÀ» int·Î º¯È¯ÇÏ°í ¼¼¹øÂ° StringÀ» booleanÀ¸·Î º¯È¯ÇÏ¿© °á°ú¸¦ Ãâ·ÂÇÑ´Ù.

´ÙÀ½Àº Scanner Å×Å©ÆÁ¿¡¼­ »ç¿ëµÈ Employee.dataÆÄÀÏ¿¡ ÀÖ´ø ¼¼ ¶óÀÎÀÌ´Ù.

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

Scanner Å×Å©ÆÁ¿¡¼­ÀÇ ÇÁ·Î±×·¥Àº Employee.data ÆÄÀÏ¿¡ µ¥ÀÌÅ͸¦ ÆÄ½ÌÇϴµ¥ nested scanners¸¦ ÀÌ¿ëÇß¾ú´Ù. ´ÙÀ½Àº split()ÀÇ »ç¿ëÀ» ÅëÇØ ÆÄ½ÌÇÒ ¹æ¹ýÀÌ´Ù.

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

   public class DataStringSplitter {
     private static String name;
     private static int age;
     private static boolean isCertified;

     private static String getFile(String fileName) {
       Scanner scanner = null;
       try {
         scanner = new Scanner(new File(fileName));
         scanner.useDelimiter("\\z");
         return scanner.next();

       } catch (FileNotFoundException e) {
         e.printStackTrace();
         return "";
       } finally {
         scanner.close();
       }
     }

     private static void readFile(String file) {
       String[] line =
         file.split(System.getProperty("line.separator"));
       for (String s : line) { parseLine(s); }
     }

     private static void parseLine(String line) {
       String[] data = line.split("\\s*,\\s*");
       name = data[0];
       age = Integer.parseInt(data[1]);
       isCertified = Boolean.parseBoolean(data[2]);
       if (isCertified)
         System.out.println(name + " is certified.");
       if (age > 30)
         System.out.println(name + " is old enough.");
     }

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

DataStringSplitterÀÇ getFile() ¸Þ¼Òµå´Â Àüü ÆÄÀÏÀ» ´ÜÀÏ String À¸·Î ÀúÀåÇÏ´Â µ¥ Scanner Å×Å©ÆÁ¿¡¼­ ¼Ò°³µÈ Scanner ±â¼úÀ» »ç¿ëÇÑ´Ù. parseLine() ¸Þ¼Òµå´Â ÀÌÀü°ú °°°í, °¢ ¶óÀο¡¼­ readFile() ¸Þ¼Òµå¿¡ ÀÇÇØ È£ÃâµÈ´Ù.

   private static void readFile(String file) {
      String[] line =
        file.split(System.getProperty("line.separator"));
      for (String s : line) { parseLine(s); }
    }

ÆÄÀÏÀº »ç¿ëÀÚÀÇ Ç÷§Æû¿¡ ´ëÇÑ line separater stringÀ¸·Î Âɰ³ÁüÀ¸·Î½á StringsÀ¸·Î tokenizeµÈ´Ù. °¢ ¶óÀÎÀº °¢°¢ÀÇ StringÀ¸·Î "line"À̶ó´Â À̸§ÀÇ ¹è¿­¿¡ ÀúÀåµÈ´Ù. ±× ÈÄ °­È­µÈ ·çÇÁ¹®À» »ç¿ëÇÏ¿© ÇÁ·Î±×·¥Àº ½ºÆ®¸µÀ» ¹Ýº¹Çϰí À̸¦ parseLine()¸¦ »ç¿ëÇÏ¿© ÆÄ½ÌÇÑ´Ù.

DataStringSplitter¸¦ ÄÄÆÄÀÏÇÏ°í ´ÙÀ½ÀÇ ¸í·É¹®À¸·Î ±¸µ¿ÇÏÀÚ.

   java DataStringSplitter Employee.data

´ÙÀ½°ú °°Àº °á°ú°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù.

   Joe is certified.
   Joe is old enough.
   Kay is certified.
   Lou is old enough.

Scanner ¹æ¹ýÀº ¾à°£ ´Ù¸£´Ù. ÀÌ ¹æ¹ý¿¡¼­´Â readFile() ¸Þ¼Òµå°¡ Scanner Ŭ·¡½º¿¡¼­ÀÇ nextLine()°ú hasNextLine() »ç¿ë¿¡ ´ëÇÑ ÀÌÁ¡À» ¾òÀ» ¼ö ÀÖ´Ù.

    private static void readFile(String file) {
       Scanner scanner = new Scanner(file);
       while (scanner.hasNextLine()) {
         parseLine(scanner.nextLine());
       }
     }

parseLine¿¡¼­´Â ÀÌÀüÀÇ ¿¹Á¦¿¡¼­ split() ¸Þ¼Òµå¿Í ÇÔ²² »ç¿ëÇÑ °Í°ú µ¿ÀÏÇÑ Á¤±Ô¹®À» »ç¿ëÇÏ¿© StringÀ» tokenizeÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ tokenÀÌ String¿¡¼­ ±× ŸÀÔÀÇ °ªÀ¸·Î ÀüȯÀÌ °¡´ÉÇÑÁö ¹°¾îº¼ ¼ö ÀÖ´Ù´Â ÀÌÁ¡ÀÌ ÀÖ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½ tokenÀÌ hasNextInt()¸¦ »ç¿ëÇÏ´Â int·Î¼­ Ãë±ÞµÉ ¼ö ÀÖ´Â Áö ¹°¾îº¼ ¼ö ÀÖ´Ù. Yes¶ó´Â ´ë´äÀÌ ³ª¿À¸é, À̸¦ nextInt() ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ´Â int·Î ÀüȯÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½Àº Á» ´õ robustÇÑ DataString Scanner ¿¹Á¦ÀÌ´Ù.

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

   public class DataStringScanner {

     private static String name;
     private static int age;
     private static boolean isCertified;

     private static String getFile(String fileName) {
       Scanner scanner = null;
       try {
         scanner = new Scanner(new File(fileName));
         scanner.useDelimiter("\\z");
         return scanner.next();

       } catch (FileNotFoundException e) {
         e.printStackTrace();
         return "";
       } finally {
         scanner.close();
       }
     }

     private static void readFile(String file) {
       Scanner scanner = new Scanner(file);
       while (scanner.hasNextLine()) {
         parseLine(scanner.nextLine());
       }
     }

     private static void parseLine(String line) {
       Scanner lineScanner = new Scanner(line);
       lineScanner.useDelimiter("\\s*,\\s*");
       name = lineScanner.next();
       if (lineScanner.hasNextInt())
         age = lineScanner.nextInt();
       else
         lineScanner.next();
       if (lineScanner.hasNextBoolean())
         isCertified = lineScanner.nextBoolean();
       else
         lineScanner.next();
       if (isCertified)
         System.out.println(name + " is certified.");
       if (age > 30)
         System.out.println(name + " is old enough.");
     }

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

DataStringScanner¸¦ ÄÄÆÄÀÏÇÏ°í ´ÙÀ½ÀÇ ¸í·É¹®À¸·Î ±¸µ¿ÇÏÀÚ.

   java DataStringScanner Employee.data

´Ù½Ã ÇÑ ¹ø, ´ÙÀ½°ú °°Àº °á°ú°¡ ³ªÅ¸³¯ °ÍÀÌ´Ù.

   Joe is certified.
   Joe is old enough.
   Kay is certified.
   Lou is old enough.   

À̹ø ÆÁ¿¡¼­´Â StringTokenizer¸¦ ÀÌ¿ëÇÏ¿© ¸¹Àº ½ºÆ®¸µÀ» ÆÄ½ÌÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» º¸¿©ÁÖ¾ú´Ù. ±×·¯³ª ¶ÇÇÑ ÃßÈÄÀÇ °³¹ß¿¡¼­´Â Á¤±Ô¹® ±â¹Ý ¼Ö·ç¼ÇÀ» »ç ¿ëÇϱ⸦ ±ÇÀåÇϰí ÀÖ´Ù. ÀÌ´Â Scanner Ŭ·¡½º ¾ÈÀÇ ´Ù¾çÇÑ nextXXX(), hasNextXXX()Àº ¹°·ÐÀ̰í String Ŭ·¡½º ³»ÀÇ split() ¸Þ¼Òµåµµ Æ÷ÇÔÇϰí ÀÖ´Ù. Scanner Ŭ·¡½º´Â °³º°ÀûÀÎ tokenÀ¸·Î Ç¥ÇöµÇ´Â ŸÀÔÀ» °­È­ÇÏ´Â ±â´É µîÀÇ °­·ÂÇÔÀ» Á¦°øÇÑ´Ù.

Scanner¿¡ ´ëÇÑ Á» ´õ ¸¹Àº Á¤º¸´Â JAVA.UTIL.SCANNER·Î ÅØ½ºÆ® ½ºÄµÇϱ⳪ formal documentation for the Scanner class¸¦ Âü°íÇϱ⠹ٶõ´Ù.

.
.
.

Reader Feedback

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

 

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

.
.

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù.
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϰųª ¼ö½ÅÁÖ¼Ò¸¦ º¯°æÇÏ·Á¸é SKDN@Sun.comÀ¸·Î ¹®ÀÇ Áֽñ⠹ٶø´Ï´Ù.

SKDN(Sun Korea Developers Network)¿¡¼­ J2EE/J2SE Å×Å©ÆÁ µî ´Ù¾çÇÑ ¾ÆÆ¼Å¬µéÀ» Âü°íÇϼ¼¿ä.

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


Sun Microsystems, Inc.
.
.