동음이의어에 대한 내용은 자바 문서 참고하십시오.
Java 관련 틀 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
자바 Java | |
<colbgcolor=#ffffff,#1f2023><colcolor=#0b6fb6> 운영 및 개발 | 오라클 |
개발자 | 제임스 고슬링 |
최초 버전 | 1.0 (1995.01.23.) |
최신 버전 | 22 |
[clearfix]
1. 개요
#!syntax java
class Main {
static public void main(String []args) {
System.out.println("Hello, World!");
}
}
Write once, run anywhere[1]
한 번 쓰면, 어디서든 실행된다.
한 번 쓰면, 어디서든 실행된다.
썬 마이크로시스템즈에서 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로 작성 된 프로그램은 플랫폼에 맞는 자바 가상 머신만 설치되어 있다면 대체로 문제 없이 동작한다. 이는 바이트 코드가 플랫폼이 아닌 자바 가상 머신에서 실행가능하며, 프로그램 실행의 주체가 운영 체제가 아닌 자바 가상 머신이기 때문이다. 이러한 점을 일컬어 플랫폼에 독립적이라고 한다.
이와 같이 장점으로 내세우는 '플랫폼 독립성'이라는 것이 C/C++로 쓰여진 자바 가상머신의 이식성을 통해서 이루어진 것이라, 실상은 자바 가상 머신에 심하게 종속된 언어이고, C/C++의 이식성을 초월하지 못한다. 따라서 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 언어를 이러한 환경에서 구동하는 사례가 늘고 있다.
Java Development Kit(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: 릴리즈된 최신 버전만 일반 지원 일자 동안 공개 제공, 그 외는 오라클 서비스 구독 고객에게 비공개 제공
- OpenJDKCN: 릴리즈된 최신 버전만 제공, 그 외에는 소스만 제공.
- AzulCT: 6 이후 모든 버전 제공, 기업 사용 무료이나 유료 기술지원 제공. 일반버전은 좀 띄엄띄엄하게 제공되는데 LTS 버전은 17 버전까지 모두 리눅스와 인도우용으로 x86 32bit JDK를 제공하고 있다.
현재 실제 사용하는 사람은 얼마 없었는지 21 버전에는 32bit 버전이 없다. - 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.4. JVM 언어
이외에 Java와 똑같이 Java 바이트 코드를 생성하지만 언어 규격이 다른 Scala와 Clojure라는 언어들도 있다. Scala는 'Scalable Language'에서 따왔는데, Java와 비슷한 부분이 많으며 Java API를 그대로 가져다 쓸 수도 있다. 또한, syntactic sugar가 많고 함수형 프로그래밍의 여러 가지 요소들을 가져와서 Java에 비해 생산성도 높다. 일례로 일일이 타입을 명시하지 않고 var x === 1.5와 같이 넣으면 알아서 float 형으로 추론해준다.[8] 또, 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에서 안드로이드의 공식 언어로 지정되었다.[9]
- 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 서블릿은 서버 쪽에서 하는 일에 관심이 많지만 출력에 대한 관심은 적다. 필요하다면 브라우저에 출력을 전혀 안 보낼 수도 있다. 최근에는 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라고 한다.[6] Java는 현용 프로그래밍 언어 중에서는 가장 Verbose(장황한) 언어로 꼽힌다. 즉, 같은 의미인데 많은 타이핑이 필요하다.[7] Java Technology Compatibility Kit, 오라클에서 직접 엄격하게 테스트하여 자바 구동이 완벽하게 보장하는 인증 키트.[8] Java는 버전 10에서 와서야 이와 같은 타입 추론 기능이 가능해졌다.[9] 안드로이드의 Java 라이선스 무단 사용으로 구글이 오라클과 법정 싸움을 한 여파로 보인다.