|
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¶ó¸é ±× ÄÚµå´Â ÄÄÆÄÀϵÇÁö ¾Ê´Â´Ù.
º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SKDN@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦
Ŭ¸¯ÇØ ÁÖ¼¼¿ä.
Copyright 2003-2005 Sun Korea, Inc. All rights reserved.
|