Java 언어는 SUN이 배포하는 Java 2 Platform, Standard Edition 1.5 (이하 J2SE 1.5)에서 스팩에 큰 수정이 더해질 예정이다.
그 내용은 SUN의 수석 엔지니어 Dr. Joshua Bloch가 페이지(여기)를 통해서 공개하고 있다.
J2SE 1.5 그리고 Java 언어 스팩에 추가될 예정의 기능은 크게 아래 6가지로 요약할 수 있다.
1. Generics
2. Enhanced for loop
3. Autoboxing/unboxing
4. Typesafe enums
5. Static import
6. Metadata
다만, 스팩은 아직 결정된 것이 아니기 때문에, 아직 변경될 가능성이 있다.
1. Generics
벌써 예고된 것처럼 C++의 template과 같은 generic type이 언어 스팩에 추가된다.
종래의 JDK 라이브러리에서는 java.util.List나 java.util.Map등의 컨테이너 클래스는 모든 오브젝트를 base class Object로서 취급해 왔다. 즉, 컨테이너에는 어떤 종류의 오브젝트에서도 격납하는 것이 가능했다.
List words = new ArrayList();
words.add(word);
String title = ((String) words.get(i)).toUppercase();
그러나, 유저는 String 클래스를 다루는 컨테이너와 같이, 특정 Type에 특화한 컨테이너가 필요한 경우가 많다. 종래의 컨테이너 클래스에서는 잘못된 Type의 element를 삽입하는 것을 막을 수가 없었다.
Generic type을 이용하면 다음과 같이 컨테이너 클래스를 특화할 수 있다.
List words = new ArrayList();
words.add(word);
String title = words.get(i).toUppercase();
이 기능을 사용하면 특정 클래스(이 예에서는 String 클래스)에 특화한 컨테이너를 작성할 수 있다. 이 컨테이너에 element를 삽입하거나 꺼내는 경우, 컴파일러에 의해 element의 Type 체크가 들어간다. 그 결과, 컨테이너 클래스의 의미가 명확하게 되어, Type 체크에 의해 안전성이 향상되며 실행시의 에러를 감소시킬 수가 있다.
Java의 Generic type은 C++ 의 template과 달리, 특화한 클래스 마다의 실체는 생성하지 않는다.
Java의 원시 코드를 컴파일 하면, List는 종래의 List 컨테이너에 치환된 아르바이트 코드가 되어 출력된다.
그리고, J2SE1.5의 generic type은 primitive Type에 특화( List 등)는 할 수 없는 것 같다.
2. Enhanced for Loop
Java 언어에서는 Collection이나 Array의 내용을 모두 열거하기 위해서 for구문이 이용된다.
이런 Collection에서 element를 꺼내기 위해서 , Perl이 C# 언어는 foreach 구문을 가지고 있다. J2SE 1.5부터 for에 foreach와 같은 기능을 구현하는 구문이 추가되었다.
위의 Java 프로그램을 새로운 구문으로 고쳐 쓰면 아래와 같이 된다.
generic type의 컨테이너 뿐만이 아니라 , 종래의 Collection클래스나 Array형도 이 새로운 구문을 사용하는 것이 가능하다.
Array의 경우는
위의 표현을 아래와 같이 고쳐 쓸 수가 있다.
또 enum Type의 스팩이 확장되어, 아래와 같은 표현도 가능하게 되었다. enum Day {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
for (Day d : Day.VALUES){
// Body ...
}
참고: Enhanced for loop 의 것 JSR
3. Autoboxing / unboxing
boxing과 unboxing을 사용할 수 있게 되었다.
브라보!
종래의 Java 언어에서는 primitive Type의 변수를 오브젝트로 사용하고 싶은 경우에는 래퍼 클래스의 인스턴스에 변환시킬 필요가 있었다.
예를 들면 int Type의 래퍼 클래스는 java.lang.Integer클래스이다.
int Type을 Integer 클래스로 변환해서 다시 역변환을 해야 하는데 아래와 같이 코드를 작성해야 했다.
int i1 = ... ;
Integer I1 = new Integer( i1 );
int i2 = I1.intValue();
이것을 아래와 같이 처리할 수 있다. Integer I1 = (Integer) i1;
int i2 = (int) I1;
이것은 분명 C#의 영향이라고 생각할 수 있다.
참고: Autoboxing / Unboxing 의 JSR
4. Typesafe Enums
enum Type이 큰폭으로 확장되었다. 요약해서 소개한다.
클래스와 같이 정의 enum은 단순한 정수의 나열이 아니라 클래스도 함께 정의할 수 있다.
enum의 element는 hashCode를 가지고 있고 서로 비교 가능해서 (String)Coin.penny == "penny" 처럼 사용할 수 있다.
* VALUES, family(), valueOf()
각 enum 형은 아래와 같은 메소드와 필드가 자동적으로 생성되게 되었다.
public static List VALUES;
public final List family();
public staticvalueOf(String name);
이 기능은 확장된 for 구문과 함께 사용하면 편리한데, 아래와 같이 쓸 수 있다.
valueOf()를 이용하면 Day.Sunday == Day.valueOf( "Sunday" ) 와 같은 비교도 가능하게 된다.
* Behavior 정의
아래와 같이 enum의 하나씩에 static 메소드를 할당할 수가 있어 eval 메소드를 사용하는 것으로 다태성이 있는 메소드 호출을 실현될 수 있는 것 같다.
이외의 기능도 다수 추가되고 있다.
참고: Typesafe Enums 가 JSR
5. Static Import
클래스에 다른 클래스나 인터페이스 static 메소드나 필드를 넣을 수 있도록 static import 기능이 추가되었다.
Java는 C/C++ 과 같이 매크로를 사용할 수 없기 때문에 , 정수의 집합을 인클루드할 경우, 아래와 같은 테크닉을 사용해야 했다.
이 implements는 개념적으로는 인터페이스를 상속한 것이 아니고, Guacamole 클래스 공간에 정수 집합을 넣기 위한 것이다. 이것은 interface의 본래의 개념에서 빗나가고 있어 바람직하지 않다.
이런 개념이 새롭게 정의되어 static import를 사용하면 아래와 같이 쓸 수 있게 된다.
그리고 Math 클래스를 static import 하면, Math.abs(x),Math.sqrt(x) 라고 쓰고 있던 코드가 abs(x),sqrt(x) 라고 쓸 수 있게 된 것이다.
참고: Static Import 의 JSR
6. Metadata
draft가 공개되어 있지 않기 때문에 개념을 잡을 수 없지만, 각종 툴이 Java의 원시 코드를 잘 취급할 수 있도록 하기 위한 기능 같다.
예를 들면 metadata를 파묻힌 아래와 같은 소스가 있는 경우,
이것을 툴이 해석해서 아래와 같은 코드를 생성할 수 있게 한 것 같다.
그 내용은 SUN의 수석 엔지니어 Dr. Joshua Bloch가 페이지(여기)를 통해서 공개하고 있다.
J2SE 1.5 그리고 Java 언어 스팩에 추가될 예정의 기능은 크게 아래 6가지로 요약할 수 있다.
1. Generics
2. Enhanced for loop
3. Autoboxing/unboxing
4. Typesafe enums
5. Static import
6. Metadata
다만, 스팩은 아직 결정된 것이 아니기 때문에, 아직 변경될 가능성이 있다.
1. Generics
벌써 예고된 것처럼 C++의 template과 같은 generic type이 언어 스팩에 추가된다.
종래의 JDK 라이브러리에서는 java.util.List나 java.util.Map등의 컨테이너 클래스는 모든 오브젝트를 base class Object로서 취급해 왔다. 즉, 컨테이너에는 어떤 종류의 오브젝트에서도 격납하는 것이 가능했다.
List words = new ArrayList();
words.add(word);
String title = ((String) words.get(i)).toUppercase();
그러나, 유저는 String 클래스를 다루는 컨테이너와 같이, 특정 Type에 특화한 컨테이너가 필요한 경우가 많다. 종래의 컨테이너 클래스에서는 잘못된 Type의 element를 삽입하는 것을 막을 수가 없었다.
Generic type을 이용하면 다음과 같이 컨테이너 클래스를 특화할 수 있다.
List
words.add(word);
String title = words.get(i).toUppercase();
이 기능을 사용하면 특정 클래스(이 예에서는 String 클래스)에 특화한 컨테이너를 작성할 수 있다. 이 컨테이너에 element를 삽입하거나 꺼내는 경우, 컴파일러에 의해 element의 Type 체크가 들어간다. 그 결과, 컨테이너 클래스의 의미가 명확하게 되어, Type 체크에 의해 안전성이 향상되며 실행시의 에러를 감소시킬 수가 있다.
Java의 Generic type은 C++ 의 template과 달리, 특화한 클래스 마다의 실체는 생성하지 않는다.
Java의 원시 코드를 컴파일 하면, List
그리고, J2SE1.5의 generic type은 primitive Type에 특화( List
2. Enhanced for Loop
Java 언어에서는 Collection이나 Array의 내용을 모두 열거하기 위해서 for구문이 이용된다.
for (Iterator; i = c.iterator(); i.hasNext(); ) {
String s = i.next();
// Body
}
이런 Collection에서 element를 꺼내기 위해서 , Perl이 C# 언어는 foreach 구문을 가지고 있다. J2SE 1.5부터 for에 foreach와 같은 기능을 구현하는 구문이 추가되었다.
위의 Java 프로그램을 새로운 구문으로 고쳐 쓰면 아래와 같이 된다.
for (String s : c ) {
// Body
}
generic type의 컨테이너 뿐만이 아니라 , 종래의 Collection클래스나 Array형도 이 새로운 구문을 사용하는 것이 가능하다.
Array의 경우는
int sum = 0;
for( int i=0 ; i
int e = a[i];
sum += e;
}
위의 표현을 아래와 같이 고쳐 쓸 수가 있다.
int sum = 0;
for( int e : a ){
sum += e;
}
또 enum Type의 스팩이 확장되어, 아래와 같은 표현도 가능하게 되었다. enum Day {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
for (Day d : Day.VALUES){
// Body ...
}
참고: Enhanced for loop 의 것 JSR
3. Autoboxing / unboxing
boxing과 unboxing을 사용할 수 있게 되었다.
브라보!
종래의 Java 언어에서는 primitive Type의 변수를 오브젝트로 사용하고 싶은 경우에는 래퍼 클래스의 인스턴스에 변환시킬 필요가 있었다.
예를 들면 int Type의 래퍼 클래스는 java.lang.Integer클래스이다.
int Type을 Integer 클래스로 변환해서 다시 역변환을 해야 하는데 아래와 같이 코드를 작성해야 했다.
int i1 = ... ;
Integer I1 = new Integer( i1 );
int i2 = I1.intValue();
이것을 아래와 같이 처리할 수 있다. Integer I1 = (Integer) i1;
int i2 = (int) I1;
이것은 분명 C#의 영향이라고 생각할 수 있다.
참고: Autoboxing / Unboxing 의 JSR
4. Typesafe Enums
enum Type이 큰폭으로 확장되었다. 요약해서 소개한다.
클래스와 같이 정의 enum은 단순한 정수의 나열이 아니라 클래스도 함께 정의할 수 있다.
public enum Coin {
penny(1), nickel(5), dime(10), quarter(25);
Coin(int value) { this.value = value; }
private final int value;
public int value() { return value; }
}
enum의 element는 hashCode를 가지고 있고 서로 비교 가능해서 (String)Coin.penny == "penny" 처럼 사용할 수 있다.
* VALUES, family(), valueOf()
각 enum 형은 아래와 같은 메소드와 필드가 자동적으로 생성되게 되었다.
public static List
public final List
public static
이 기능은 확장된 for 구문과 함께 사용하면 편리한데, 아래와 같이 쓸 수 있다.
enum Day {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
for (Day d : Day.VALUES){
// Body ...
}
valueOf()를 이용하면 Day.Sunday == Day.valueOf( "Sunday" ) 와 같은 비교도 가능하게 된다.
* Behavior 정의
아래와 같이 enum의 하나씩에 static 메소드를 할당할 수가 있어 eval 메소드를 사용하는 것으로 다태성이 있는 메소드 호출을 실현될 수 있는 것 같다.
public abstract enum Operation {
plus {
double eval(double x, double y) { return x + y; }
}
minus {
double eval(double x, double y) { return x - y; }
}
// Perform arithmetic operation represented by this constant
abstract double eval(double x, double y);
public static void main(String args[]) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
for (Iterator i = VALUES.iterator(); i.hasNext(); ) {
Operation op = i.next();
System.out.println(x + " " + op + " " + y + " = " + op.eval(x, y));
}
}
}
java Operation 2.0 4.0
2.0 plus 4.0 = 6.0
2.0 minus 4.0 = -2.0
이외의 기능도 다수 추가되고 있다.
참고: Typesafe Enums 가 JSR
5. Static Import
클래스에 다른 클래스나 인터페이스 static 메소드나 필드를 넣을 수 있도록 static import 기능이 추가되었다.
Java는 C/C++ 과 같이 매크로를 사용할 수 없기 때문에 , 정수의 집합을 인클루드할 경우, 아래와 같은 테크닉을 사용해야 했다.
public interface Physics {
public static final double AVOGADROS_NUMBER = 6.02214199e23;
public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
public static final double ELECTRON_MASS = 9.10938188e-31;
}
public class Guacamole implements Physics {
public static void main(String[] args) {
double moles = ...;
double molecules = AVOGADROS_NUMBER * moles;
...
}
}
이 implements는 개념적으로는 인터페이스를 상속한 것이 아니고, Guacamole 클래스 공간에 정수 집합을 넣기 위한 것이다. 이것은 interface의 본래의 개념에서 빗나가고 있어 바람직하지 않다.
이런 개념이 새롭게 정의되어 static import를 사용하면 아래와 같이 쓸 수 있게 된다.
import static org.iso.Physics.*;
class Guacamole {
public static void main(String[] args) {
double molecules = AVOGADROS_NUMBER * moles;
...
}
}
그리고 Math 클래스를 static import 하면, Math.abs(x),Math.sqrt(x) 라고 쓰고 있던 코드가 abs(x),sqrt(x) 라고 쓸 수 있게 된 것이다.
참고: Static Import 의 JSR
6. Metadata
draft가 공개되어 있지 않기 때문에 개념을 잡을 수 없지만, 각종 툴이 Java의 원시 코드를 잘 취급할 수 있도록 하기 위한 기능 같다.
예를 들면 metadata를 파묻힌 아래와 같은 소스가 있는 경우,
import javax.xml.rpc.*;
public class CoffeeOrder {
@Remote public Coffee [] getPriceList() {
...
}
@Remote public String orderCoffee(String name, int quantity) {
...
}
}
이것을 툴이 해석해서 아래와 같은 코드를 생성할 수 있게 한 것 같다.
public interface CoffeeOrderIF extends java.rmi.Remote {
public Coffee [] getPriceList()
throws java.rmi.RemoteException;
public String orderCoffee(String name, int quantity)
throws java.rmi.RemoteException;
}
public class CoffeeOrderImpl implements CoffeeOrderIF {
public Coffee [] getPriceList() {
...
}
public String orderCoffee(String name, int quantity) {
...
}
}