|
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
À̹ø È£¿¡¼´Â,
Á¦³×¸¯(GENERIC)
JMX, JCONSOLE°ú »ç¿ë¹ý
¸¦ ´Ù·ç°Ô µË´Ï´Ù.
ÀúÀÚ John Zukowski
Á¦³×¸¯(GENERIC)
J2SE 5.0 ¹öÀüÀº Java Ç÷§Æû¿¡ ´ëÇØ Áß¿ä ¾ð¾î ¼öÁØÀÇ º¯°æÀ» ´Ù¼Ò Æ÷ÇÔÇϰí ÀÖ´Ù. ¶ÇÇÑ
J2SE 5.0Àº ·çÇÁ¿Í ¸Å°³º¯¼öÀÇ °È¿Í °°Àº »õ·Î¿î ÀÛ¾÷À» Ãß°¡ÇÏ¿© JSR-14:
Add Generic Types To The Java Programming Language¿Í
ÀÏÄ¡ÇÏ´Â Á¦³×¸¯(generic)À» ÅëÇØ Java Collections ÇÁ·¹ÀÓ¿öÅ©¿ÍÀÇ ÄÄÆÄÀÏ Å¸ÀÓ
ŸÀÔ ¾ÈÁ¤¼ºÀ» Á¦°øÇÑ´Ù.
Á¦³×¸¯ÀÇ ±âº»ÀûÀÎ »ç¿ë¹ý
Áß Çϳª´Â Ä÷º¼Ç(collection)°ú ÇÔ²² »ç¿ëÇÒ ¶§ µ¥ÀÌÅ͸¦ Ãß»óÈÇÏ´Â °ÍÀÌ´Ù. JDK 5.0
ÀÌÀü ¹öÀü¿¡¼´Â Collection »ý¼º½Ã, Ä÷º¼Ç ³»ºÎ¿¡ ÀÓÀÇÀÇ °ªÀ» ÁÙ ¼ö ÀÖ¾ú´Ù. ¿¹¸¦ µé¸é, ´ÙÀ½°ú °°´Ù.
List myList = new ArrayList(10);
myList.add(new Integer(10));
myList.add("Hello, World");
»ç¿ëÀÚÀÇ CollectionÀ» ƯÁ¤ ŸÀÔÀ¸·Î Á¦ÇÑÇÏ´Â °ÍÀº ¾î·Á¿î ÀÏÀ̸ç, Ä÷º¼ÇÀ¸·ÎºÎÅÍ ÇϳªÀÇ ¾ÆÀÌÅÛÀ» »Ì¾Æ³»±â À§Çؼ´Â ij½ºÆÃ ¿¬»êÀÌ ÇÊ¿äÇÏ´Ù.
Integer myInt = (Integer)myList.iterator().next();
¸¸¾à À߸øµÈ ŸÀÔÀ¸·Î ij½ºÆÃÀ» ÇÑ °æ¿ì¿¡´Â ÄÄÆÄÀϸ¸ ¼º°øÇϰí, ·±Å¸Àӽà ¿¹¿Ü°¡ ¹ß»ýÇÏ°Ô µÈ´Ù. Ưº°È÷ Collection
³»ÀÇ ¸ðµç ¾ÆÀÌÅÛÀ» Object·Î ó¸®ÇÏÁö ¾Ê´Â´Ù¸é, ij½ºÆÃÀº º¸Åë ¹¬½ÃÀûÀ¸·Î
¹ß»ýÇϰųª ij½ºÆÃµÈ ¿¬»êÀ» È£ÃâÇϱâ Àü¿¡ instanceof¸¦ ¼öÇàÇÏ¿© ¹ß»ýÇÑ´Ù.
Iterator listItor = myList.iterator();
Object myObject = listItor.next();
Integer myInt = null;
if (myObject instanceof Integer) {
myInt = (Integer)myObject;
}
ÀÌ·¯ÇÑ »óȲÀº Á¦³×¸¯ÀÇ ¹ÌÇÐÀû °¡Ä¡¸¦ ¶³¾î¶ß¸°´Ù. Á¦³×¸¯À» ÀÌ¿ëÇϸé ÇϳªÀÇ Collection¿¡¼ ÀúÀåÇϰíÀÚ ÇÏ´Â ¿ÀºêÁ§Æ®ÀÇ Å¸ÀÔÀ» ÄÄÆÄÀϽà ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô µÇ¸é ¸®½ºÆ®¿¡¼ ¾ÆÀÌÅÛÀ» Ãß°¡Çϰųª °Ë»öÇÒ ¶§, ±× ¸®½ºÆ®°¡ ƯÁ¤ ŸÀÔÀÇ ¿ÀºêÁ§Æ®°¡ Ȱ¼ºÈ µÉ °ÍÀÎÁö¸¦ ÀÌ¹Ì ¾Ë ¼ö ÀÖ´Ù. µû¶ó¼ ij½ºÆÃÀ» ÇÒ Çʿ䰡 ¾ø´Â °ÍÀÌ´Ù. "<>" ¹®ÀÚ´Â ¾î¶² ŸÀÔÀÌ ÀúÀåµÉ °ÍÀÎÁö¸¦ ÁöÁ¤Çϴµ¥ »ç¿ëÇÕ´Ï´Ù. ¸¸¾à À߸øµÈ ŸÀÔÀÇ µ¥ÀÌÅͰ¡ ÁÖ¾îÁø´Ù¸é, ÄÄÆÄÀϽà ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ Ŭ·¡½º¸¦ ÄÄÆÄÀÏÇÏ·Á Çϸé,
import java.util.*;
public class First {
public static void main(String args[]) {
List<Integer> myList = new ArrayList<Integer>(10);
myList.add(10);
myList.add("Hello, World");
}
}
´ÙÀ½ÀÇ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.
First.java:7: cannot find symbol
symbol : method add(java.lang.String)
location: interface java.util.List<java.lang.Integer>
myList.add("Hello, World");
^
1 error
Áï, ÀÌ ¸Þ½ÃÁö´Â ±âº»ÀûÀ¸·Î ÇØ´ç ÀÎÅÍÆäÀ̽º°¡ Integer ¿ÀºêÁ§Æ®ÀÇ List¿¡ ´ëÇÑ
°ÍÀÏ ¶§ add(String) ¸Þ¼Òµå´Â »ç¿ëÇÒ ¼ö ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
myList.add(10); ¸Þ¼Òµå´Â ¸®½ºÆ®¿¡ Integer
¿ÀºêÁ§Æ® 10À» add ÇÏ´Â ÀÛ¾÷À» ¼öÇàÇÏ¿´°í, AutoboxingÀº int
ŸÀÔÀ» Integer·Î º¯È¯ÇÏ¿´´Ù. ¿©±â¼ ½ÇÆÐÇÑ °ÍÀº StringÀ» IntegerÀÇ
List¿¡ Ãß°¡ÇÏ´Â °Í »ÓÀÌ´Ù.
ÇϳªÀÇ Ä÷º¼ÇÀÇ ¿¤¸®¸ÕÆ®·Î ÀÛ¾÷À» ÇÏ¸é¼ ±× Ä÷º¼Ç ³»ÀÇ ¿¤¸®¸ÕÆ®ÀÇ Å¸ÀÔÀ» ¸í½ÃÀûÀ¸·Î ¼±¾ðÇÏÁö ¾ÊÀº °æ¿ì¿¡µµ °æ°í¸¦ ¹Þ´Â´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ ÇÁ·Î±×·¥Àº List¸¦ »ý¼ºÇÏÁö¸¸, ±× List ³»¿¡ ¾î¶² ŸÀÔÀÌ ÀúÀåµÉ Áö¿¡ ´ëÇØ¼´Â ÁöÁ¤ÇÏÁö ¾Ê´Â´Ù.
import java.util.*;
public class Second {
public static void main(String args[]) {
List list = new ArrayList();
list.add(10);
}
}
ÀÌ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ Çϸé, ´ÙÀ½°ú °°Àº °æ°í¸¦ ¹Þ°Ô µÈ´Ù.
Note: Second.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
±× ÈÄ Áö½Ã¿¡ µû¶ó -Xlint:unchecked¸¦ javac ¸í·É¹®¿¡ Ãß°¡Çϸé
javac -Xlint:unchecked Second.java
´ÙÀ½°ú °°Àº Ãß°¡ Á¤º¸°¡ Ç¥½ÃµÈ´Ù.
Second.java:6: warning: [unchecked] unchecked call to add(E)
as a member of the raw type java.util.List
list.add(10);
^
ÀÌ ¸Þ½ÃÁö´Â "add(E)" ¡± È£Ãâ¿¡¼ "E" ¶ó´Â List¿¡ Ãß°¡µÈ ¿¤¸®¸ÕÆ®ÀÇ Å¸ÀÔÀÌ ÁöÁ¤µÇÁö ¾Ê¾Ò´Ù´Â ¶æÀÌ´Ù. ±×·¯³ª ÀÌ ¸Þ½ÃÁö´Â °æ°íÀÏ »Ó, a.class ÆÄÀÏÀº »ý¼ºµÈ´Ù.
°æ°í¸¦ Á¦°ÅÇÏ°í ½ÍÀ¸¸é ´ÙÀ½°ú °°ÀÌ <Object>¸¦ List ¼±¾ð½Ã Ãß°¡ÇÏ¸é µÈ´Ù.
List<Object> list = new ArrayList<Object>();
¿©±â¼, Object´Â EÀ̰í, ±âº»ÀûÀ¸·Î ±× List¿¡´Â ¾î¶² ŸÀÔµµ ÀúÀå °¡´ÉÇÏ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.
±×·±µ¥ E´Â ¾îµð¼ ¿Â °ÍÀϱî? java.util.List¿¡¼ ÀÎÅÍÆäÀ̽º ¼±¾ðºÎ¸¦ º¸¸é, ´ÙÀ½ÀÇ ³»¿ëÀ» º¼ ¼ö ÀÖ´Ù.
public interface List<E> extends Collection<E>
À̰ÍÀº ¹®¹ýÀûÀ¸·Î EÀÇ List¸¦ Çϳª ¼±¾ðÇÑ °ÍÀÌ´Ù.
³ªÁß¿¡ ÀÎÅÍÆäÀ̽º ¼±¾ð½Ã, ¸Å°³º¯¼ö³ª ¸®ÅÏ Å¸ÀÔÀÌ E·Î ±³Ã¼µÈ ¸Þ¼Òµå¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
Iterator<E" iterator();
ListIterator<E" listIterator();
boolean add(E o);
boolean addAll(Collection<? extends E" c);
E´Â ÄÄÆÄÀϽà ÁöÁ¤µÇ±â ¶§¹®¿¡ ŸÀÔ ºÒÀÏÄ¡¸¦ ã±â À§ÇØ ·±Å¸ÀÓ ¿¹¿Ü¿¡ ÀÇÁ¸ÇÒ Çʿ䰡 ¾ø´Ù. addAll ¶óÀÎÀÇ ?´Â ¾Ë·ÁÁöÁö ¾ÊÀº(unknown) Ä÷º¼ÇÀ¸·Î »ý°¢µÉ ¼ö ÀÖÁö¸¸, unknownÀº EÀÏ ¼öµµ ÀÖ°í, ¼ºêŬ·¡½ºÀÏ ¼öµµ ÀÖ´Ù. ÀÌ·¯ÇÑ ±¸¼ºÀ¸·Î ÀÎÇØ Á¤È®ÇÑ Å¸ÀÔ ¸ÅΏ¸À» »ç¿ëÇÏÁö ¾Ê°íµµ, ¼ºêŬ·¡½ºµéÀÇ Ä÷º¼ÇÀ¸·Î ÀÛ¾÷ÇÒ ¼ö ÀÖ´Ù.
ù ¹øÂ° ¿¹Á¦¸¦ ÅëÇØ¼ ¿Ïº®ÇÏ°Ô ¾Ë ¼ö´Â ¾ø°ÚÁö¸¸, Á¦³×¸¯Àº ÀϹÝÀûÀ¸·Î ÀÌÅÍ·¹ÀÌÅÍ(iterator)¸¦ ÀÌ¿ëÇØ ·çÇÁ °È(enhanced for loop )¿Í ÇÔ²² »ç¿ëµÈ´Ù. Á¦³×¸¯ÀÌ ¾øÀ» °æ¿ì, String ¿ÀºêÁ§Æ®ÀÇ ÇϳªÀÇ List¸¦ ·çÇÎÇÏ·Á¸é °¢°¢ÀÇ ¿¤¸®¸ÕÆ®¸¦ List·ÎºÎÅÍ ÀûÀýÇÑ Å¸ÀÔÀ¸·Î º¯È¯ÇØ¾ß ÇÑ´Ù. ±×·¯³ª Á¦³×¸¯°ú ·çÇÁ °È¸¦ ÀÌ¿ëÇÏ¸é ¸ðµç °ÍÀÌ °£´ÜÇØÁø´Ù
´ÙÀ½Àº Á¦³Ê¸¯°ú ·çÇÁ °È ¾øÀÌ String ¿ÀºêÁ§Æ®µéÀÇ List¸¦ ·çÇÎÇÏ´Â ±âÁ¸ ¹æ¹ýÀÌ´Ù.
import java.util.*;
public class Old {
public static void main(String args[]) {
List list = Arrays.asList(args);
Iterator itor = list.iterator();
while (itor.hasNext()) {
String element = (String)itor.next();
System.out.println(element + " / " + element.length());
}
}
}
À§ÀÇ Old Ŭ·¡½º¸¦ ÄÄÆÄÀÏ/½ÇÇàÇÏ°í ´ÙÀ½°ú °°ÀÌ ÇϳªÀÇ ¹®ÀÚ¿À» ¸Å°³·Î ½ÇÇàÇϸé,
java Old Hello
´ÙÀ½ °á°ú¸¦ ¾ò°Ô µÈ´Ù.
Hello / 5
JDK 5.0À» ÀÌ¿ëÇϸé ÃÖ½ÅÀÇ ·çÇÁ ±¸Á¶ °È¿Í Á¦³×¸¯À» °áÇÕÇÏ¿© ÄÄÆÄÀϽà ŸÀÔ ¾ÈÁ¤¼ºÀÌ º¸ÀåµÇ´Â ÇÁ·Î±×·¥À» »ý¼ºÇÒ ¼ö ÀÖÀ¸¸ç, °¡µ¶¼º°ú °ü¸® ¿ëÀ̼ºÀÌ ´õ Çâ»óµÈ´Ù. ´ÙÀ½Àº Á¦³×¸¯°ú ·çÇÁ °È¸¦ »ç¿ëÇÒ °æ¿ì String¿ÀºêÁ§Æ®µéÀÇ List Àüü ·çÇÎÀÌ ¾î¶»°Ô µÇ´ÂÁö º¸¿©ÁÖ´Â ¿¹Á¦ÀÌ´Ù.
import java.util.*;
public class New {
public static void main(String args[]) {
List<String> list = Arrays.asList(args);
for (String element : list) {
System.out.println(element + " / " + element.length());
}
}
}
java New Hello
Hello / 5
ÀÌ¿Í °°ÀÌ, Á¦³×¸¯°ú ·çÇÁ °È´Â ¼·Î Àß µ¿ÀÛÇÑ´Ù.
Á¦³×¸¯¿¡ ´ëÇÑ Á» ´õ »ó¼¼ÇÑ Á¤º¸´Â ´ÙÀ½À» ÂüÁ¶ Çϱ⠹ٶõ´Ù.
JMX, JCONSOLE°ú »ç¿ë¹ý
JSR-160˼
JMX(Java Management Extensions) 1.2 ¹öÀü API¸¦ È®ÀåÇÏ´Â API¸¦
Á¤ÀÇÇÏ¿© JMX MBean ¼¹ö¿¡ ¿ø°Ý ¾×¼¼½º¸¦ Á¦°øÇÑ´Ù. 2003³â 1¿ù 22ÀÏÀÚ Å×Å©ÆÁ Getting
Started with the Java Management Extensions(¿µ¹®)¸¦ ´Ù½Ã
»ìÆìº¸¸é, JMX API¸¦ ÀÌ¿ëÇØ ¸ð´ÏÅ͸µ ¹× °ü¸®¸¦ ÇÒ ¼ö ÀÖ´Â ÄÄÆ÷³ÍÆ®¸¦ ¾î·Æ»ç¸® Á¤ÀÇÇÒ ¼ö
ÀÖ´Ù. ÀÌ·¯ÇÑ ¸ð´ÏÅ͸µ ¹× °ü¸® ±â´ÉÀº ÀÌÁ¦ J2SE 5.0ÀÇ Ç¥ÁØÀÌ µÇ¾úÀ¸¸ç, JSR-60¿¡ ÀÇÇØ
¿ø°Ý Çڵ鸵ÀÌ Çâ»óµÇ¾ú´Ù. JMX ÀÔ¹®¿¡ °üÇÑ Ãß°¡ Á¤º¸´Â J2EEÀÇ Å×Å©ÆÁ JMX
ÀÌÇØÇϱ⸦ ÂüÁ¶Çϱ⠹ٶõ´Ù.
À̹ø Å×Å©ÆÁ¿¡¼´Â ÀÌ Àü Getting
Started with JMX Å×Å©ÆÁÀÇ ¿¹Á¦ Äڵ带 ÀÌ¿ëÇÏ¿© J2SE 5.0¿ëÀ¸·Î ¾÷µ¥ÀÌÆ®ÇØ
º¸ÀÚ. ¶ÇÇÑ ½ÇÇàÁßÀÎ ÇÁ·Î±×·¥¿¡ ´ëÇØ Åë°è¸¦ µð½ºÇ÷¹ÀÌ Çϱâ À§ÇÑ ÃֽŠjconsole
ÅøÀÇ »ç¿ë¹ý¿¡ ´ëÇØ¼µµ °øºÎÇØ º¸µµ·Ï ÇϰڴÙ.
"Getting Started with JMX" Å×Å©ÆÁ¿¡¼´Â,
JAR ÆÄÀÏ¿¡ ´ëÇÑ Å¬·¡½º °æ·Î¸¦ ¸í½ÃÀûÀ¸·Î Ãß°¡Çؾ߸¸ ¿¹Á¦ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ¹× ½ÇÇàÇÒ ¼ö ÀÖ¾ú´Ù.
±×·¯³ª J2SE 5.0¿¡¼´Â ´õ ÀÌ»ó JAR ÆÄÀÏÀ» Ŭ·¡½º °æ·Î¿¡ ¸í½ÃÀûÀ¸·Î Ãß°¡ÇÒ Çʿ䰡 ¾ø´Ù.
J2SE 5.0¿¡¼´Â JMX°¡ Ç¥ÁØÀÌ µÇ¾ú±â ¶§¹®ÀÌ´Ù. ¿øº» ¼Ò½º¸¦ ¾à°£ º¯°æÇÏ´Â °ÍÀ¸·Î ÇÁ·Î±×·¥Àº
Ç¥ÁØ ÀÚ¹Ù °³¹ß Ç÷§Æû¿¡¼ ÄÄÆÄÀÏ/½ÇÇàµÉ °ÍÀÌ´Ù.
ÀÌÀü Å×Å©ÆÁ¿¡¼ MBean Ŭ·¡½º(HelloMBean)¿¡´Â ÆÐŰÁö°¡ ¾ø¾ú´Ù. ±×·¯³ª »ç¿ëÀÚ°¡ ¸¸µç ÄÄÆ÷³ÍÆ®¸¦ ÆÐŰÁö¿¡ Æ÷ÇÔ½ÃŰ´Â °ÍÀº ¾ðÁ¦³ª °¡Àå ÁÁÀº ¹æ¹ýÀ̸ç, À̸¦ À§Çؼ´Â »ç¿ëÀÚÀÇ ¼Ò½º¿¡ µð·ºÅ丮¸¦ ¸¸µé¾î¼ ±× µð·ºÅ丮 ±¸Á¶¿¡ ´ëÇØ ÆÐŰÁö¿¡ ¼¼úÀ» Ãß°¡ÇØ ÁÖ¸é µÈ´Ù.
package bean;
public interface HelloMBean {
public String getMessage();
public void setMessage(String message);
public int getChangeCount();
public void resetCounter();
}
ÀÌ¿Í ºñ½ÁÇϰÔ, MBean ±¸Çö(Hello)¿¡¼ º¯°æµÈ ºÎºÐÀº ÆÐŰÁö ¼¼úÀ» Ãß°¡ÇÏ´Â °Í »ÓÀÌ´Ù.
package bean;
public class Hello implements HelloMBean {
private String message;
private int changeCount;
public String getMessage() {
return message;
}
public void setMessage(String message){
this.message = message;
changeCount++;
}
public int getChangeCount() {
return changeCount;
}
public void resetCounter() {
changeCount = 0;
}
}
´õ Áß¿äÇÑ ¼öÁ¤ »çÇ×Àº ÄÄÆ÷³ÍÆ®¸¦ »ý¼ºÇϰí MBean ¼¹ö¿¡ µî·ÏÇÏ´Â ¿¡ÀÌÀüÆ®(HelloAgent)ÀÌ´Ù. ¿©±â¿¡µµ
ÆÐŰÁö ±â¼úÀ» ÇØ ÁÖ¾î¾ß Çϸç, MBeanServer¸¦ ±¸ÇÏ´Â ¹æ¹ýÀ» ¾à°£
¹Ù²Ù¾î ÁÖ¾î¾ß ÇÑ´Ù. J2SE 5.0¿¡´Â Ç÷§Æû MBean »Ó ¾Æ´Ï¶ó ¾ÖÇø®ÄÉÀÌ¼Ç MBean ±îÁöµµ
»ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¼³°èµÈ MBeanServerÀÌ µµÀԵǾúÀ¸¸ç, ¿¬¼â »ý¼ºÀÇ
ÇÑ ±âÁ¡ÀÇ ¿ªÇÒÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀº ÀÚ½ÅÀÇ ¼¹öº¸´Ù´Â Ç÷§Æû MBeanServer¸¦
»ç¿ëÇϱ⵵·Ï ±ÇÀåµÈ´Ù. MBeanServer¸¦ ¾ò±â À§ÇÑ ÀÌÀüÀÇ ¹æ¹ýÀº javax.management
ÆÐŰÁö¸¦ ÀÓÆ÷Æ®Çϰí MBeanServerFactoryÀÇ createMBeanServer
¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© ¼¹ö¸¦ »ý¼ºÇؾßÇß´Ù.
MBeanServer server =
MBeanServerFactory.createMBeanServer();
»õ·Î¿î ¹æ¹ýÀº ±âº»ÀûÀ¸·Î´Â ÀÌÀü°ú µ¿ÀÏÇÏÁö¸¸, °ü¸® ÀÚ¿øÀ» ´ÙÁß ¿¡ÀÌÀüÆ® ´ë½Å ´ÜÀÏ ¿¡ÀÌÀüÆ®(Ç÷§Æû MBeanServer)¿¡
µî·ÏÇÒ ¼ö ÀÖ´Ù. Ç÷§Æû MBeanServer¸¦ ¾ò±â À§Çؼ´Â ManagementFactory.getPlatformMBeanServer¸¦
È£ÃâÇØ¾ß Çϸç, ManagementFactory Ŭ·¡½º´Â java.lang.management ÆÐŰÁö¿¡
ÀÖ´Ù.
MBeanServer server =
ManagementFactory.getPlatformMBeanServer();
´ÙÀ½Àº HelloAgentÀÇ ¾÷µ¥ÀÌÆ® ¹öÀüÀÌ´Ù.
package bean;
import java.lang.management.*;
import javax.management.*;
public class HelloAgent {
public static void main(String args[]) {
MBeanServer server =
ManagementFactory.getPlatformMBeanServer();
HelloMBean hello1 = new Hello();
HelloMBean hello2 = new Hello();
try {
ObjectName helloObjectName1 = new ObjectName(
"bean:type=Hello,name=hello1");
server.registerMBean(hello1, helloObjectName1);
ObjectName helloObjectName2 = new ObjectName(
"bean:type=Hello,name=hello2");
server.registerMBean(hello2, helloObjectName2);
System.out.println("Waiting...");
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
System.out.println("Sleep stopped");
e.printStackTrace();
} catch (MalformedObjectNameException e) {
System.out.println("Bad object name");
e.printStackTrace();
} catch (InstanceAlreadyExistsException e) {
System.out.println("Already exists");
e.printStackTrace();
} catch (MBeanRegistrationException e) {
System.out.println("Registration problems");
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
System.out.println("Registration problems");
e.printStackTrace();
}
}
}
ÀÌÁ¦, jconsole ÅøÀ» »ìÆìº¸ÀÚ. JDK 5.0¿¡´Â ½ÇÇàÁßÀÎ ÀÚ¹Ù¿¡ ÷ºÎµÈ jconsoleÀ̶ó°í ÇÏ´Â ÃֽŠSwing ±â¹ÝÀÇ ÅøÀÌ Æ÷ÇԵǾî ÀÖÀ¸¸ç, MBean ¼Ó¼º ¹× µ¿ÀÛ »Ó ¾Æ´Ï¶ó ÇÁ·Î±×·¥ÀÇ ¼º´É, ¸Þ¸ð¸® »ç¿ë·®, ½º·¹µå ½ºÅà ÃßÀû¿¡ ´ëÇÑ Åë°è¸¦ º¸¿©ÁØ´Ù. ¶Ç Çϳª ÁÖ¸ñÇÒ °ÍÀº jconsoleÀ» ÀÌ¿ëÇϸé HtmlAdaptorServer¸¦ »ý¼ºÇÒ Çʿ䰡 ¾ø´Ù´Â °ÍÀÌ´Ù.
jconsole°ú ¾÷µ¥ÀÌÆ®µÈ ¿¹Á¦ ÇÁ·Î±×·¥À» °°ÀÌ »ç¿ëÇϱâ À§Çؼ´Â 3°¡Áö Ŭ·¡½º(HelloMBean, Hello, HelloAgent)¸¦ ÄÄÆÄÀÏÇϰí ÀûÀýÇÑ ¸í·É¹®À» ÀÌ¿ëÇÏ¿© À̸¦ ½ÇÇàÇØ¾ß ÇÑ´Ù. ÀÌ 3°³ÀÇ Å¬·¡½º¸¦ ÄÄÆÄÀÏÇÒ ¶§, ÀÌ Å¬·¡½ºµéÀº ´ÜÀÏ ÆÐŰÁö ¾È¿¡ ÀÖ´Ù´Â Á¡À» ±â¾ïÇϱ⠹ٶõ´Ù.
ÀÌ Å¬·¡½ºµéÀ» ÄÄÆÄÀÏ ÇÒ ¶§ Windows ȯ°æ¿¡¼´Â ¾Æ·¡ÀÇ ¸í·É¹®À» »ç¿ëÇÏ¸é µÈ´Ù. ÀÌ ¸í·É¹®À» »ý¼ºµÈ Ŭ·¡½º À§Ä¡ÀÇ »óÀ§ µð·ºÅ丮¿¡¼ ½ÇÇàÇϰí, "bean" ´ë½Å ÆÄÀÏÀ» »ý¼ºÇÑ À§Ä¡ÀÇ ½ÇÁ¦ À̸§À¸·Î ±³Ã¼ÇÏÀÚ.
javac bean\*.java
ÀÌ ¸í·É¹®Àº ¼Ò½º ÆÄÀÏÀÌ ÀÖ´Â µð·ºÅ丮¿¡ .class ÆÄÀÏÀ» »ý¼ºÇÕ´Ï´Ù. ´Ù¸¥ µð·ºÅ͸®¿¡ »ý¼ºÇϰíÀÚ ÇÑ´Ù¸é, -d ¿É¼ÇÀ» »ç¿ëÇϱ⠹ٶõ´Ù.(´Ü, »õ·Î¿î À§Ä¡°¡ Ŭ·¡½º °æ·Î·Î ÀâÇô ÀÖ´ÂÁö È®ÀÎÇØ¾ß ÇÑ´Ù).
Solaris ¿î¿µÃ¼Á¦³ª Linux³ª Mac ȯ°æ¿¡¼´Â ½½·¡½Ã ¹æÇ⸸ ¹Ù²ãÁÖ¸é µÈ´Ù.
javac bean/*.java
¸ð´ÏÅ͸µ ±â´ÉÀÌ °¡´ÉÇϵµ·Ï JMX Ȱ¼º ÇÁ·Î±×·¥À» ½ÇÇàÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ com.sun.management.jmxremote ¸í·É¹® ¼Ó¼ºÀ» ¼³Á¤ÇØ¾ß ÇÑ´Ù.
java -Dcom.sun.management.jmxremote HelloAgent
main() ¸Þ¼Òµå ³¡¿¡¼ Thread.sleep()À»
È£ÃâÇϹǷΠÀÌ ¸Þ¼Òµå´Â Áï½Ã ¸®ÅÏÇÏÁö ¾ÊÀ» °ÍÀ̸ç, ÀÌ ½ÃÁ¡¿¡¼ JMX ¿¡ÀÌÀüÆ®°¡ ½ÇÇàµÇ´Â µ¿ÀÏ È£½ºÆ®¿¡¼
jconsoleÀ» ½ÃÀÛÇØ¾ß ÇÑ´Ù. À̸¦ ½ÃÀÛÇϱ⿡ ¾Õ¼ HelloAgent
ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ°í ÀÖ´ÂÁö È®ÀÎÇϱ⠹ٶõ´Ù. jconsoleÀ» ½ÃÀÛÇÏ´Â µ¥¿¡´Â 2°³ÀÇ ¿É¼ÇÀ» »ç¿ëÇÒ
¼ö ÀÖ´Ù. Áï, »õ·Î¿î jps ¸í·É¹® ÅøÀ» °¡Áø ¿¡ÀÌÀüÆ® ÇÁ·Î±×·¥ÀÇ ÇÁ·Î¼¼½º ¾ÆÀ̵ð(PID)¸¦ ã¾Æ¼
¸í·É¹® ¿É¼Ç¿¡ Áְųª, ¾Æ¹«·± ¿É¼Ç ¾øÀÌ ½ÃÀÛÇÏ¿© ÇÁ·Î±×·¥¿¡¼ ãÀ» ¼öµµ ÀÖ´Ù. PID¸¦ ÁöÁ¤ÇÏÁö ¾Ê°í
jconsoleÀ» ½ÃÀÛÇÏ·Á¸é ´ÙÀ½ ¸í·É¹®À» ½ÇÇàÇϱ⠹ٶõ´Ù.
jconsole
PID ¾øÀÌ ½ÃÀÛÇϸé Ãʱ⿡ "JConsole:
Connect to Agent" âÀÌ Ç¥½ÃµÈ´Ù. ÇÑÆí, HelloAgent°¡ ½ÇÇà ÁßÀÌ¸é ¸®½ºÆ®¿¡¼
PID¸¦ ãÀ» ¼ö ÀÖ´Ù.
ÇØ´ç ¿¡ÀÌÀüÆ®¸¦ ¼±ÅÃÇϰí Connect ¹öưÀ» ´©¸¥´Ù. ±×·¯¸é Ãʱâ Summary ȸéÀÌ ³ªÅ¸³´Ù.
Memory, Threads, Classes ÅÇÀº Ãʱâ ȸéÀÇ ¿ä¾à Á¤º¸¸¦ Æ÷ÇÔÇϰí ÀÖÀ¸¸ç, ÀÌ ÅǵéÀ» ¼±ÅÃÇϸé Ãß°¡ Á¤º¸¸¦ º¼ ¼ö ÀÖ´Ù.
Memory ÅÇÀº Èü ¸Þ¸ð¸® »ç¿ë·®°ú °¢ ¸Þ¸ð¸® Ç®ÀÇ »ç¿ë·®À» Â÷Æ®·Î º¸¿©ÁØ´Ù. °¡ºñÁö(garbage)
Ä÷º¼Ç ÄÝÀ» ¿äûÇÏ¸é °¡ºñÁö Ä÷º¼Ç ·±Å¸ÀÓµµ º¼ ¼öµµ ÀÖ´Ù.
Threads ÅÇÀº ½ÇÇàÁßÀÎ ½º·¹µåÀÇ ¼ö¸¦ Ç¥½ÃÇÑ´Ù. ¸®½ºÆ®¿¡¼ ƯÁ¤ÇÑ ½º·¹µå¸¦ ¼±ÅÃÇϸé ÇØ´ç
½ºÅÃÀ» ÃßÀûÇÒ ¼ö ÀÖ´Ù.
Classes ÅÇÀº ÇÑ ¹ø¿¡ ¸î °³ÀÇ Å¬·¡½º°¡ ·ÎµùµÇ¾î ÀÖ´ÂÁö¸¦ º¼ ¼ö ÀÖ´Ù. Verbose Output üũ¹Ú½º¸¦ üũÇϸé Ŭ·¡½º°¡
Ãß°¡·Î ·ÎµùµÉ ¶§¸¶´Ù Äֿܼ¡ Ç¥½ÃµÇ¸ç, ÀÌ Å¬·¡½º´Â ½Ã½ºÅÛÀÌ »ý¼ºÇÑ Å¬·¡½ºÀÏ °æ¿ì°¡ ÀÖÀ¸¹Ç·Î ¹Ýµå½Ã
ÀνÄÇØ¾ß ÇÒ ÇÊ¿ä´Â ¾ø´Ù.
MBeans ÅÇÀº ±âº»ÀûÀ¸·Î ÀÌÀüÀÇ ºê¶ó¿ìÀú ±â¹Ý ¿¡ÀÌÀüÆ® ºä¸¦ ´ë½ÅÇÑ °ÍÀÌ´Ù. ¿©±â¼´Â beanÀ»
ã¾Æ¼ ±× ¼Ó¼ºÀ» ¼öÁ¤ÇÏ°í ½ÇÇàÇÒ ¼ö ÀÖ´Ù.
VM À̸§ÀÇ ·¹À̺íÀÌ ºÙÀº ¸¶Áö¸· ÅÇÀº °¡»ó ¸Ó½ÅÀÌ´Ù. ¿î¿µÃ¼Á¦ Á¤º¸¿Í ·±Å¸ÀÓ Ç÷§Æû¿¡ ´ëÇÑ
»ó¼¼Á¤º¸¸¦ º¸¿©ÁØ´Ù.
ÇÑ °¡Áö ¾Ë¾ÆµÎ¾î¾ß ÇÒ °ÍÀº jconsoleÀ» ÀÌ¿ëÇϱâ À§Çؼ ¹Ýµå½Ã MBeanÀ» »ç¿ëÇÒ ÇÊ¿ä´Â ¾ø´Ù´Â Á¡À̸ç,
jconsoleÀ» ½ÃÀÛÇϱâ Àü¿¡ -Dcom.sun.management.jmxremote
¿É¼ÇÀ¸·Î ÇÁ·Î±×·¥À» ½ÃÀÛÇß´ÂÁö¿¡ ´ëÇØ¼¸¸ È®ÀÎÇÏ¸é µÈ´Ù.
JMX¿¡ °üÇÑ Á» ´õ ¸¹Àº ³»¿ëÀº ´ÙÀ½ ¹®¼µéÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.
º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù.
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϰųª ¼ö½ÅÁÖ¼Ò¸¦ º¯°æÇÏ·Á¸é SKDN@Sun.comÀ¸·Î
¹®ÀÇ Áֽñ⠹ٶø´Ï´Ù.
SKDN(Sun Korea
Developers Network)¿¡¼ J2EE/J2SE Å×Å©ÆÁ µî ´Ù¾çÇÑ ¾ÆÆ¼Å¬µéÀ»
Âü°íÇϼ¼¿ä.
Copyright 2003-2005 Sun Korea, Inc. All rights reserved.
|