자바(Java)의 장점과 단점

Posted 2008/03/09 02:00

  작년에 어떤 회사에서 면접을 보러온 학생에게 자바의 장단점을 물어봤다고 한다. 갑자기 그런말을 들으니 자바의 장단점이 궁금해졌고 생각해 보는 시간을 갖었다. 자바를 좋아하고 자바를 사용해서 프로그래밍 경진대회도 출전했었고 프로젝트에도 참여해 본 학생으로써 지금까지 진지하게 자바의 장단점을 생각해본적이 없다고 생각하니 나름 부끄럽기도 하다.

  이 글을 읽을 다른 사람들에게 먼저 물어보고 싶다. "어떤것이 바로 떠오르나요"

  질문을 들은 순간 바로 떠오른 특징들은 다음과 같다.

" Write once, Run anyware. "
  - 누구나 위의 말이 가장 먼저 떠오를 것이다. 위의 특징은 자바의 장점이기도 하고 단점이기도 하다. 장점으로 생각해 본다면 한번 작성한 프로그램은 JVM이 존재하는 어떤 OS안에서도 똑같이 동작한다. 그러므로 한번 작성한 프로그램은 플랫폼이 변경되더라도 수정 없이 바로 사용할 수 있다. 단점으로 생각해 본다면 OS의 System API를 바로 사용하지 않고 JVM을 통해서 사용하므로 System API를 바로 사용하는 프로그램 언어와 비교했을 때 속도가 느리다. 즉, 최적화된 프로그램을 작성하더라도 다른 언어로 짠 프로그램보다 느리다는 의미이다.


" Garbage Collection "
  - Garbage Collection은 Java만이 갖고 있는 아주 뛰어난 장점이다. 프로그램을 작성하는 프로그래머는 Memory Leak 걱정없이 마음대로 heap 메모리를 사용할 수 있고 마음대로 버릴 수 있다. c처럼 delete를 잘못 사용해서 메모리 leak을 발생시킬 일이 전혀 없다는 의미이다. 이는 프로그래머가 편하게 속 시원하게 프로그램을 작성할 수 있게 해준다.
 

" 다양한 API와 오픈소스 "
  - Java는 지원하는 API가 굉장히 많다. 일반적인 Application을 위한 J2SE JDK, Enterprise 프로그램을 위한 J2EE JDK, 모바일 프로그램을 위한 J2ME JDK, 그리고 Apache 등 여러 Open Source그룹에서 제공하는 다양한 Open Source들. 이는 굉장히 고 수준으로 구현되어 있기 때문에 소히 말해서 사용자가 맨땅에 해딩해야만 하는 구현이 줄어든다. 상황에 맞게 고 수준의 API를 마음껏 사용할 수 있고 이는 소프트웨어 재사용성 및 생산성을 증가시킨다. 효율적인 프로그램의 재사용성은 소프트웨어의 품질을 증가시키고 생산성의 향상은 개발시간을 단축시킨다.


" 개발자 임의의 포인터 연산 불가능 "
  - Java에서 개발자가 임의로 포인터 연산을 할 수 없는것은 장점일까?? 단점일까?? 내가 생각하기에는 장점이기도 하고 단점이다. 임의로 포인터를 사용할 수 없기 때문에 저수준의 메모리를 건드릴 수 없으며 잘못된 시스템 메모리를 참조할 걱정을 덜게된다. 이는 사용자가 걱정없이 프로그래밍을 할 수 있게 해주므로 묵시적으로 생산성 및 안전성을 향상시킨다.



" 구현과 Interface의 분리 "
  - C++은 구현과 Interface가 분리되어있지 않다. Interface type이 별게로 존재하지 않다는 의미이다. Bridge 패턴의 경우 C++의 이러한 단점을 보완하기 위하여 구현과 Interface를 독립시키도록 하는 패턴이다. 프로그램의 재사용성을 위해 상속을 사용하면 프로그램이 커질수록 구현의 상속과 Interface의 상속이 짬뽕되 계층도가 깊어지고 넓어진다. 또한 Interface의 장점은 여러 프로젝트 구성원간에 규약을 정하고 구현 없이 인터페이스만 갖고 미리 프로그래밍 할 수 있다는 것이다. 인터페이스 타입만 정해놓으면 컴파일이 가능하다. 그러므로 업무를 분담해서 내 부분만 나눠서 프로그래밍 하고 컴파일해 보고 테스트 해볼 수 있다. 또한 다형성도 적용할 수 있다.


  여기까지가 질문을 받았을 때 바로 생각한 장단점이다. 생각한 후에 너무 일반적인 답변만 한 것 같아서 몇일 더 고민해보았다. 기회가 있다면 자바를 좋아하는 사람들이 자바에대해 생각하고 느꼇던 장단점을 토론하는 시간을 갖고싶다.

  다음은 몇일동안 고민해보고 생각한 자바의 장단점이다.


" 예약어 overriding 불가 "
  - Java에서는 예약어를 overriding할 수 없다. 예를들어 a[]는 배열의 인덱스로만 사용할 수 있지 다른용도로 사용하게끔 재정의할 수 없다. *는 유리수의 곱셈으로만 사용할 수 있지 다른 용도로 재정의 할 수 없다. 이는 그 어떤사람이 작성한 프로그램이라도 정해진 규칙에 의해서만 작성되었으므로 해석하기가 쉽다. 하지만 역시 c++에서 재공하는 연산자 재정의를 할수 없으므로 소스코드를 목적에 따라 간결하게 유지할 수 없다.


" 타입에 엄격 "
  - Java는 타입에 대해서 엄격하다. boolean은 오로지 true와 false이고 Number type과 호환이 되지 않는다. 예를들어 c++에서는 1 이상의 숫자는 boolean의 true로 인정해주고 0 이하의 숫자는 false로 인정해준다. 이와같이 c++은 type간에 암시적은 형변환이 발생하지만 Java는 항상 명시적으로 형변환을 명시해줘야 한다.



" Simple "
  - Java는 프로그래밍에 꼭 필요한 예약어만 지원한다. 별도의 헤더파일에 선언부분을 정의할 필요도 없으며 전처리기가 수행할 매크로를 작성할 필요도 없다. inline 함수와 같은 기능도 제공하지 않는다. 위에서 얘기했지만 예약어 overriding도 할 수 없다. 한마디로 얘기해서 Java Specification에 명시된 예약어로만 프로그래밍 할 수 있으므로 단순하고 사용하기 쉬우며 생각하지 못한 구문상의 오류가 발생할 확률이 적다.


" 컴파일러에서 최대한 많은 오류를 잡는다 "
  - 위에서 명시한 말은 무슨 뜻일까? 예를들어 설명하자면 Java의 Exception은 Checked exception과 Unchecked exception이 있다. Checked exception은 사용자가 반드시 try catch를 명시하도록 compiler가 강제하는 exception으로써 File 입출력을 할 경우 발생하는 Exception들은 Checked Exception으로써 반드시 try catch블락으로 선언해줘야 한다. 선언하지 않을경우 Compile 자체가 안된다. 이는 최대한 Runtime에 오류를 발생시키지 않도록 Compiler수준에서 강제하는 행위로써 Java만의 특징이다.


이 밖에도 다중상속 불가 등.. 여러가지 특징이 존재할 것이다. 아는 수준까지 짜내고 짜내서 적어봤는데 후에 다른 특징들도 생각이 나면 추가적으로 적도록 하겠다.

« PREV : 1 : ... 96 : 97 : 98 : 99 : 100 : 101 : 102 : 103 : 104 : ... 248 : NEXT »