2011년 6월 9일 목요일

J2SE 1.5 Tiger의 미래와 언어 차원의 변화

Tiger의 미래와 언어 차원의 변화

John Zukowski
President, JZ Ventures, Inc.
2003년 12월 19일

J2SE 1.5 (Tiger)는 아직 공식적인 데뷔는 하지 않았지만 프로토타입을 다운로드를 통해 접근할 수 있다. "parameterized" 타입, enumeration, 변수 인자 리스트, autoboxing, 향상된 for 루프, 정적 반입 등 언어 차원의 발전이 J2SE 1.5 버전에서 눈에 띈다.
2004년 상반기에 출시 예정인 J2SE 1.5 (Tiger)에는 자바 플랫폼에 대한 언어 차원의 많은 변화들이 포함되어 있다. strictfp 같은 새로운 키워드와 표명의 추가가 있을 것이라는 기대로 자바 프로그래밍 언어 자체는 1.1 당시 내부 클래스의 추가 이후 변화가 없었다. 이 버전은 많은 중요한 변화가 있을 것이라는 기대를 받고 있다. "parameterized" 데이터 유형(generics), 시스템의 지원을 받는 enumeration, autoboxing, for 루프의 향상, 정적 반입 등을 지원한다.
프로토타입 설치하기
Sun Developer Network은 generics 추가를 지원하는 프로토타입 버전 2.2를 포함하고 있다. 이 프로토타입은 앞서 언급한 언어 구조체를 지원하기 때문에 1.5 버전을 사용하여 실험할 수 있다.
Sun Developer Network(참고자료)을 방문하여 generics 프로토타입을 다운로드 후 언패킹하여 환경 변수가 설정되었는지를 확인한다. 다운로드 할 때, Java Archive Files (JARs)은 표준 시스템 클래스를 새로운 버전으로 교체해야 한다. 이를 간과하면 프로토타입 패키지를 사용할 수 없다.
설정해야 할 두 개의 환경 변수는 JSR14DISTR(adding_generics-2_2-ea.zip을 언패킹하는 장소)와 J2SE14(J2SDK 1.4.2가 설치되는 곳)이다. Listing 1은 Microsoft Windows 플랫폼에 설정하는 모습이다:
Listing 1. 환경 변수 설정
 set JSR14DISTR=c:\adding_generics-2_2-ea
 set J2SE14=c:\j2sdk1.4.2


설정이 정확히 되었는지를 보려면 프로토타입에 따라오는 하위 디렉토리 examples에서 Test.java 소스 예제를 본다. 하위 디렉토리 scripts에 있는 javac 스크립트로 이를 컴파일한다. 컴파일이 정확히 되면 환경은 올바르게 설정된 것이다. 그렇지 않다면 환경 변수가 정확히 설정되었는지를 확인한다.
generics 사용하기
아직까지는 생소한 몇 가지 용어를 사용했다. genericsparameterized types(종종 템플릿이라고 칭함)이 그것이다. generics 지원으로 보다 명백한 컴파일 시간 체크와 덜 명확한 캐스팅(casting)과 함께 유형 자유로운 타입의 컬렉션을 가질 수 있다. generics는 많은 장점들이 있지만 한 가지 중요한 혜택은 String 타입의 객체의 List를 요청할 수 있다. Integer를 List에 놓으면 이는 컴파일 시 이 시도를 거부할 것이다. 또한 리스트에서 엘리먼트를 보내면 이를 다시 String으로 캐스팅(cast) 할 필요가 없다. 자동으로 수행되기 때문이다. 이 기능의 정확한 신택스는 바뀔 수 있지만 가장 단순한 경우 컬렉션 용 선언 주위에 <type>을 추가하면 된다.
Listing 2는 main() 메소드로 전달된 명령행 인자 어레이를 String 객체의 List로 변환하는 방법이다:
Listing 2. generics 시도하기
 import java.util.*;

 public class StringList {
   public static void main (String args[]) {
     // Create a List of type String
     List<String> listOne = Arrays.asList(args);
     // Make editable copy of List of type String
     List<String> listTwo = new ArrayList<String>(listOne);
     // Print contents
     System.out.println(listTwo);
     // Fetch element
     String head = listTwo.get(0);
     // Print element
     System.out.println(head);
     // Add item to list
     listTwo.add(head);
     // Print contents
     System.out.println(listTwo);
     // Can't do item of type List.
     // Won't compile.
     /* listTwo.add(listOne); */
   }
 }  


