라이센스에 대한 변경과 함께 많은 사람들에게 가장 주목을 받았던 새로운 변화는 무엇일까를 생각해본다면 아마도 스크립트 언어를 지원하게 되었다는 것이 아닐까 한다. MS의 .NET을 보며 들었던 생각중의 하나가 어짜피 바이트코드로 컴파일 된 프로그램을 가상머신에서 실행할 것이라면 굳이 JVM도 자바 하나만 돌릴 필요가 없지 않나라는 것이었기에 스크립팅을 지원한다는 소식은 5.0에서 문법이 대폭 변한 것 보다도 더 큰 변화로써 내심 기대했었다. 하지만 .NET 과 같이 다른 언어를 바로 JVM에서 인식하는 바이트코드로 컴파일하여 사용하는 것은 아니고 Java 로 스크립트를 로딩하도록 해서 실행하는 것으로 .NET 에서 여러 언어를 지원하는 방식과는 사뭇 다르다.
http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html 에 있는 간단한 샘플을 보면 다음과 같은 코드를 사용해서 문자열로 된 스크립트를 실행하고 있는 것을 볼 수 있다.
import javax.script.*;
public class EvalScript {
public static void main(String[] args) throws Exception {
// create a script engine manager
ScriptEngineManager factory = new ScriptEngineManager();
// create a JavaScript engine
ScriptEngine engine = factory.getEngineByName("JavaScript");
// evaluate JavaScript code from String
engine.eval("print('Hello, World')");
}
}
현재 JSE 6.0 에서 실행할 수 있는 스크립트 언어는 Javascript 가 가장 대표적이고 https://scripting.dev.java.net/ 에 가보면 상당히 많은 스크립트들을 JVM 에서 실행하고자 하는 노력이 진행중인 것을 볼 수 있다. Python, Ruby, Groovy, Jelly 등 귀에 친숙한 스크립트 언어들을 앞으로 JVM 에서 구동하는 날이 가까워지고 있다.
이어서 큰 변화를 갖게 된 것은 GUI 와 관련된 부분이다. 기존에 다루기 힘들었던 Swing 의 Drag & Drop 이 강력하고 쉽게 커스터마이징 할 수 있도록 개선되으며, 자세한 내용은 "Improved Drag Gesture in Swing" 에서 확인하자. 그리고 시스템 트레이에 아이콘을 추가할 수 있는 기능, Java 애플리케이션을 초기화하는 중에 스플래쉬 이미지를 지정할 수 있는 기능 등 데스크탑과 관련해서 광범위한 개선이 이루어졌다.
또한 성능에 관련하여 가비지 콜렉션이 개선되고 Solaris 10의 DTrace 라는 모니터링 툴과 연계되는 등 여러 개선된 부분들이 있다. 자세한 내용은 백서 가 작업중인 관계로 자세히 알아보기는 힘들다.
JSE 6.0 에서는 컬렉션에 있어서 몇 가지 중요한 API가 추가되었다. 자세한 내용은 한빛 네트워크의 Java 6.0 컬렉션 API에 어떤 변화가 있는가? 라는 글을 참조하고 간략하게 알아보자.
Jar와 Zip 과 관련해서 가끔 불편하게 생각했던 것이 개선되었는데 가장 마음에 드는 변경은 jar 명령어의 경우 압축을 풀으면 풀인 파일의 날짜가 현재시간으로 바뀌던 것을 압축되어있던 파일의 원래날짜로 유지되도록 수정되었다는 것이다. 그리고 jar 로 독립애플리케이션을 패키징 할 때 'e' 옵션으로 main 메소드를 갖는 클래스를 지정할 수 있게 되었다. 관련 API 에서는 java.util.zip.DeflaterInputStream, java.util.zip.InflaterOutputStream 두 스트림 클래스가 추가되었고 zip 파일의 경우 64K 개가 넘는 엔트리를 가질 수 있도록 수정되었고, 윈도에서 파일명이 256자까지만 사용할 수 있던 것과 동시에 오픈할 수 있는 zip 파일이 2000개로 제한되어있던 것을 풀었다.
국제화와 관련해서는 날짜 포맷과 같이 로케일과 밀접하게 연관된 클래스들이 java.text 와 java.util 패키지에 추가되었다. 그리고 java.text.Normalizer 클래스를 통해 문자를 정규화할 수 있게 되었다. 이는 동일한 기호를 여러가지 코드로 표현할 수 있지만 정렬은 로케일에 따라 정해진 대로 하도록 할 때 유용하게 쓰일 수 있다.
java.net.IDN 이라는 클래스는 국제화된 도메인명간에 변환을 하는 클래스로써, Unicode 와 ASCII 간의 변환을 해준다. ResourceBundle 과 관련된 향상도 몇 가지 있고 추가 지원된 로케일들도 있다.
IO와 관련해서는 문자기반 콘솔을 사용하기 위해 java.io.Console 클래스를 추가하였다. 이 클래스에는 readPassword() 라는 메소드가 있어서 텍스트 기반의 간단한 애플리케이션에서도 보안을 신경써야 할 텍스트를 받을 필요가 있을 때 간단하게 사용할 수 있다.
File 클래스에는 디스크 공간을 알 수 있는 메소드 3개(getTotalSpace(), getFreeSpace(), getUsableSpace())가 추가되어서 디스크 사용량을 더 쉽게 체크할 수 있게 되었고, 파일의 읽기, 쓰기, 실행 권한을 직접 세팅하고 읽어올 수 있게 되었다. 또한 isFile() 메소드의 경우 Windows 에서는 CON, NUL, AUX, LPT 과 같은 장치 예약어와 같은 이름의 파일을 만드는 경우 이전에는 true 를 리턴했었지만 false 를 리턴하도록 수정되었다. IOException 은 생성자에 Throwable 을 파라미터로 쓸 수 있게 되어서 exception chaining 이 가능하게 되었다.
네트워크과 관련된 개선중에 눈에 띠는 것은 java.net.NetworkInterface 의 getHardwareAddress() 로 MAC 어드레스를 JNI나 다른 복잡한 방법을 사용하지 않고도 가져올 수 있다는 것이다. GUID와 같은 것을 생성할 때 좀 더 쉽게 만들 수 있게 된 것이다. 이 외에도 NetworkInterface 에 MTU, 서브넷 마스크, 브로드캐스트 주소등과 관련한 다수의 메소드가 추가되었으니 한 번쯤 훑어보면 좋을 것 같다.
지금까지 언급한 내용들 외에도 JDBC 4.0 API가 추가되고, 보안, JMX, Java Web Start, Java Plug-in, Instrumentation, JPDA, JVM TI, JConsole 등과 관련해 상당히 많은 개선들이 있었다. 자세한 내용은 JavaTM SE 6 Release Notes 에서 확인하자.
Java의 버전이 올라가는 것이 어떤 사람들에게는 전혀 흥미꺼리가 되지 않을 수도 있을 것이다. 정작 본인도 아직 프로젝트에서는 jdk1.3.1 을 사용하고 있는 상태여서 이렇게 훑어본 내용을 언제 실전에서 써볼지는 알 수가 없다. 더우기 스크립트를 돌리는 기능은 아예 필요성에 의문을 제기하는 사람도 있을 수 있을 것이다. 하지만 3개월 뒤에, 아니면 6개월 뒤에 어떤 일을 하게 될 지 아무도 예견할 수 없지않은가? 여유가 조금 있을 때 기본적인 변화를 미리 체크해보는 센스를 발휘한다면 나중에 덕을 볼 일도 있을 것이다.
[출처] JSE 6.0 은 어떻게 바뀌었나?|작성자 미르