이번 포스팅은 자바의 장단점과 특징을 종합하여 다음의 장단점으로 구분 지었습니다. 개인적 주관이 담긴 부분이 있으므로 참조용으로 생각해주시면 감사드리겠습니다.
혹여나 잘못된 지식을 전달하고 있다면 언제든지 댓글로 피드백 주시면 감사드리겠습니다!
장점
소스와 클래스 파일 : 클래스 파일(.class)에는 반드시 하나의 자바 클래스만 들어 있다. 즉, 바이트 코드로 컴파일되는 자바의 경우 각각의 클래스 파일이 각각의 바이트 코드를 가지며 독립적으로 존재한다. == 플랫폼의 종속적이지 않게 된다.
수많은 개발자와 레퍼런스 : 자바는 객체 지향 언어로 오랜 시간 사용됐고, 폭포수 모델과 같은 기법들로 다양한 프로젝트에서 산출물들이 발생하면서 참조가 할 수 있는 많은 오픈소스를 기반으로 생긴 경험과 자료들이 존재하여 많은 참조 자료들이 존재한다. 많은 실패 사례들을 참조하여 위험 요소를 감소시키는 것은 프로젝트를 실행하는 측면에서 매우 큰 이점이다.
타 언어 대비 높은 생산성 : 생산성이 높다. 위의 이유와 유사한 이유로 자료들이 많기 때문이다. 하지만 개발 속도가 비교하기 어려울 정도로 차이가 나는 Python나 Go 같은 타 프로그래밍 언어가 급속도로 발전되고 개발자들이 유입되며 높은 생산성의 장점은 끝나간다.
여담으로 본인은 유료화된 JAVA에 비해서 최근에는 오픈소스 기반 언어인 Python가 프로토타입 레벨에서는 작성하기 훨씬 좋은 생산성을 갖는 것으로 알고 있다.
그래도 아직은 이전에 개발했던 강력한 API들이 남아서 네트워킹, 데이터베이스 연결, 유틸리티, XML 파싱, 보안 등 다양한 기능을 예제를 찾아서 쉽게 구현할 수 있다. (바로 위에 작성한 수많은 개발자와 레퍼런스라는 이유 덕분에 많은 자료로 인하여 높은 생산성을 유지할 수 있는 것이다.)
안정성 : C/C++에 있는 포인터의 존재가 없는 것이 보안적 측면에서 많은 안정성을 갖고 온다. 또한 클래스를 캡슐화하여 내/외부를 명확하게 하는 부분도 안정성에 적용되며 또한 예외 처리로 try-catch문을 통하여 다양한 위험 요소들을 사전에 방지할 수 있다.
플랫폼에 무관하게 호환된다. : 위에 언급된 것과 같이 한번 컴파일하여 다른 os 즉 윈도, 맥과 같은 os에 무관하게 호환된다. WORA(Write Once, Run Anywhere) 원칙을 따르기 때문이다.
디버깅하는 실행 속도를 개선하기 위해 JIT 컴파일러가 사용된다. : 자바 특유의 느린 속도를 보완하기 위해서 자바에서는 기계어 코드로 컴파일 이후. CPU가 바로 기계어를 실행하는 Just in Time을 컴파일링 기법으로 활용하면서 버전이 업그레이드되면서 속도가 이전에 비해서는 개선된 장점이 존재한다.
멀티스레드 : 자바는 JVM의 가상 환경을 적극적으로 사용하며 운영체제의 영향이 없어서 운영체제의 제한된 API를 받지 않는다. 멀티스레드를 지원하지 않는 os의 경우에도 자바 언어를 활용하여 멀티스레드를 구현할 수 있다.
가비지 컬렉션 : 장점이자 단점으로 부각되는 것 같다. C++의 경우 소멸자를 사용하여 반환처리를 하지만 자바 언어는 가비지 컬렉션을 활용하여 heap을 통한 객체 생성 이후에 메모리에 할당된 객체를 하나하나 설정하는 것이 아닌 자동으로 반환해 주는 기능을 사용하게 된다.
단점
속도 문제 : JVM 로딩 속도 문제, 가상 머신 바이트코드 실행 속도 문제, 가비지 컬렉션에 의한 실행 지연 문제 등이 존재한다.
JVM은 플랫폼에 상관없이 바로 자바를 실행하는 것에 도움이 되지만 환경이 모두 로딩되어야 실행되는 단점이다. 어찌 보면 장점을 위한 단점이 될 수 있다 생각된다.
가상 머신 바이트 코드는 JIM의 탄생 기점으로 이전에 비해서는 속도가 많이 개선됐다. 하지만 메모리 용량 뒷받침이 필수적이며 Java9 이후 버전부터만 조금 더 적극적으로 속도를 극복할 수 있다. 최근에는 속도가 빠른 언어들을 많이 사용하다 보니 메모리 용량을 크게 잡는 것이 아니라면 프로그램이 무겁게 느껴질 수 있는 단점으로 본다.
가비지 컬렉션에 의한 실행 지연은 단점 중 실시간 응용 시스템에 부적합에 내용의 문제점으로 본다. 실시간 처리에 대해서는 JavaScript 기반의 Node.js 런타임을 활용한 프로젝트가 조금 더 적합하다고 생각한다. 또한, 자바는 C/C++ 같은 완전히 컴파일 언어로 지원하는 것과 다르게 직접 반환하는 것이 아닌 자동으로 가비지 컬랙션이 메모리를 자동으로 반환해서 속도가 C/C++과 같은 메모리 최적화가 가능한 언어에 비해서는 속도 느리다.
불편한 예외 처리 : 객체 지향 언어들과 같은 try-catch 등을 활용하는데 높은 안정성을 위하여 상황에 맞는 예외 처리를 반드시 사용된다. 안 되는 경우 디버깅 자체가 안된다. 하지만 동적 타입에 비해서 타입과 많은 예외 처리 단계를 거치는 것이 오히려 생산성을 증대시키는 방향이 될 수 있다.
소스 코드 길이 : 자바의 경우 Hello를 출력하기 위해서는 아래와 같이 최소 길이 5줄이 존재한다.
1
2
3
4
5
|
class codeEx {
public static void main(String args[]) {
System.out.println("Hello");
}
}
|
하지만 python을 사용하면 print("Hello") 한 줄만 타이핑하면 Hello가 출력된다. 자바를 개발 이후에 파이썬으로 개발을 진행하는 경우 100줄 되던 소스코드를 절반 이상의 소스코드로 많이 간결화할 수 있다.
언어적 불편함 : 대부분의 클래스 선언 등을 이름을 명사형으로만 강요되며 명사 외를 지양한다. 또한 외부 범위에서 변수를 함수 내부로 바인딩하는 기술인 클로저 기능이 미 지원된다. C언어에 있는 전역 변수 개념이랑 유사하다 본다. 자바 언어의 경우 전역, 지역 변수는 모두 클래스 내부에 캡슐화로 진행되기 때문이다.
Oracle사 인수로 인한 Java 유료화 : 본인은 프로그래밍 업데이트 지원이 유료화되는 것이 큰 타격이라 본다. 프로그래밍 언어가 본격적으로 유료화되면서 적은 금액이라도 프로젝트에 투입되는 인력 비용 + 프로그램 인프라 비용 등등이 부담이 될 수 있다.
UI 기능(?) : 자바는 GUI에 대한 기능을 지원하지만 그렇다고 React.js, Vue.js 같은 라이브러리, 프레임워크와 비교했을 때는 뒤쳐져 있다고 생각한다.
복잡성 : Python, Node.js, Next.js 같은 언어, 런타임 환경, 프레임워크 등에서 최대한 간략하고, 빠르게 개발하는 것을 목표로 하는데 자바에서 활용하는 다양한 규칙들이 숙련도가 낮은 자바 개발자들에게 복잡하게 만드는 요소가 있다고 생각한다. 타 언어들도 분명 숙련도가 필하겠지만 구현 목적과 규모에 따라서 다르며, 자바는 대규모 서비스에서 많이 활용되고 있는만큼 숙련도 대비 비교적 복잡함을 가질 수 있다.
[reference] 명품 JAVA Programing(한스푼) , Java 나무 위키 (https://namu.wiki/w/Java), 개인이 스터디 및 세미나를 통한 학습
짧고 부족한 내용 읽어주셔서 감사드립니다.
내용 피드백이 있는 경우 댓글 부탁드립니다!
다음 포스팅 때 뵙겠습니다!
'Java ☕ > Java' 카테고리의 다른 글
[Java] 얕은 복사(Shallow Copy)와 깊은 복사(Deep Copy) (0) | 2021.12.14 |
---|---|
[Java] 변수(Variable)와 상수(constant) (1) | 2021.11.30 |
객체, 클래스, 인스턴스의 개념 (0) | 2021.01.02 |
Java 개인 프로젝트_ 웹 데이터 크롤러_ 설계 파트 (0) | 2020.11.29 |
자바(Java) 다운로드 하고 실행하는 방법 ( 이클립스 - eclipse ) (0) | 2020.10.12 |