특별한 javac 스크립트로 프로그램을 컴파일 한 후에, 특별한 java 스크립트로 이를 실행한다. 명령행 인자 세트로 전달하여 String객체로서 List에 배치한다는 것을 보여준다. 그리고 하나의 아이템이 리스트 밖에서 검색되고 뒤에서 추가되는 것도 보여준다. main() 메소드의 마지막 라인은 컴파일 할 수 없기 때문에 주석이 달렸다. listTwo가 String 유형 중 하나라고 선언되었기 때문에, 컴파일러는 List 유형을 여기에 추가할 수 없는 것이다.
시스템 지원을 받는 enumeration
enumeration은 관련 상수 값들을 정의할 수 있도록 하는 언어 구조체이다. 이 값은 상수 들 중 하나를 나타내고자 할때 사용된다. .
enumeration을 할 수 있지만 정확하게 되지 않는다면 문제가 생긴다. 정확히 하려면 간단한 태스크에도 많은 코드가 필요하다. (참고자료)
JSR 201은 새로운 enum 키워드를 추가했다. enumeration 이름과 괄호안으로 들어가야할 가능한 값들이 그것이다. (enum Color {red, green, blue}). Listing 3은 enum의 사용 방법이다:
Listing 3. enumeration
 public class EnumTest {
   public static void main(String args[]) {
     enum Color {red, green, blue};

     // Get collection of values
     System.out.println(Color.VALUES);

     // Check if collection type is java.util.List
     System.out.println(Color.VALUES instanceof java.util.List);

     // Create variable of type
     Color aColor = Color.green;

     // Use enumeration in switch
     switch(aColor) {
       case Color.red:
         System.out.println("Got red.");
         break;
       case Color.green:
         System.out.println("Got green.");
         break;
       case Color.blue:
         System.out.println("Got blue.");
         break;
     }
   }
 }


변수 인자 리스트
Tiger의 또 다른 새로운 기능은 변수 인자 리스트 지원이다. 이전에는 인자의 변수 숫자의 지원이 필요하면 객체의 어레이 (Object[ ])로 전달하고 그런 다음 이것의 길이를 요청했다. 이제는 인자 리스트에 ...를 지정함으로서 같은 것을 얻게 된다. Listing 4는 메소드 선언과 호출 내용이다.
Listing 4. 변수 인자 리스트
 public static void printf(String fmt, Object... args) {
   // ...
 }
 printf("Hello, %\n", first);
 printf("Hello, % %\n", first, last);
 printf("Hello, % (%) %\n", first, middle, last);


args[0] 같이 어레이 액세스를 통해 args에 액세스한다. 변수 인자를 사용하던 이전 방식과 다를 것이 없다.
autoboxing 다루기
Autoboxing은 프리머티브 유형에서 Object에 상응하는 것으로 또는 그 반대로 자동변환이다. 예를 들어 메소드 호출에 Integer가 필요하여 int로 호출한다면 컴파일러는 적절한 유형이 이 메소드로 전달될 수 있도록 필요한 변환을 수행한다:
Listing 5. autoboxing
 public class BoxingTest {
   public static void main(String args[]) {
     test1(1);
     test2(new Integer(2));
   }
   private static void test1(Integer i) {
     System.out.println("test1: " + i);
   }
   private static void test2(int i) {
     System.out.println("test2: " + i);
   }
 }


향상된 for 루프
generics 외에도 Tiger의 가장 재미있는 기능은 for 루프의 향상이다. 사전 사후 조건을 주기위해 for 루프 구조체 내에 두 개의 세미콜론이 더이상 필요하지 않다. 대신 콜론을 사용하여 어레이나 Collection에 각 엘리먼트를 위해 루핑 할 for-each 구조체를 갖게된다:
Listing 6. for 루프
 public class ForEach {
   enum Color { red, green, blue };

   public static void printf(String fmt, Object... args) {
     int i = 0;
     for (char c : fmt.toCharArray()) {
       if (c == '%') {
         System.out.print(args[i++]);
       } else if (c == '\n') {
         System.out.println();
       } else {
         System.out.print(c);
       }
     }
   }
   public static void main(String args[]) {
     printf("Addition: % plus % equals %\n", 1, 1, 2);
     printf("Colors are %\n", Color.VALUES);
     for (Color aColor : Color.VALUES) {
       switch(aColor) {
         case Color.red:
           System.out.println("Got red.");
           break;
         case Color.green:
           System.out.println("Got green.");
           break;
         case Color.blue:
           System.out.println("Got blue.");
           break;
       }
     }
   }
 }


정적 반입
import 키워드 뒤에 static 단어를 추가함으로서 반입을 정적 반입으로 변경한다. 반입이 정적이면 모든 접근 가능한 메소드와 변수들은 접두사를 붙이지 않고 사용될 수 있다:
Listing 7. static imports
 import static java.awt.Color.*;

 public class ImportTest {
   public static void main(String args[]) {
     System.out.println(RED);
   }
 }


클래스용 상수를 정의하기 위해 만드는 인터페이스의 불필요한 구현을 피할 수 있다는 것이 또 다른 이유이다.

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...