자바의 설계결함
1. Generics의 타입을 Runtime에 활용할 수 없다.
제네릭이란?
- 자바의 제네릭이란 클래스와 함수등에 type을 마치 매개변수 값처럼 넣어 줌으로서 컴파일 타임에 미리 타입오류를 검출 할 수 있도록 하는 개념이다.
자바 제네릭의 한계
- 제네릭을 활용해 컴파일 타임에 타입 체크를 하고 나면 제네릭 인자로 넘겨져 온 타입은 Type erasure라는 절차를 통해 제거된다.
- 따라서 인자로 넘겨진 타입은 Runtime에서는 활용 될 수 없다.
ArrayList<Integer> li = new ArrayList<Integer>();
ArrayList<Float> lf = new ArrayList<Float>();
if (li.getClass() == lf.getClass()) { // evaluates to true
System.out.println("Equal");
}
- 위와 같은 코드는 제네릭 타입인자 값이 다르지만 같은 클래스로 인정된다. runtime에는 타입이 지워지기 때문이다.
public class MyClass<E> {
public static void myMethod(Object item) {
if (item instanceof E) { //Compiler error
...
}
E item2 = new E(); //Compiler error
E[] iArray = new E[10]; //Compiler error
}
}
- 또한 다음과 같은 코드에서 instanceof, new등의 연산자를 활용할 수 없는 이유도 Type erasure때문이다.
2. Unsigned integer types가 없다.
- 자바에는 기본적으로 c, c++등에서 존재하는 unsigned 자료형이 존재하지 않는다.
- 암호학과 같이 매우 큰 양의 정수를 활용해 다양한 처리를 하는 분야에서 사용하기에 부적합할 수 있다.
- 2의 보수 표현이나 비트관점에서의 표현을 잘 이해하고 사용하려는 노력을 기울인다면 해결할 수 있는 문제이기는 하지만 개발할 때의 추가적인 노력이 필요하다.
3. Operator overloading을 할 수 없다.
- 자바에서는 연산자 오버로딩을 허용하지 않는다.(예외적으로 String 의 +, += 연산자만이 유일하게존재한다.)
- 수학적인 내용의 객체들에 대해서 가독성을 떨어뜨리고 활용하는데에 불편한 점이 있다.
4. 배열 크기가 2^31으로 제한된다.
- 메모리등의 문제가 아니라 배열자체의 크기를 int자료형으로 정의하기로 되어있기 때문에 2^31보다 큰 배열은 정의할 수 없다.
5. primitives type과 Array가 클래스와 다르게 취급됨.
- 다른 클래스들과 다르게 원시값과 배열은 다른 방식의 문법이 활용되는데 언어를 익히거나 활용하는 점에서 비효율을 생성한다.