Java ME/SE/EE and Jakarta EE
Java SE (Java Platform Standard Edition)
가장 기본이 되는 표준 에디션의 자바 플랫폼으로 자바 언어의 핵심 기능을 제공한다. 데스크톱, 서버, 임베디드 시스템을 위한 자바 가상 머신 규격 및 API 집합을 포함한다. JAVA EE, ME는 목적에 따라 SE를 기반으로 기존의 일부를 택하거나 API를 추가하여 구성된다. SE는 가장 일반적으로 사용되는데 JDBC나 기본적인 기능이 모두 포함되어 있기 때문에 Android를 개발할 때 주로 SE를 사용한다. 뿐만아니라 네트워킹, 보안, 데이터베이스 접근, 그래픽스 사용자 인터페이스(GUI) 개발 등을 정의한다.
Java EE (Java Platform EnterPrise Edition)
자바를 이용한 서버 측 개발을 위한 플랫폼으로 기존 SE에 웹 애플리케이션 서버에서 동작하는 분산 멀티미디어를 제공하는 자바의 기능을 추가한 서버를 위한 플랫폼. JAVA SE에 서버 측을 위한 기능을 부가하였기 때문에 SE 기능을 모두 포함한다.
Java ME (Java Platform Micro Edition)
임베디드를 위한 자바 플랫폼이다. Java ME 또는 J2ME 등으로 불리며, 제한된 자원을 가진 휴대전화, PDA, 셋탑박스 등에서 Java프로그래밍 언어를 지원하기 위해 만들어진 플랫폼이다. Java SE의 부분 집합에 모바일 장치를 위한 특수 클래스 라이브러리가 추가된 플랫폼이다.
Jarkarta EE(구 Java Enterprise Edition)
Java SE를 기반으로 하여 그 위에 탑재된 플랫폼으로, Jarkata EE만의 API를 추가로 import해야 사용할 수 있다. 주로 자바로 서버 측 개발을 하기 위해 필요한 플랫폼으로 자바로 구현되는 웹 프로그래밍에서 가장 많이 사용되는 JSP와 Servlet을 포함하여, 데이터베이스에 연동하는 JDBC 외에도 JNDI, JTA, EJB 등과 같이 기업용 애플리케이션을 개발하는데 필요한 여러 가지 도구들과 라이브러리들이 포함된 플랫폼이다.
JVM with byte code, class loader, and JNI
자바에서는
1) 소스코드가 자바 컴파일러(javac)에 의해서 JVM을 위한 코드인 ‘Java byte code’를 생성한다.
2) 해당 Java byte code가 JVM(Java Virtual Machine) 안에서 한 줄씩 Interprete 된다.
3) JVM을 가지고 있는 특정한 컴퓨터에서 실행되게 된다.
자바 컴파일러에서 소스코드.java가 바이트코드.class로 컴파일되고 JVM에서 바이트코드.class가 인터프리트 되어 실행되니 자바는 “인터프리트 기능이 있는 컴파일러 언어”라 할 수 있다. JVM이 바이트 코드를 실행하는 가장 기초적인 방법이 인터프리터 방식이며 이 외에 JIT 컴파일 방식, 하드웨어와 소프트웨어를 혼합 구현한 방식이 있다.
즉, JVM(Java Virtual Machine)이란 시스템 메모리를 관리하며 자바 기반 애플리케이션을 위한 실행 환경을 제공한다. 원래 프로그램 메모리는 소프트웨어 개발자가 관리하지만, JVM은 위 그림처럼 가비지컬렉션이 메모리를 관리해준다. 일반적인 상호작용은 힙과 스택의 메모리 사용을 확인하고, 더이상 호출되는 객체가 힙에 없다면 제거한다.
바이트코드(ByteCode)란 JVM이 사용자가 작성한 .java 소스 코드 파일을 운영체제에 실행가능한 명령어 집합 파일로 컴파일하는 과정 중에 필요한 코드로 1차적으로 .java 소스 코드파일을 사용자가 작성하면, JVM이 이를 바이트코드로 컴파일하여 .class 파일로 만든다. 이후 2차적으로 운영체제에 작용하는 기계어로 한번 더 컴파일되어 컴퓨터에 JAVA 프로그램이 실행되는 것이다.
클래스 로더(Class Loader)란 JVM속으로 클래스(.class)를 로드하고 배치하는 작업을 수행해주는 장치로 런타임시 동적으로 클래스를 로드한다.
클래스 로더의 기술적 특징으로는
- Hierarchical
Class Loader는 Hierarchical 하게 생성이 가능하고, Parent class laoder에서, child class loader를 갖는 것과 같이 Class Loader간의 계층형 구조를 갖게 된다. 최상위 Class Loader는 "bootstrap" Class Loader가 위치 하게 된다.
- Delegate load request
Class loading에는 일정한 규칙이 필요하다. 이는 Class Loader가 계측형의 구조를 가지고 있기 때문에, 어느 시점에 Class 로딩 요청을 받으면 상위 Class Loader가 Loding한 Class가 우선권을 가진다.
- Have visibility constraint
Child Class Loader는 Parent Class Loader의 Clss를 찾을수 있지만, 그 반대의 경우는 불가능하다.
- Cannot unload classes
Class Loader에 의해서 Loading된 Class들은 unload 될 수 없다.
자바 네이티브 인터페이스(Java Native Interface, JNI)는 자바 가상 머신(JVM)위에서 실행되고 있는 자바코드가 네이티브 응용 프로그램(하드웨어와 운영체제 플랫폼에 종속된 프로그램들) 그리고 C, C++ 그리고 어샘블리 같은 다른 언어들로 작성된 라이브러리들을 호출하거나 반대로 호출되는 것을 가능하게 하는 프로그래밍 프레임워크이다.
Open JDK
최근에 자바는 OpenJDK를 중심으로 빠르게 변화하고 있다. 올해부터 OpenJDK는 일 년에 두 번 3월과 9월에 새 버전을 공개해 왔다. 점차 OpenJDK 개발에 참여하는 기관도 늘어나고 있다. OpenJDK 개발에 참여하는 인증 기관(기업)은 15개에 달한다. 또한 OpenJDK 소스를 기반으로 GraalVM과 같은 독특한 기능을 갖춘 새로운 자바가 만들어지고 있다. 예전에 자기 환경에 맞는 WAS를 선택했던 것처럼, 내 환경에 맞는 Java를 선택하고 사용하는 Java 다양성 시대로 진입하고 있다. 빠른 버전 업그레이드, OpenJDK에 참여하는 조직 확대 및 다양한 Java의 등장과 같은 특징을 통해서 자바는 빠르게 변하는 환경에 신속하게 적응하는 역량을 확보하고 있다.
OpenJDK의 긍정적인 효과로는 OpenJDK를 기반으로 하는 다양한 JDK가 만들어지고 있다는 것이다. 최근에 자바에 대한 기능 개선 요구가 많아지고 있는데 새로 등장한 개발 언어의 특징과 기능을 요구하기도 하고, 클라우드 인프라를 위한 기능을 요구하기도 한다. JCP의 협의 체제를 근간으로 하는 자바 개발 프로세스는 업계의 다양한 요구 사항을 신속하게 수용하기 어렵다. OpenJDK는 TCK로 새로운 JDK를 인증하는 체계를 갖고 있습니다. 이런 체계를 통해서 JDK의 통일성과 다양성을 만들어 가고 있다. 대표적인 예가 GraalVM와 Azul의 Zulu이다. GraalVM을 사용하면 클라우드 네이티브 애플리케이션에 필요한 다양한 기능을 사용할 수 있다. Java 클래스를 실행 파일로 변환하여 빠르게 실행할 수 있고, java프로그램에서 R 코드를 실행하고 컨텍스트로 변수를 공유할 수 있다. C++ 코드를 자바 코드에서 호출할 수 있다. 또한 GraalVM은 자바로 만든 컴파일러를 제공하여, 자바 프로그램 실행 중에 새로운 코드를 컴파일하여 사용할 수 있다.
*.jar file
1) 일종의 자바 프로젝트 압축 파일로 ZIP 파일 압축 알고리즘을 기반으로 만들어진다. 따라서 2) 반디집, 알집과 같은 zip 프로그램과 호환이 가능하다. JAR 파일은 3) 웹브라우저에서 빠르게 다운로드할 수 있도록, 자바 애플릿을 위한 클래스, 이미지 및 사운드 파일들을 하나의 파일에 압축하여 담고 있는 파일로 4) 사용자의 요청에 의해 웹페이지의 일부로 들어오는 애플릿에는 여러 개의 파일들이 담겨 있을 수 있는데, 각각은 웹페이지와 함께 다운로드 되어야 한다. 이 때 5) 그 파일들을 하나의 파일에 압축하면 다운로드에 소요되는 시간이 절약된다. 자바로 개발한 여러 클래스 파일들 또는 패키지 파일이 있을 때, 이를 하나로 묶으면 그 6) 클래스들을 참조하기도 편하고, 다운 받기도 쉽다. 7) 자바 어플리케이션 프로그램을 개발 후 하나의 파일로 묶어서 실행하게 해준다.
◎ jar명령 사용하기
(1) 명령 구문 : jar {ctxu} [vfm0M] [jar-file] [manifest-file] [-C dir] files ...
(2) {ctxu}는 맨 앞에 나와야 할 필수 옵션이다.
: c (새로운 archive 파일을 생성한다)
: t list table of contents for archive
: x (다음에 지정한 파일들을 archive 파일로 부터 압축을 푼다)
: u (기존 archive 파일에 들어 있는 파일을 수정한다.)
(3) [vfm0M]은 {ctxu} 다음에 오는 옵션이다.
: v (명령화면창으로 진행사항에 관한 메시지를 출력한다.)
: f (archive될 파일이름을 지정한다.)
: m (정보를 manifest파일로 부터 포함한다.)
: 0 (저장만 하고, zip으로 압축하진 않는다.)
: M (추가되는 엔트리에 대한 manifest 파일을 생성하지 않는다.)