SSISO Community

시소당

JSE 6.0 은 어떻게 바뀌었나?

JSE 6.0 에서는 Java 스펙상의 변화 말고도 오픈소스 라이센스를 도입하고 J2SE 에서 2를 뺀 JSE 라는 명칭을 사용하는 등 다방면에서 많은 변화로 Java 유저들의 관심을 끌어왔다. 많은 변화 덕분에 API 문서의 주소체계가 http://java.sun.com/j2se/1.5.0/docs/api/index.html 에서 http://java.sun.com/javase/6/docs/api/index.html 으로 바뀌었다는 것도 볼 수 있다. 어떤 것들이 바뀌었는지 자세히 알아보기 위해 JSE 6.0 을 받으려고 Java SE Downloads 를 방문했더니 어느새 1.6.0_01 버전이 나와있었다. 업데이트가 빠르기도 하여라...

 라이센스에 대한 변경과 함께 많은 사람들에게 가장 주목을 받았던 새로운 변화는 무엇일까를 생각해본다면 아마도 스크립트 언어를 지원하게 되었다는 것이 아닐까 한다. 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에 어떤 변화가 있는가? 라는 글을 참조하고 간략하게 알아보자.

  1. Deque 추가
    Deque 는 Double-Ended Queue 를 줄인 말로〕라고 읽는다. 말 그대로 양쪽에서 입출력이 가능한 자료구조이며 큐, 스택 등을 대체할 수 있는 인터페이스이다. 대표적인 구현체로 ArrayDeque 와 LinkedList 가 있으며 ArrayDeque는 스택으로 사용할 때는 기존의 Strack클래스 보다 성능이 좋고 큐로 사용할 때는 LinkedList 클래스 보다 성능이 좋다.
  2. BlockingDeque 의 추가
    BlockingDeque 를 이해하려면 J2SE 5.0 에서 추가되었던 BlockingQueue 를 알아야한다. BlockingQueue 는 큐에서 하나를 꺼내올 때 큐가 비어있는 상태이면 큐에 무엇인가가 채워질 때까지 기다렸다가 꺼내오거나, 큐가 꽉 차서 더이상 추가할 수 없는 상태라면 큐에 여유가 생기기를 기다렸다가 추가를 할 수 있는 큐이다. 그리고 BlockingDeque 는 BlockingQueue 를 양방향에서 입출력할 수 있도록 개선한 것이다. 대표적인 구현체는 LinkedBlockingDeque 이다.
  3. NavigableSetNavigableMap 의 추가
    각 각 SortedSet 과 SortedMap 을 확장한 것으로 특정 값보다 크거나 작은 값을 가져올 수 있는 floor, seiling, lower, higher 등의 메소드를 갖는 Collection 이 추가되었다. 대표적인 구현체는 TreeSet, ConcurrentSkipListSet 과 TreeMap, ConcurrentSkipListMap 이다.

 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개월 뒤에 어떤 일을 하게 될 지 아무도 예견할 수 없지않은가? 여유가 조금 있을 때 기본적인 변화를 미리 체크해보는 센스를 발휘한다면 나중에 덕을 볼 일도 있을 것이다.


635 view

4.0 stars