|
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Çà Å×À̺íÀÌ ³ªÅ¸³´Ù.
ÇÑ ÁÙ °É·¯ À½¿µÀ» ³Ö´Â °ÍÀº ÀǿܷΠ¾î·ÆÁö ¾Ê´Ù. ÀÌ´Â 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À» ÄÄÆÄÀÏÇÏ°í ±¸µ¿ÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ È¦¼öÇà¿¡ À½¿µÀÌ »ý±â°Ô µÉ °ÍÀÌ´Ù.
ÀÌÁ¦ 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À» ÄÄÆÄÀÏÇÏ°í ±¸µ¿ÇÏÀÚ. Å×À̺íÀÌ ³ªÅ¸³´Ù(ÀÌÀüÀÇ ¿¹Á¦º¸´Ù´Â ³ªÅ¸³ª´Â µ¥ Á¶±Ý ´õ ¿À·¡ °É¸± °ÍÀÌ´Ù). ±× ÈÄ Ãâ·Â ´ÙÀ̾ó·Î±×°¡ ³ªÅ¸³´Ù.
ÇÁ¸°Å͸¦ ¼±ÅÃÇϰí 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}ÀÌ ÇöÀç ÆäÀÌÁöÀÇ ¼ýÀÚ Çü½ÄÀ¸·Î ¹Ù²ð °ÍÀÌ´Ù.
Á» ´õ °í³µµÀÇ Ãâ·Â¹°À» ¿øÇÑ´Ù¸é, 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¸¦ Âü°íÇϱ⠹ٶõ´Ù.
º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù.
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϰųª ¼ö½ÅÁÖ¼Ò¸¦ º¯°æÇÏ·Á¸é SKDN@Sun.comÀ¸·Î
¹®ÀÇ Áֽñ⠹ٶø´Ï´Ù.
SKDN(Sun Korea
Developers Network)¿¡¼ J2EE/J2SE Å×Å©ÆÁ µî ´Ù¾çÇÑ ¾ÆÆ¼Å¬µéÀ»
Âü°íÇϼ¼¿ä.
Copyright 2003-2005 Sun Korea, Inc. All rights reserved.
|