ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바에 대한 생각.
    프로그래밍/개인적인 생각들. 2017. 6. 29. 03:37

    필자는 자바를 그리 좋아하지 않는 편이다.

    뭐.. 개인적인 취향이니 블로그에 방문해주는 분들이 이해해주시기를 바람.


    자바를 선호하지 않는 이유를 몇 가지 대자면


    단점.

    1. 구문이 너무 길다.

    표준 출력에 해당되는 것만 보아도 알 수 있다.
    C의 경우는

    printf("Hello, World!");

    면 끝날 내용을

    System.out.println("Hello, World!");
    

    라고 하는 것을 보면 속이 터진다.


    그리고 메소드들을 만들 때 접근지정자를 앞에 다 명시해줘야 되며 import문도 지나치게 길다..

    굳이 슈퍼클래스까지 모두 표시를 해야하는 이유가 뭘까.


    이렇게 구문이 기므로 당연히 코딩 스타일은 한 컬럼(Column)이라도 줄이기 위해 가독성이 별로인 낙타 표기법을 사용하는 것이 아닌가 싶다. 스네이크는 abc_def로 단어 간 구분하기가 직관적이어서 쉽지만, 낙타는 abcDef로 단어간 구분하기가 어려운 대신 칸 수를 아껴준다.


    2. 클래스 안에 모든 것을 우겨넣는다.

    1번과 이어지는 내용인데,

    구문이 긴 것과 마찬가지로 미관상(?) 좋지 않다.
    가독성이 나쁘다는 것.


    C++도 클래스 단위로 만든다지만, 클래스에 정의를 선언하고 구현 부분은 따로 만들 수 있다.
    클래스 안에 모든 것을 구현하는 방식은 비직관적이고, 분석하는데 시간이 너무 많이 걸린다.


    3. 제약이 많다.

    public class는 반드시 파일 이름이어야 하며, Generic은 C++의 템플릿에 비하면 형편없다.(람다식도 마찬가지.)

    그리고 그놈의 try-catch를 요구하는 함수들은 왜 그리 많은지..


    try-catch는 이리저리 왔다갔다 한다는 것에서 현대의 go-to문이라 할만하며 코드를 한단 안에 넣게 하므로 가독성에 지장을 준다.(또!!)


    try-catch와 import의 괴랄함은 자바의 IDE 사용을 강제한다.


    4. 성능문제와 지나치게 많은 객체할당

    - 성능

    자바는 가상머신 위에서 언어가 실행이 되고, GC가 있기 때문에 성능이 떨어진다.

    실행환경 자체의 한계로 성능에 신경을 쓰는 사람들에게 좋은 평가를 받기는 어려울 것이라 본다.


    다만 가상머신이 있기에 다양한 플랫폼에 쉽게 대응할 수 있고, GC 때문에 프로그래머의 생산성을 올려주기에 성능이 약간 떨어지게 되어도 Trade Off라 생각할 수 있다. 멀티플랫폼과 생산성의 이점을 생각해보면  포인터가 없어서 C, C++에서는 구현이 가능한 부분이 자바로는 불가능하다는 점도 충분히 상쇄가 가능하다.



    - 지나친 객체할당

    과도하게 객체할당을 한다는 것이 마음에 들지 않는다.


    일단, 객체를 할당하면 오버헤드가 생기게 된다.

    위에서 GC에 대한 입장과 반대되는 것처럼 보일지는 모르지만 성능을 극도로 민감하게 받아들이지는 않겠다는 의미지, 결코 신경을 쓰지 않겠다는 의미는 아니다. 1~2개가 아니라 왠만한 것들을 다 객체로 할당하다 생각해보자. 성능이 떨어지게 되는 것은 필연적이다.


    객체로 할당하여 사용하면 추론을 하기가 쉽고 재사용성이 증가하기는 하지만 저는 성능을 어느정도 고려하기 때문에 자바를 꺼리게 되는 원인으로 작용하기도 합니다. 현재 C++을 공부하는 주요 이유 중에는 성능은 무조건 포함될 테니까요.(C++ 언어 철학은 Zero Cost를 지향함.)


    또한 C++ STL과 비슷한 자바의 컬렉션의 경우 int->Integer, float->Float와 같은 식으로 Wrapping된 자료형을 사용해야 하는데 오버헤드가 생기는 것은 물론 일관성에서 떨어지는 것 같다.


    또한 객체할당을 하는 코드는 가독성이 좀 떨어지는 편이니..(new를 사용하기 때문.)


    5. NullPointerExeption

    자바를 사용하다 보면 한번 쯤 보는 오류이다.

    포인터를 사용하지도 못하는데 NullPointerExeption이 많이 나온다는 것은 언어를 잘못 설계한 것이 아닌가 싶다.

    +.

    여담으로 이야기 하자면, 모던 C++에는 마치 GC처럼 자동으로 포인터를 관리(?)해주는 스마트 포인터가 있습니다.

    이로 인해 성능에 영향을 많이 주지 않으면서도 동적할당과 해제를 손쉽게 하고 버그를 줄여줍니다.

    만약 C++도 모든 것을 동적 할당하여 사용한다면 가시적으로 나타날만큼 성능에 유의미한 영향을 끼치겠지만, 일반적으로는 정적 할당을 사용하기 때문에 큰 영향을 미치진 않죠.


    6. 오라클

    더 큰 단점도 없다.

    법무팀이 개발팀 보다 크다는 오라클이 언제 자바를 상용화 시킬지도 모름.


    반면 장점도 있다.

    장점.

    1. 강력한 GC 및 JVM

    자바의 GC와 JVM은 오랜 시간 동안 존재해왔고, 각종 튜닝하는 방법과 노하우가 쌓여왔다.

    이로 인해 크로스 플랫폼에 대응하고, 개발자의 생산성을 높혀주는 효과를 가져왔다.


    2. 방대한 라이브러리.

    1번과 함께 JVM 기반의 언어들이 나타나는데에도 큰 공을 세웠다고 생각합니다.

    정말, 왠만한 라이브러리를 가지고 있어 빈약한 라이브러리로 인해 대부분을 프로그래머가 구현해야 하는 C에 비하면 엄청난 생산성의 증가를 가져옵니다.

    그리고 GUI 라이브러리들은 자신이 원하는 GUI를 쉽게 만들 수 있도록 되어 있어(RAD 툴에 비하면 아니지만) 상당히 편리합니다.


    3. 객체지향

    자바를 사용하다보면 손쉽게 객체지향의 개념을 깨달을 수 있다.

    자바가 '언어'로서 가지는 가장 큰 장점이라 생각한다.


    계속 비교하는 C++의 경우, 워낙 다양한 방식으로 프로그램을 짤 수 있다보니 처음 객체지향을 C++로 접하면 개념잡기가 어려울 수도 있다고 생각한다.


    4. 인터페이스

    제가 자바 '문법적 요소'에서 유일하게 마음에 들었던 요소는 인터페이스입니다.

    인터페이스는 다중 상속을 못하니 보완을 하기 위해서 나온 것인데, 극도로 추상화된 클래스라는 점이 특이하게 다가왔습니다.


    하지만, 이마저도 C++에서는 구현이 충분히 가능하다.


    https://black7375.tumblr.com/post/162326257225/c-에서-자바-인터페이스처럼-사용하기


    https://black7375.tumblr.com/post/162326257225/c-에서-자바-인터페이스처럼-사용하기


    단순히 언어적인 측면에서만 생각하면 잘 설계된 언어는 아닌 듯.

    마치며.

    자바의 '문법적 요소'는 마음에 들지 않지만 좋은 JVM, GC, Library로 강력한 생산성을 보여준다.

    그리고, 앞서 말했던 것들은 걸출한 유산이 되어 코틀린, 스칼라, 그루비 등이 탄생할 수 있도록 도와준 것은 높게 평가한다.

    특히 코틀린은 최근에 구글에서 안드로이드 공식 지원 언어로도 선포하기도 했기 때문에 자바에서 조금씩 넘어갈거라 기대한다.


    +.

    그리고, 자바라는 언어가 쉽다는 것은 아니다. OOP의 개념을 잘 이용하고, JVM을 고려하여 프로그램을 짜려면 생각보다는 어렵다.

    예) The Black Magic of (Java) Method Dispatch.

    한줄 평.

    가독성이 너무 안 좋아요..


    끝~~


    댓글

Designed by black7375.