동음이의어에 대한 내용은 자바 문서 참고하십시오.
Java 관련 틀 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
자바 Java | |
<colbgcolor=#ffffff,#1c1d1f><colcolor=#0b6fb6> 운영 및 개발 | 오라클 |
개발자 | 제임스 고슬링 |
최초 버전 | 1.0 (1995.01.23.) |
최신 버전 | 23 |
[clearfix]
1. 개요
Write once, run anywhere[1]
한 번 쓰면, 어디서든 실행된다.
자바(Java)는 썬 마이크로시스템즈에서 1995년에 개발한 객체 지향 프로그래밍 언어이다. 창시자는 제임스 고슬링이다. 2010년에 오라클이 썬 마이크로시스템즈를 인수하면서 Java의 저작권을 소유하였다. 현재는 OpenJDK는 GPL2이나 오라클이 배포하는 Oracle JDK는 상업 라이선스로 2019년 1월부터 유료화 정책을 강화하고 있다. Java EE는 이클립스 재단의 소유이다. Java 언어는 J2SE 1.4부터는 Java Community Process (JCP)에서 개발을 주도하고 있다.한 번 쓰면, 어디서든 실행된다.
C#과 문법적 성향이 굉장히 비슷하며[2], 그에 비해 2019년 Q3에서 가장 많이 이용하는 언어로 뽑혔다.
2. 분류
Java는 크게 다음과 같은 3가지 에디션으로 나뉜다.- Java SE(Java Standard Edition / J2SE)
대부분의 사람들이 가장 많이 접하는 표준 에디션. Java의 핵심 API와 기능들을 제공한다. JDK 항목도 참고.
- Jakarta EE, 구 Java EE(Java Enterprise Edition / J2EE)
기업에서 운영하는 서버 페이지에 특화된 에디션이다. JSP와 서블릿을 비롯한 웹 애플리케이션 서버에 관련된 기술들이 포함되어 있다.
- Java ME(Java Micro Edition / J2ME)
피처폰, PDA, 셋톱 박스, 센서 등의 임베디드 시스템 환경에 특화된 경량 에디션이다.
3. 특징
Java의 가장 큰 특징은 플랫폼에 독립적인 언어라는 점이다. 소스 코드를 기계어로 직접 컴파일하여 링크하는 C/C++의 컴파일러와 달리 자바 컴파일러는 바이트코드인 클래스 파일(.class)을 생성하고, 이 파일의 바이트코드를 읽은 뒤 기계어로 바꾸어 실행하는 것은 자바 가상 머신이다.예를 들어 플랫폼에 종속된 경우 윈도우 버전으로 빌드한 프로그램을 그대로 리눅스나 macOS에서 실행하는 것은 불가능하다. 반면 Java로 작성된 프로그램은 플랫폼에 맞는 자바 가상 머신만 설치되어 있다면 대체로 문제없이 동작한다. 이는 바이트코드가 플랫폼이 아닌 자바 가상 머신에서 실행 가능하며, 프로그램 실행의 주체가 운영 체제가 아닌 자바 가상 머신이기 때문이다. 이러한 점을 일컬어 플랫폼에 독립적이라고 한다.
3.1. C, C++와의 비교
기존의 C에 객체 지향 기능을 추가하다 보니 언어의 사용에 있어 저수준과 고수준의 개념이 충돌하는 부분이 많았던 C++과는 다르게 아예 처음부터 객체 지향 언어로 개발되었다.C, C++, Java의 차이점을 말하자면, C는 포인터 등을 활용한 저수준 시스템 프로그래밍에[3] 강점을 가지며, C++는 C의 그런 강점을 거의 그대로 가져오면서 거기에 객체 지향이나 일반화 프로그래밍과 같은 멀티 패러다임을 지원하고자 하는 시도[4]에서 탄생하였다. 이렇게 고수준과 저수준의 개념을 모두 포함하려다 보니 다른 언어에 비해서 상당히 복잡해졌다. 게다가 최신 프로그래밍 환경을 지원하기 위해 지속적으로 개정되고 있는 모던 C++는 변화의 폭이 커서, 새로운 기능을 전부 제대로 다룰 줄 아는 프로그래머는 비교적 적다는 평이 널리 받아들여지고 있다. 이와는 대조적으로 Java는 C++의 초기 발전 방향과는 달리 안정성을 위해 포인터라는 강력한 로우 레벨 기능을 포기하고 가비지 컬렉터를 내장하며, 고수준의 객체 지향 부분을 잘 구현하는 것에 집중하는 방식으로 언어가 복잡해지는 것을 방지하였다.
수많은 C 계열 프로그래밍 언어가 그렇듯이, C/C++와 비슷한 문법 구조를 가지고 있다. 그러면서도 Java가 C/C++보다 훨씬 더 널리 쓰이는 분야가 많이 존재한다. 웹 애플리케이션 백엔드와 안드로이드 앱이 대표적인 사례. 또한 아파치 소프트웨어 재단에서 개발하는 수많은 오픈 소스 소프트웨어들이 Java로 만들어졌다. 하지만 Java 프로그램에서 속도가 매우 중요시되는 부분은 따로 떼어서 C/C++로 개발하기도 한다. 제작하고자 하는 프로그램의 생산성과 성능을 적절히 고려하여 선택하는 것이 현명하다.
3.2. 개발 환경
Java에 특정한 라이브러리를 가미해서 웹에서 돌릴 수 있게 한 것이 Java Applet이다. 애플릿 특유의 제약으로 인해 ActiveX보다는 훨씬 안전하다는 이유로 물 건너에서는 인터넷 뱅킹이나 결제 용도로 사용하기도 한다. 근데 상대적으로 안전하다는 것일 뿐, 애플릿을 사용한 결제 시스템도 툭하면 뚫려서 문제가 발생하곤 한다(…). 더군다나 iOS와 안드로이드에서는 되지 않는다. 게다가 크롬과 파이어폭스 등의 브라우저들이 NPAPI 지원 중단 선언을 하고, Java 9부터 애플릿의 개발이 중단되면서 결국 수명이 끝나게 되었다. 이러한 점은 자바 애플릿만이 아닌 다른 대부분의 리치 인터넷 애플리케이션들의 또한 마찬가지이다.웹 애플리케이션 제작을 위해 Java 언어를 사용하는 규격으로 Java 서블릿과 JSP(Java 서버 페이지)가 있다.[5] 주로 기업에서 Spring과 함께 사용한다. 개인 웹 호스팅에서는 이를 지원하는 경우는 많지 않다. 그러나 최근 Java를 지원하는 여러 클라우드 컴퓨팅 서비스가 싼 가격에 등장하고 있고, Java뿐만이 아닌 JVM 언어를 이러한 환경에서 구동하는 사례가 늘고 있다.
JDK(Java 개발 도구)를 설치하면 javac라는 컴파일러가 제공된다. 하지만 통합 개발 환경은 제공해 주지 않기 때문에, 반드시 별도의 개발용 프로그램을 써야 한다. 대표적으로 이클립스, 넷빈즈, IntelliJ IDEA 등이 있다. 만약 이것들을 안 쓰겠다고 한다면, 당신에게는 메모장과 javac.exe가 있을 뿐이다. 그리고 Java는 IDE 없이 타이핑만으로 짜기엔 굉장히 불편한 언어라는 것을 명심하자.[6] 실전 Java 개발을 할 때 프로젝트에 필요한 라이브러리 관리나 프로젝트 결과물 배포 등 프로젝트 빌드 관리를 위한 도구로는 아파치 소프트웨어 재단에서 만든 Ant와 Maven, 그 중에서도 Maven이 많이 사용되고 있다. 최근에는 이 두 가지의 단점을 보완한 Gradle이 각광을 받고 있으며 안드로이드 프로젝트에서는 기본으로 쓰인다.
3.3. JDK 공급자
https://whichjdk.com 에서 자세한 사항을 볼 수 있다.TTCK 인증[7], C기업 무료, $유료, N테스트 버전 제공
- 오라클$T: 릴리스된 최신 버전만 일반 지원 일자 동안 공개 제공, 그 외는 오라클 서비스 구독 고객에게 비공개 제공.
참고로 과거에 거의 업계 표준이던 Oracle Jar 파일만 어느 WAS에나 올리면 작동하는 JXAB는 Oracle WAS의 일부로서 다른 WAS에서 사용하더라도 Oracle에 사용 허락(WAS 구매 계약)을 받아야 한다. 그런데 공짜 JDK를 몇십 년 제공하던 메이저 업체이다 보니 공짜로 제공하는 버전의 JDK가 있다. Oracle사에 문의해 보도록.
- OpenJDKCN: 릴리스된 최신 버전만 제공, 그 외에는 소스만 제공.
행간을 서술하겠다. 상용 서비스의 안정성을 위해서 이 최신 버전 못 쓰겠다는 업계 평범한 족속들, 납품서는 상용 WAS 계약(아니면 Red Hat 리눅스 구매 계약 또는 Azure 클라우드 계약, Oracle JDK 구매 계약, ....)이 있어야 한다는 것이다. 아니면 강제 사항은 아니겠으나 진짜 공짜 JDK를 공급가 0원 등으로 납품서에 명시하는 방법도 있겠다.
- AzulCT: 6 이후 모든 버전 제공, 기업 사용 무료이나 유료 기술 지원 제공. 일반 버전은 좀 띄엄띄엄하게 제공되는데 LTS 버전은 17 버전까지 모두 리눅스와 윈도우용으로 x86 32bit JDK를 제공하고 있다.
현재 실제 사용하는 사람은 얼마 없었는지 21 버전에는 32bit 버전이 없다.
여담으로, Apple Silicon 덕분에 비교적 유명해진 JDK이다. MacOS가 막 Apple Silicon기반으로 넘어갔을 때, Oracle에는 아직 일부 버전의 ARM64기반 JDK만 있었고 나머지는 전부 x86/64기반이었다. 그래서 당시 MacOS용이라고 아키텍처 확인 안 하고 아무 Oracle JDK나 깔아 썼다면 Rosetta[8]로 JDK를 돌리는 뻘짓을 하게 되어 빌드/실행 성능 모두 처참해지는 대참사(...)가 발생했다. 이때괜한 Oracle JDK을 욕하며대체재를 찾다가 알음알음 알려진 것이 바로 Azul의 OpenJDK인 Azul Zulu였다. 실제로도 Azul이 주도하여 Apple Silicon용 JDK를 개발한 것(JEP 391)도 있다. - Temurin(Adoptium)CTN: Eclipse 재단에서 제공, LTS 8, 11, 17, 21 및 최신 버전 제공. 세계 최대의 오픈소스 단체 중 하나인 이클립스 재단이 제공하는 만큼 OpenJDK 바이너리 배포판 중에서는 사실상 표준 취급받고 있으며, 위의 whichjdk 사이트에서도 가장 추천하는 배포판으로 소개하고 있다. 또한 Java 애플리케이션을 실행만 하려는 비개발자들을 위한 JRE 패키지를 별도로 제공하고 있는 것도 특징인데, 다운로드 크기가 JDK 대비 현저히 작기 때문에 개발이 목적이 아니라면 이 쪽을 다운받는 것이 좋을 수도 있다.
- Microsoft JDKCTN: LTS 11, 17, 21 제공, 주로 자사 Azure 클라우드 환경을 위한 JDK로 제공
- JBRT: JetBrains 에서 내부적으로 사용하는 JDK이며, 자사에서 개발한 IDE인 IntelliJ IDEA에 포함하여 제공한다. 별도의 패키지로도 배포 중인지라 JDK만 따로 다운로드 받아 사용할 수도 있는데, OpenJDK에 포함되지 않은 여러 성능 향상 및 버그 픽스들, 디버깅을 위한 여러 가지 기능 지원과 같은 개선점이 존재한다고 설명되어 있다.
- 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 버전을 추가 제공한다.
굉장히 주의해야 할 부분(알게 모르게 설명부)인데, 이름만 (Red Hat) OpenJDK일 뿐 공짜 제품이 아니어서 윈도우 버전 Red Hat OpenJDK도 그냥 쓰면 안 된다. 레드햇 리눅스를 구매하면 번들급으로 제공되는 상용 JDK 제품이라서, 쓸려면 그 JDK에 관련된 서버 리눅스 등의 제품을 사용료 지불이 계속 되어야 하는 레드햇으로 계속 유지해야 한다. 레드햇 리눅스 구매 없이 CentOS 같은 것을 서버로(아니면 서버도 없이) 이 OpenJDK를 윈도우나 리눅스에서 쓴다면 무단 복제로 분류해 볼 수가 있는 것이다.
- GraalVMCT$N: 현재 오라클 에서 적극적으로 밀고 있는 JDK로 자바뿐만 아니라 CLR 같은 방식으로 자바스크립트 등의 폴리글롯 언어로 개발하여 네이티브에 구동할 수 있도록 개발 환경을 제공하는 목표를 가지고 나온 가상 머신. 커뮤니티 참여도도 높아서 기대 중이지만, 아직 실제 운영 사례가 존재하지 않고, 자바 생태계에서 이 VM에서 돌아가는 자바 프레임워크 및 라이브러리도 많지 않아 지켜봐야 하는 VM이지만 지켜볼 가치는 있다. 무료 커뮤니티 에디션은 상용 사용 가능하며, 고급 기능을 지원하는 엔터프라이즈 에디션을 판매 중이다.
3.4. JVM 언어
이외에 Java와 똑같이 Java 바이트코드를 생성하지만 언어 규격이 다른 Scala와 Clojure라는 언어들도 있다. Scala는 'Scalable Language'에서 따왔는데, Java와 비슷한 부분이 많으며 Java API를 그대로 가져다 쓸 수도 있다. 또한, syntactic sugar가 많고 함수형 프로그래밍의 여러 가지 요소들을 가져와서 Java에 비해 생산성도 높다. 일례로 일일이 타입을 명시하지 않고 var x === 1.5와 같이 넣으면 알아서 float형으로 추론해 준다.[9] 또, switch-case의 확장판이라 할 수 있는 패턴 매칭을 지원하며 클로저도 지원된다. 단점으로는 이런 고수준-고생산성의 언어에서 많이 볼 수 있듯이 같은 Java 코드에 비해 약간 느리다. Clojure는 Java 플랫폼에서 동작하는 LISP의 방언으로 설계되었으며 Common Lisp와 Scheme과 함께 주요 LISP 방언 중 하나로 꼽힌다. 이 언어도 마찬가지로 Java API를 가져다 쓸 수 있다.Java 6부터 Scripting API라는 것이 추가되었다. JVM 언어 구현체에서 javax.scripting 관련 API를 제공하면 Java 코드에서 동적으로 인터프리터를 생성하고 연동하여 사용할 수 있게 해주는 표준 API이다.
3.4.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에서 안드로이드의 공식 언어로 지정되었다.[10]
- Rhino: JVM으로 돌아가는 JavaScript 엔진으로, 모질라 재단이 100% Java로 개발했다. JavaScript와 Java의 API를 동시에 사용해 개발할 수 있다. Java 7 에 내장되어 있다.
Nashorn: 또 다른 JVM 위에서 돌아가는 JavaScript 엔진이다. Java 8과 함께 등장했다. 그러나 Java 11부터 제거 예정이며, Java 15에서 완전히 제거되었다. 참고로 Nashorn 은 Rhino(코뿔소)의 독일어다. 제거 이후는 GraalVM이 대신한다.- Scala
3.5. GUI 프로그래밍
- AWT
- Swing
- JavaFx
4. 평가
자세한 내용은 Java/평가 문서 참고하십시오.5. 버전
자세한 내용은 Java/버전 문서 참고하십시오.6. 기타 버전
자세한 내용은 Java/기타 버전 문서 참고하십시오.7. 문법
자세한 내용은 Java/문법 문서 참고하십시오.8. 기타
자세한 내용은 Java/기타 문서 참고하십시오.9. 관련 문서
[1] 1995년 당시 썬 마이크로시스템즈가 자바의 크로스 플랫폼적 이점을 강조하기 위해 사용한 슬로건이며, 현재까지도 자바를 상징하는 가장 유명한 문장 중 하나이다.[2] 그도 그럴 것이, 원래 C#이 Microsoft에서 Java 라이센스 문제로 법적 분쟁을 겪은 이후 탈Java를 위해 Java의 기본적인 성질은 가져가되 Java와 C++의 장점을 결합하여 각자의 문제를 해결하는 것을 목표로 개발한 언어이기 때문이다.[3] 리눅스 커널, 하드웨어 프로그래밍[4] 3D 게임, 그래픽 프로그래밍[5] JSP의 목적이 HTML 페이지를 동적으로 만들어내는 것이다. JSP 템플릿은 Java 서블릿 코드로 변환되어 서버에서 실행되고, 서버는 이 HTML 결과를 브라우저에 보여준다. JSP 는 HTML 페이지에 Java 코드가 포함되어 있는 식으로 되어 있는 경우가 많고, 이 점은 PHP, ASP.NET 등과 비슷한 편이다. 반면 Java 서블릿은 서버 쪽에서 하는 일에 관심이 많지만 출력에 대한 관심은 적다. 필요하다면 브라우저에 출력을 전혀 안 보낼 수도 있다. 최근에는 자바스크립트와 그 프레임워크가 부상함에 따라 서버사이드 스크립트 언어로 HTML 페이지를 동적으로 만드는 것이 줄고 있다. API 로 서버에 있는 자원의 접근을 주로 하고(DB 연산, File 연산 등등) 화면에 보여주는 UI는 HTML/CSS/JavaScript로 한다. 따라서 Client side와 Server side 간에 통신이 필요한데 이는 XHR, (XML HTTP Request)를 이용한다. 이러한 프로그래밍 기법을 나타내는 표현을 AJAX라고 한다.[6] Java는 현용 프로그래밍 언어 중에서는 가장 verbose(장황한) 언어로 꼽힌다. 즉, 같은 의미인데 많은 타이핑이 필요하다.[7] Java Technology Compatibility Kit, 오라클에서 직접 엄격하게 테스트하여 자바 구동이 완벽하게 보장하는 인증 키트.[8] 쉽게말해, x86기반 MacOS 프로그램 에뮬레이터다.[9] Java는 버전 10에서 와서야 이와 같은 타입 추론 기능이 가능해졌다.[10] 안드로이드의 Java 라이선스 무단 사용으로 구글이 오라클과 법정 싸움을 한 여파로 보인다.