자바 설계 결함

taehee kim·2022년 9월 28일
1
post-custom-banner

자바의 설계결함

  • 평소 생각없이 써왔으나 조사 할 일이 있어서 주언어인 자바의 설계 결함과 한계에 대해서 알아보게 되었습니다.
  • 제가 잘 이해하고 필요로 하는 내용들에 대해서 정리했기 때문에 더 상세한 내용이 필요하신 분들은 다음링크로 가셔서 보시면 될 것 같습니다.
    출처: https://en.wikipedia.org/wiki/Criticism_of_Java#cite_note-29

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가 클래스와 다르게 취급됨.

  • 다른 클래스들과 다르게 원시값과 배열은 다른 방식의 문법이 활용되는데 언어를 익히거나 활용하는 점에서 비효율을 생성한다.
profile
Fail Fast
post-custom-banner

0개의 댓글