Bitaholic

Reasons to Migrate to J2SE 5.0 (Tiger) (Language Features) 본문

Computer/Java

Reasons to Migrate to J2SE 5.0 (Tiger) (Language Features)

Bitaholic 2006. 10. 2. 21:14

출처 :Reasons to Migrate to J2SE 5.0(Tiger)

 

1.4를 이용해서 개발을 해왔었는데 이제 1.5, 1.6을 써야 해서 한번 정리를 해볼라고 한다~

 

1. JDSE1.5에서 추가된 점

Laguage Features

 A. generics

 B. an enhanced for-loop

 C. autoboxing and unboxing

 D. typesafe enums

 E. variable arguments

 F. static imports

 G. annotations

==============================================================================

 

A. generics

 

  : 컴파일타임에 타입체크를 할수 있게 해주는 feature

예를 들면 1.4에서

 

void run() {
        List customerList = getCustomerList();
        sendEmailTo(customerList);
}
    
private void sendEmailTo(List list) {
       Iterator i = list.iterator();

        while(i.hasNext()) {
            Customer c = (Customer) i.next();
            sendEmailTo(c);
        }
}

 

이와 같이 구현했다고 가정하자. 이것은 List에 어떤 interface(또는 class)의 item이 들어가 있는지 모른다. 즉 (Customer)로 캐스팅 할때 castException이 발생 시킬수 있다.

 

5.0에서 generic을 사용하면 아래와 같이 명시적으로 list의 item type을 명시할 수 있다.

 void run() {
        List<Customer> customerList = getCustomerList();
        sendEmailTo(customerList);
  }
    
  private void sendEmailTo(List<Customer> list) {
        Iterator<Customer> i = list.iterator();

        while(i.hasNext()) {
            Customer c = i.next();
            sendEmailTo(c);
        }
  }

이와 같이 genric을 사용하면 명시적인 casting을 쓸 필요 없을 뿐 아니라, 컴파일타임에 타입검사도 해준다. 뿐만 아니라 문서화 효과까지 있다. 다른 개발자나, 나중에 다시 코드를 보더라도, collection에 어떤 타입의 item이 들어있는지 찾아보지 않아도 코드에 나와 있다. ^^

 

B. Enhanced For-Loop

 : collection을 이용한 for loop를 이용할 때, iteration을 이용하지 않고,에러 발생할 확률이 더 적은  새로운 for loop

위의 예제의 while loop 문을 아래와 같이 작성할 수 있다.

 private void sendEmailTo(List<Customer> list) {
        for(Customer c: list) {
            sendEmailTo(c);
        }
    }

즉 list에 있는 item을 Custom인스턴스인 c에  차례로 받아서 for loop문과 같이 돈다라는 뜻이다.

 

C. Autoboxing

 : primititype을 object로 수작업으로  변환을 해야 할 경우가 있다. 예를 들어 List에 int를 넣을 경우, 넣을때는 int를 Integer로 변환(pacakage, box)을 해야 하고, List에서 꺼내서 쓸경우는 Integer를 int로 unpackage(unbox)을 해야 한다. J2SE 5.0에서는 이런 작업을 자동으로 해준다.

 

아래의 예는 1.4이다. List를 이용하는데 Integer를 Item으로 담는다. int를 object로 수작업으로 해줘야 할 필요가 있다.

 // create the list of integers
 List listOfInts = new ArrayList();
  for (int i = 0; i < MAX_INT; ++i) {
      Integer aNumber = new Integer(i);
       listOfInts.add(aNumber);
  }

 // retrieve the list of integers and print the sum
   Iterator iterator = listOfInts.iterator();
   int total = 0;
   while(iterator.hasNext()) {
       Integer aNumber = (Integer)iterator.next();
       total = total + aNumber.intValue();
   }
   Integer theTotal = new Integer(total);
   System.out.printf("Total: %d\n", theTotal);

 

그러나 5.0에서는 generic과 autoboxing을 쓰면 아래와 같이 코드가 간결해진다.

// create the list of integers
List<Integer> listOfInts = new ArrayList<Integer>();
for (int i = 0; i < MAX_INT; ++i) {
listOfInts.add(i);// autoboxing here
}
// retrieve the list of integers and print the sum
int total = 0;
for(Integer i: listOfInts) {
total += i;// unboxing here
}
System.out.printf("Total: %d\n", total); //autoboxing here
generic을 Integer라고 쓰면 코드에서 Integer->int, int->Integer변환을 해줄 필요가 없다.
D. Enumerations

C, C++ 에 있는 enumerations와 같은 기능 드디어, 자바에도 추가되다. 1.5이전에 typesafe한 enum을 구현하기 위해 enum desing pattern을 구현해서 enumeration을 사용하였으나, 1.5에서는 language차원에서 enumerations를 지원한다.

사용 예를 보면

 

public enum Size {
            SMALL,
            MEDIUM,
            LARGE,
            XLARGE
}

Size shirtSize = Size.LARGE; //but never 47


 

이와 같이 사용된다. 이제 shirtSize에 47가 같은 의미 없는 값이 들어가는 것을 compile time, run time에서도 체크 할수 있다. 1.4이전에는 static value를 이용하였다.

 

E. Varargs

MessageFormat같은 인자의 수가 가변적인, 즉 인자의 수가 정해지지 않은 메소드는 인자를 Object 배열로 넘겨야 한다.

그러나 1.5에서는 Varargs라는 개념이 추가되어 배열이 아닌 각각 차례대로 인자를 전달 하면 된다. (음 정확히 무엇을 의미하는지 잘모르겟다 더 조사해봐야지)

 

예를 보면 1.5이전에는

 

        Object[] args = new Object[] {new Date(), 5, "Mars"};
        String pattern = "At {0, time, short} on {0, date, short}, we saw {1, number,
                         integer} " + "ships on the planet {2}.";
        String msg = MessageFormat.format(pattern, args);

 

위와 같이 args배열을 만들어 MessageFormat.format에 넘겼지만

1.5 에서는

 

    Date time = new Date()

    int count = 5;

    String planet = "Mars"

 

    String pattern = "At {0, time, short} on {0, date, short}, we saw {1, number,

                              integer} " + "ships on the planet {2}.";

    String msg = MessageFormat.format{pattern, time, count, planet};

이렇게 가변적인 변수를 배열이 아닌 개별로 넣어주면 된다.(이게 맞나? 정확하지는 않다)
이와같이 됨으로써 큰 메소드같은경우 array에 무엇이 들어가는 지 명확하게 알수 있다.
F. Static Imports
Static Method, value를 클래스 이름을 안쓰고 쓸수 있게 한 feature
아래와 같이 Math.tan(45.0)처럼 클래스이름.메소드 이름을 써야 했던 static메소드(또는
static 상수)를
double x = Math.tan(45.0); double y = Math.pow(3.0, 2.0);
1.5에서는 static을 import함으로 써
import static java.lang.Math.*; ... double x = tan(45.0); double y = pow(3.0, 2.0);
이렇게 쓸수 있다.
F. Annotations
comment나 java-doc과는 틀리게 run-time에 접근할수 있는 정보이다. 그리고 이 정보는
컴파일된 코드에 들어가 있다. (어떻게 쓰는거지?)
Comments