상위 문서: Java
관련 문서: Java/기타
[clearfix]
1. 개요
프로그래밍 언어 Java의 상세 정보에 관해 정리한 문서이다.2. C, C++와의 비교
기존의 C에 객체지향 기능을 추가하다 보니 언어의 사용에 있어 저수준과 고수준의 개념이 충돌하는 부분이 많았던 C++과는 다르게 아예 처음부터 객체지향 언어로 개발되었다. 다만 많은 사람들이 착각하는 부분인데, Java는 엄밀히 말하면 완벽한 객체지향 언어가 아니다. 원시(Primitive) 타입은 객체로 취급하지 않기 때문. 모든 것을 객체로 취급하는 언어를 순수 객체지향(Pure object-oriented)이라 하며, 이를 지원하는 언어로는 Python, Ruby, Smalltalk등이 있다.C, C++, Java의 차이점을 말하자면, C는 포인터 등을 활용한 저수준 시스템 프로그래밍에[1] 강점을 가지며, C++는 C의 그런 강점을 거의 그대로 가져오면서 거기에 객체 지향이나 일반화 프로그래밍과 같은 멀티 패러다임을 지원하고자 하는 시도[2]에서 탄생하였다. 이렇게 고수준과 저수준의 개념을 모두 포함하려다 보니 다른 언어에 비해서 상당히 복잡해졌다. 게다가 최신 프로그래밍 환경을 지원하기 위해 지속적으로 개정되고 있는 모던 C++는 변화의 폭이 커서, 새로운 기능을 전부 제대로 다룰 줄 아는 프로그래머는 비교적 적다는 평이 널리 받아들여지고 있다. 이와는 대조적으로 Java는 C++의 초기 발전 방향과는 달리 안정성을 위해 포인터라는 강력한 로우 레벨 기능을 포기하고 가비지 컬렉터를 내장하며, 고수준의 객체지향 부분을 잘 구현하는 것에 집중하는 방식으로 언어가 복잡해지는 것을 방지하였다.
수많은 C계열 프로그래밍 언어가 그렇듯이, C/C++와 비슷한 문법 구조를 가지고 있다. 그러면서도 Java가 C/C++보다 훨씬 더 널리 쓰이는 분야가 많이 존재한다. 웹 애플리케이션 백엔드와 안드로이드 앱이 대표적인 사례. 또한 아파치 소프트웨어 재단에서 개발하는 수많은 오픈 소스 소프트웨어들이 Java로 만들어졌다. 하지만 Java 프로그램에서 속도가 매우 중요시되는 부분은 따로 떼어서 C/C++로 개발하기도 한다. 제작하고자 하는 프로그램의 생산성과 성능을 적절히 고려하여 선택하는 것이 현명하다.
3. 개발환경, JVM 언어
3.1. 개발환경
Java에 특정한 라이브러리를 가미해서 웹에서 돌릴 수 있게 한 것이 Java Applet이다. 애플릿 특유의 제약으로 인해 ActiveX보다는 훨씬 안전하다는 이유로 물 건너에서는 인터넷 뱅킹이나 결제 용도로 사용하기도 한다. 근데 상대적으로 안전하다는 것일 뿐, 애플릿을 사용한 결제 시스템도 툭하면 뚫려서 문제가 발생하곤 한다(…). 더군다나 iOS와 안드로이드에서는 되지 않는다. 게다가 크롬과 파이어폭스 등의 브라우저들이 NPAPI 지원 중단 선언을 하고, Java 9부터 애플릿의 개발이 중단되면서 결국 수명이 끝나게 되었다. 이러한 점은 자바 애플릿만이 아닌 다른 대부분의 리치 인터넷 애플리케이션들의 또한 마찬가지이다.웹 애플리케이션 제작을 위해 Java 언어를 사용하는 규격으로 Java 서블릿과 JSP(Java 서버 페이지)가 있다.[3] 주로 기업에서 Spring과 함께 사용한다. 개인 웹호스팅에서는 이를 지원하는 경우는 많지 않다. 그러나 최근 Java를 지원하는 여러 클라우드 컴퓨팅 서비스가 싼 가격에 등장하고 있고, Java 뿐만이 아닌 JVM 언어를 이러한 환경에서 구동하는 사례가 늘고 있다.
Java Development Kit(Java 개발 도구)을 설치하면 javac라는 컴파일러가 제공된다. 하지만 통합 개발 환경은 제공해 주지 않기 때문에, 반드시 별도의 개발용 프로그램을 써야 한다. 대표적으로 이클립스, 넷빈즈, IntelliJ IDEA 등이 있다. 만약 이것들을 안 쓰겠다고 한다면, 당신에게는 메모장과 javac.exe가 있을 뿐이다. 그리고 Java는 IDE 없이 타이핑만으로 짜기엔 굉장히 불편한 언어라는 것을 명심하자.[4] 실전 Java 개발을 할 때 프로젝트에 필요한 라이브러리 관리나 프로젝트 결과물 배포 등 프로젝트 빌드 관리를 위한 도구로는 아파치 소프트웨어 재단에서 만든 Ant와 Maven, 그 중에서도 Maven이 많이 사용되고 있다. 최근에는 이 두 가지의 단점을 보완한 Gradle이 각광을 받고 있으며 안드로이드 프로젝트에서는 기본으로 쓰인다.
TDD 개발을 위한 방법으로는 Jenkins를 통한 CI 관리, SonarLint/SonarQube를 통한 코드 분석, Maven을 통한 빌드 관리, JaCoCo를 통한 Code Coverage 관리 등이 있다.
3.2. JDK 공급자
https://whichjdk.com/ 에서 자세한 사항(영문)을 볼 수 있다.
TTCK 인증[5], C기업 무료, $유료, N테스트 버전 제공
- 오라클$T: 릴리즈된 최신 버전만 일반 지원 일자 동안 공개 제공, 그 외는 오라클 서비스 구독 고객에게 비공개 제공
- OpenJDKCN: 릴리즈된 최신 버전만 제공, 그 외에는 소스만 제공.
- AzulCT: 6 이후 모든 버전 제공, 기업 사용 무료이나 유료 기술지원 제공
- AdoptOpenJDKCN: LTS 8, 11 버전 및 최신 버전 제공, 17 이후는 아래 Adoptium 에서 이관하여 Temurin 이라는 배포 명칭으로 제공
- Temurin(Adoptium)CTN: Eclipse 재단에서 제공, LTS 8, 11, 17 및 최신 버전 제공
- Microsoft JDKCTN: LTS 11, 17 제공, 주로 자사 Azure 클라우드 환경을 위한 JDK로 제공
- JBRT: JetBrains 에서 내부적으로 JDK 사용하여 IDE 개발 후, 런타임만 IDE에 포함하여 제공. 공개 제공하지 않는다.
- BellSoft Liberica JDKCT: Spring 에서 공식 런타임으로 지정한 JDK 로 상기 Zulu 처럼 상업적으로도 무료로 사용 가능하며 기술지원을 유료로 제공한다.
- IBM Semeru RuntimeT: IBM에서 개발한 JDK로 IBM 클라우드 전용으로 제공한다.
- Amazon CorrettoCT: 오라클의 라이선스 정책 변경으로 태어난, AWS 에서 사용하기 적합한 JDK로, 다른 클라우드와 마찬가지로 클라우드의 JDK 사용 시 라이선스 저촉이 우려되어 이렇게 대형 클라우드사에서 JDK를 배포하고 있다.
- Alibaba DragonwellT: 알리바바가 만든 JDK로, 알리바바는 생각보다 OpenJDK 기여율이 높은 것으로 알려져 있다. 그렇다 보니 중국에서는 이 JDK 를 통한 자바 개발을 독려 중. 그런 이유가 아니라면 선택지가 많으므로 중국 내 자바 개발 외에는 쓰지 않는 것을 추천한다.
- SapMachineT: SAP 에서 만든 JDK로, 완전히 SAP 전용이다. 따라서 SAP 개발이 아니라면 볼 일이 없다.
- Red Hat OpenJDKT: 레드햇에서 만든 JDK로, 레드햇 리눅스 및 그 기반인 CentOS 에서도 구동되어 국내에서도 알게모르게 OpenJDK 설치 시 많이 쓰는 JDK다. 즉, CentOS나 레드햇에서 OpenJDK 를 설치하려고 검색하면 십중팔구 이게 검색되어 설치할 JDK인 셈. 레드햇 기반 리눅스 외에서는 동작하지 않는다. 단, 공식 사이트에서 Windows 버전을 추가 제공한다.
- GraalVMCT$N: 현재 오라클 에서 적극적으로 밀고 있는 JDK로 자바 뿐만 아니라 CLR 같은 방식으로 자바스크립트 등의 폴리글랏 언어로 개발하여 네이티브에 구동할 수 있도록 개발 환경을 제공하는 목표를 가지고 나온 가상 머신. 커뮤니티 참여도도 높아서 기대 중이지만, 아직 실제 운영 사례가 존재하지 않고, 자바 생태계에서 이 VM에서 돌아가는 자바 프레임워크 및 라이브러리도 많지 않아 지켜봐야 하는 VM 이지만 지켜볼 가치는 있다. 무료 커뮤니티 에디션은 상용 사용 가능하며, 고급 기능을 지원하는 엔터프라이즈 에디션을 판매 중이다.
3.3. JVM 언어
이외에 Java와 똑같이 Java 바이트 코드를 생성하지만 언어 규격이 다른 Scala와 Clojure라는 언어들도 있다. Scala는 'Scalable Language'에서 따왔는데, Java와 비슷한 부분이 많으며 Java API를 그대로 가져다 쓸 수도 있다. 또한, syntactic sugar가 많고 함수형 프로그래밍의 여러 가지 요소들을 가져와서 Java에 비해 생산성도 높다. 일례로 일일이 타입을 명시하지 않고 var x === 1.5와 같이 넣으면 알아서 float 형으로 추론해준다.[6] 또, switch-case의 확장판이라 할 수 있는 패턴 매칭을 지원하며 클로저도 지원된다. 단점으로는 이런 고수준-고생산성의 언어에서 많이 볼 수 있듯이 같은 Java 코드에 비해 약간 느리다. Clojure는 Java 플랫폼에서 동작하는 LISP의 방언으로 설계되었으며 Common Lisp와 Scheme과 함께 주요 LISP 방언 중 하나로 꼽힌다. 이 언어도 마찬가지로 Java API를 가져다 쓸 수 있다.Java 6부터 Scripting API라는 것이 추가되었다. JVM 언어 구현체에서 javax.scripting 관련 API를 제공하면 Java 코드에서 동적으로 인터프리터를 생성하고 연동하여 사용할 수 있게 해주는 표준 API이다.
3.3.1. 유명한 JVM 언어 목록
아래에 나열된 언어들이 유명하며, Common LISP, Scheme, Pascal 등 여러 다양한 언어들이 구현되어 있다.- Clojure
- Groovy: Java에 Python, Ruby, SmallTalk 등의 특징을 버무린 동적 타입 언어. 2003년에 등장했다. Gradle 패키지 관리의 기본 언어이다.
- JRuby: Ruby의 대부분을 Java로 구현한 언어 구현체. 역시 Java와 호환된다.
- Jython: 파이썬의 Java 구현체. JVM 위에서 동작하며, 따라서 Python 모듈과 함께 Java 클래스, JAR 사용이 가능하다. 참고로 로고는 Java의 커피 컨셉과 Python의 뱀 컨셉을 섞어서 커피잔에서 뱀이 연기처럼 피어나오는 로고다(...)
- Kotlin : IntelliJ IDEA를 만든 JetBrains에서 개발한 JVM 언어. Google I/O 2017에서 안드로이드의 공식 언어로 지정되었다.[7]
- Rhino: JVM으로 돌아가는 JavaScript 엔진으로, 모질라 재단이 100% Java로 개발했다. JavaScript와 Java의 API를 동시에 사용해 개발할 수 있다. Java 7 에 내장되어 있다.
- Nashorn: 또 다른 JVM 위에서 돌아가는 JavaScript 엔진이다. Java 8과 함께 등장했다. 그러나 Java 11 부터 제거 예정이며, Java 15에서 완전히 제거되었다. 참고로 Nashorn 은 Rhino(코뿔소)의 독일어다. 제거 이후는 GraalVM이 대신한다.
- Scala
4. GUI 프로그래밍
Java에서 UI를 만들 때도 고려를 해야할 게, Java는 UI를 만들 때 AWT나 Swing 둘 중 하나 혹은 둘 다 선택하여 UI를 만드는 게 가능하다. 조심해야 할 점은, AWT로 생성한 UI는 Swing UI에 가려져버린다. 그래서 멀쩡히 잘 돌아가는 코드인데도 불구하고 배경이 컨트롤(콤보박스라거나)을 가려버리는 일이 있을 수 있다.[1] 리눅스 커널, 하드웨어 프로그래밍[2] 3D 게임, 그래픽 프로그래밍[3] JSP의 목적이 HTML 페이지를 동적으로 만들어내는 것이다. JSP 소스는 Java 서블릿 코드로 변환되어 서버에서 실행되고, 서버는 이 HTML 결과를 브라우저에 보여준다. JSP 페이지는 HTML 페이지에 Java 코드가 포함되어 있는 식으로 되어 있는 경우가 많고, 이 점은 PHP, ASP.NET 등과 비슷한 편이다. 반면 Java 서블릿은 서버 쪽에서 하는 일에 관심이 많지만 출력에 대한 관심은 적다. 필요하다면 브라우저에 출력을 전혀 안 보낼 수도 있다. 최근에는 Server side script language로 HTML 페이지를 동적으로 만드는 식으로는 프로그래밍을 하지 않는다. JSP, PHP와 같은 Server side script language로는 서버에 있는 자원의 접근을 주로 하고(DB 연산, File 연산 등등) 화면에 보여주는 UI는 HTML/CSS/JavaScript로만 한다. 따라서 Client side와 Server side 간에 통신이 필요한데 이는 XHR(XML HTTP Request)를 이용한다. 이러한 프로그래밍 기법을 나타내는 표현을 AJAX라고 한다.[4] Java는 현용 프로그래밍 언어 중에서는 가장 Verbose(장황한) 언어로 꼽힌다. 즉, 같은 의미인데 많은 타이핑이 필요하다.[5] Java Technology Compatibility Kit, 오라클에서 직접 엄격하게 테스트하여 자바 구동이 완벽하게 보장하는 인증 키트.[6] Java는 버전 10에서 와서야 이와 같은 타입 추론 기능이 가능해졌다.[7] 안드로이드의 Java 라이선스 무단 사용으로 구글이 오라클과 법정 싸움을 한 여파로 보인다.