자바 플랫폼, 스탠더드 에디션

자바 플랫폼 **자바 플랫폼 스탠더드 에디션**(Java Platform, Standard Edition, 약자 Java SE)는 데스크톱 및 서버, 최근의 고사양 임베디드 시스템을 위한 표준 자바 플랫폼으로 표준적인 컴퓨팅 환경을 지원하기 위한 자바 가상 머신 규격 및 API 집합을 포함한다. 따라서 자바 EE, 자바 ME 등 다른 플랫폼은 구체적인 목적에 따라 자바 SE를 기반으로 API를 추가하거나 자바 가상 머신 규격 및 API의 일부를 택해서 정의된다. 자바 플랫폼에 에디션 분류가 도입된 것은 자바 1.2부터로 이전 1.1.x 버전과의 큰 차이를 감안해 자바 2로 부르고 서버 시스템을 위한 API를 추가한 엔터프라이즈 에디션(자바 2 EE), 그 때까지 임베디드 시스템을 위해 만들어진 퍼스널자바(PersonalJava) 및 임베디드자바EmbeddedJava)를 계승한 임베디드 에디션(자바 2 ME) 브랜드를 추가했다. 이후 1.4.x 버전까지 자바 2 SE 1.4.x 혹은 J2SE 1.4.x식으로 명명하다가 1.5 버전에서 J2SE 5.0 식으로 바뀌었다가 1.6 버전부터 자바 SE 6 형태로 명명하게 되었다. 하지만 내부 버전 표기인 1.x.x 형태는 계속 유지되고 있다. 현재 최신 버전 라인은 Java SE 8(1.8.x)와 Java SE JDK(Java Development Kit) 11(11.0.x)이며 Java SE 9부터는 내부 버전도 x.x의 형태로 바뀌었다. 1.4 버전 이전에는 썬 마이크로시스템즈에서 임의로 API를 설계하고 구현해서 공개했으나 J2SE 1.4 이후는 JCP 주도 하에 JSR(Java Specification Request, 자바 명세 작성 요청)을 만들어 포함될 API를 결정하고 각 API는 별도의 JSR를 통해 규격이 제정되고 있다. J2SE 1.4는 JSR 59 하에, J2SE 5.0(프로젝트명 타이거)는 JSR 176, Java SE 6 (프로젝트명 무스탕)은 JSR 170 하에 개발되었다.
# 자바 가상 머신 규격
자바 SE는 자바 가상 머신 규격자바 가상 머신 규격 전체를 지원한다. JVM 규격의 변경이 필요한 기능은 일반적으로 자바 SE에 제안되고 추후 자바 EE 및 ME에 포함된다. 엄밀히 JVM 규격의 일부는 아니지만 API를 통해 실행 시간에 클래스에 대한 정보를 얻고 메서드를 호출할 수 있는 리플렉션(reflection) API와 가비지 콜렉션을 좀 더 세밀히 제어할 수 있는 참조 객체 API(java.lang.ref)도 JVM 구현에 영향을 미치는데 자바 SE에서는 이 들 API도 완전히 지원한다.
# API
자바 SE에 포함되는 API는 자바 EE에 그대로 포함되며 자바 ME에는 일부만 추려서 수용된다. JCP과 과거 썬 마이크로시스템즈에 의해 설계된 API는 java 혹은 javax로 시작되는 패키지 이름을 가지며 그 외 W3C 등 다른 기관에서 정의된 API의 경우 org.w3c.dom과 같이 다른 패키지 이름을 가지기도 한다. 다음 API 개요는 자바 6를 기준으로 한다.
## javax의 유래
패키지 이름이 java로 시작되는 API는 처음부터 자바 SE의 일부로 설계된 것이고 javax로 시작되는 API는 자바 SE와 별개로 선택적으로 사용하도록 제안된 API이거나 그랬던 API가 추후 자바 SE에 수용된 것이다. java와 javax를 구분하게 된 것은 AWT를 기반으로 구현된 GUI 프레임워크인 스윙(Swing) API의 개발과 밀접한 관계가 있다. 초기 스윙 개발이 시작했을 때 스윙은 기존 자바 1.1에서도 실행할 수 있고 동시에 새로운 자바 1.2에서도 실행되는 것을 목표로 했다. 따라서 자바 1.1에는 별도로 다운로드 받아 사용하거나 애플릿 혹은 애플리케이션과 함께 다운로드되는 선택적인 라이브러리임과 동시에 추후 자바 1.2에는 표준으로 들어가야 했다.JFC 패키지 이름 제안 문제는 java로 시작하는 패키지 이름은 특별히 취급되어 다운로드된 코드에서는 사용할 수 없게 되어 있었다는 점이다. 따라서 자바 1.1에서 java로 시작하는 패키지 이름을 사용할 수 없었고 다른 패키지 이름을 택할 수 밖에 없었다.ClassLoader API 문서: "java."로 시작하는 패키지에 클래스를 정의하려고 하는 경우 예외가 발생
## SPI 패키지
자바 표준 API에서는 spi로 끝나는 패키지가 다수 포함되어 있다. 이는 Service Provider Interface의 약자로 spi가 빠진 패키지의 API에 추가로 기능을 끼워 넣을 수 있도록 정의된 인터페이스를 포함하고 있다. 예를 들어 java.awt.im의 입력 방법은 한글 입력 엔진, 한자 입력 엔진 등 다양한 입력 방법에 독립적인 API를 제공하고 있는데 java.awt.im.spi 내의 인터페이스를 이용함으로써 새로운 언어를 위한 입력 방법을 추가할 수 있다.
## UI 관련 API
자바의 UI는 자바 1.0부터 포함된 AWT(Abstract Window Toolkit)을 기본으로 그 위에 구축된 스윙을 포함하고 있다. AWT는 하부 윈도 시스템에 대한 추상화 계층의 역할을 하며 윈도, 사용자 입력, 2D 그래픽 등의 기본적인 서비스를 스윙과 같은 상위 계층에 제공한다. 초기에는 기본적인 2D 그래픽 및 대부분의 윈도 시스템에서 제공하는 버튼 등의 GUI 컴포넌트에 대한 일종의 껍데기를 제공하는 수준에 머물렀으나 고수준 벡터 그래픽 API인 자바 2D, 프린팅, 클립보드, 드래그 앤 드롭(drag & drop), 입력 방법, 접근성 지원, 이미지 파일 입출력, 트레이 지원 등의 데스크톱 통합 등 더 많은 서비스를 제공하도록 확장되었다. 물론 이에 따라 스윙도 이를 기반으로 좀 더 고수준 API를 제공하도록 진화하였다. UI 관련 API들은 패키지 기준으로 다음과 같다. * java.applet: 웹 페이지에 삽입되는 작은 애플리케이션인 애플릿을 지원하기 위한 API. 원칙적으로 애플리케이션과 시스템과의 인터페이스이나 그 자체가 웹 페이지 상의 그래픽 영역을 나타내므로 UI 컴포넌트 형태로 정의되어 있다. * java.awt: 기본적인 2D 그래픽(자바 2D) 및 하부 윈도 시스템 컴포넌트를 감싼 무거운 컴포넌트(heavyweight component)를 담고 있다. * java.awt.event: 키, 마우스 등 입력과 하부 윈도 시스템과의 통신을 위한 이벤트 및 리스너 인터페이스 정의를 담고 있다. * java.awt.color, java.awt.geom, java.awt.font: 색 공간(color space) 및 프로파일, 벡터 그래픽 연산, 글꼴 등 자바2D의 일부가 되는 API를 담고 있다. * java.awt.dnd, java.awt.datatransfer: 드래그 앤 드롭과 클립보드 관련 API를 정의하고 있다. * java.awt.im, java.awt.im.spi: 다국어 입력을 위해 하부 윈도 시스템에서 제공하는 입력 방법과 인터페이스를 할 수 있게 하고 자바로 입력 방법을 작성할 수 있게 한다. * java.awt.image, java.awt.image.renderable, javax.imageio, javax.imageio.event, javax.imageio.plugins.bmp, javax.imageio.plugins.jpeg, javax.imageio.spi, javax.imageio.stream: 이미지 처리 및 입출력 기능을 제공한다. * java.awt.print: 프린팅을 위한 기능을 제공한다. * javax.accessibility: 장애가 있는 사람을 위한 접근성 제공을 위해 UI 컴포넌트가 구현해야 하는 규약을 정의한다. 이를 통해 접근성을 위한 지원 기술들을 통해 UI에 접근할 수 있다. 스윙과 함께 설계되었고 추후 AWT 중량 컴포넌트들에도 적용되었다. 다음은 스윙 관련 패키지들이다. * javax.swing: 스윙 컴포넌트들과 그에 딸린 모델(데이터 혹은 상태) 및 기타 API를 정의한다. * javax.swing.event: 스윙 컴포넌트에서 사용되는 이벤트 객체 및 리스너 인터페이스를 정의한다. * javax.swing.undo: Undo 지원을 위한 API를 정의하고 있다. * javax.swing.border: 컴포넌트 테두리 관련 API들을 정의한다. * javax.swing.colorchooser, javax.swing.filechooser, javax.swing.table: 색 선택, 파일 선택 대화 상자, 테이블 등 복잡한 컴포넌트에 딸린 API를 정의하고 있다. * javax.swing.plaf 및 부 패키지들: javax.swing에 정의된 컴포넌트들에 대해 룩앤필(look & feel)을 교체하기 위한 규약을 정의하고 있으며, basic, metal, synth, multi 등의 부 패키지에는 각각 서로 다른 룩앤필을 구현이 포함되어 있다. API가 공개된 룩앤필은 다른 룩앤필을 만드는데 활용하도록 만들어졌기 때문이다. * javax.swing.text 및 부 패키지들: 텍스트 컴포넌트를 위한 API를 정의하고 있으며 부 패키지들에서는 HTML, RTF 같은 파일 형식을 읽거나 편집하기 위한 구현이 포함되어 있다.
## 입출력 API
기본적으로 java.io 패키지에 스트림 기반 입출력 모델과 기본적인 파일 시스템을 다룰 수 있는 API를 제공한다. 이를 네트워킹, 이미지 입출력 등 입출력이 필요한 API에서 두루 사용했다. 자바 1.4부터 NIO(New I/O) API가 소개됐는데 이는 메모리 영역인 버퍼를 기반으로 채널이라는 새로운 개념을 도입해 더 고성능에 유연한 입출력이 가능해졌다. NIO는 자바 7에서 버전 2로 개선되어 파일 시스템에 대한 보다 세부적인 제어가 가능해 지고 java.io와 완전히 무관하게 파일, 네트워크 입출력을 가능하게 할 예정이다. * java.io: 기본적인 파일 입출력과 다양한 스트림 기반의 입출력 API를 제공한다. * java.nio: java.io와 달리 좀 더 유연하고 고성능인 버퍼(buffer) 기반의 입출력 모델을 제공한다. 특히 직접 버퍼(direct buffer)는 JVM에서 자바 힙(heap) 밖의 메모리를 직접 빠르게 읽고 쓰게 할 수 있게 해 주고 파일을 메모리에 매핑할 수 있도록 해 준다 * java.nio.channels, java.nio.channels.spi: java.nio에 정의된 버퍼를 기반으로 채널(channel) 모델을 정의한다. 이를 통해 논블록킹(non-blocking) 및 비동기(asynchrous) 입출력, 흩어진 버퍼를 이용한 입출력, 다수의 채널을 하나의 스레드에서 다중화해서 처리하게 하는 등의 고성능 입출력을 위한 수단을 제공한다. * java.nio.charset, java.nio.charset.spi: java.nio의 버퍼를 기반으로 16비트 유니코드와 다양한 문자 인코딩 사이의 변환을 담당한다.
## 나머지 API
* java.beans 및 그 부 패키지들: 자바의 표준 컴포넌트 모델인 자바빈즈(JavaBeans) 지원을 위한 API * java.lang: 자바 언어와 관련된 핵심 API. String이 이 패키지에 속한다. * java.lang.annotation: 자바 5에 추가된 애노테이션(annotation)을 지원하기 위한 API * java.lang.instrument: 성능 프로파일러(profiler)를 구현하거나 JVM을 모니터링하기 위한 목적으로 실행 시에 클래스를 재정의함으로써 추가적인 코드를 삽입할 수 있게 해 주는 API * java.lang.management: JVM 모니터링을 위한 API * java.lang.ref: JVM의 가비지 콜렉터와 좀 더 세분화된 상호 작용을 할 수 있는 참조 객체 API. 예를 들어 메모리가 부족해지는 경우만 참조한 객체에 대한 링크를 끊어 버리는 캐시(cache)를 구현할 수 있는 참조 방식을 제공한다. * java.lang.reflect: 실행 시 클래스에 대한 정보를 얻고 정의된 메서드 및 필드를 찾아 내며 호출하고 값을 지정할 수 있게 해 주는 API * java.math: 임의의 정확도까지 지정할 수 있는 BigDecimal 및 BigInteger 클래스를 정의 * java.rmi 및 부 패키지들: RMI(Remote Method Invocation, 원격 메서드 호출)를 지원하기 위한 API * java.security 및 부 패키지들: 자바의 전자 서명 기반 코드 보안 모델 및 암호키, 암호학적 해쉬(hash), 인증서, 전자 서명 등에 관련된 API * java.sql: JDBC(Java DataBase Connectivity) 관련 API로 관계형 데이터베이스에 접속해서 질의를 던지고 결과를 받을 수 있게 지원한다. * java.text 및 그 부 패키지: 문자열 및 날짜, 숫자 등을 포맷팅 할 수 있도록 지원하는 API * java.util: 리스트, 맵 등 콜렉션 API와 기타 유용한 편의 API * java.util.concurrent 및 그 부 패키지들: 다중 스레드 프로그래밍을 위한 기본 도구(동기화 수단 등)를 제공하는 API * java.util.zip 및 java.util.jar: JAR 및 ZIP 파일을 생성하고 읽기 위한 API * java.util.logging: 프로그램에 로그 메시지를 삽입하기 위한 API * java.util.prefs: 윈도의 레지스트리 같은 시스템 및 사용자 선택 사항을 기록하고 읽기 위한 API * java.util.regex: 문자열 정규식 API * javax.accessibility: 장애가 있는 사람을 위한 UI 지원을 위한 기본 규약을 정의. AWT 및 Swing에서 이 규약을 지원 * javax.activation: 자바빈즈 활성화 프레임워크 API. 데이터(이미지 파일 같은)의 타입을 알아내고 그 데이터 형식을 다룰 수 있는 자바빈즈 객체를 생성해서 데이터를 다룰 수 있게 해 주는 프레임워크 * javax.annotation: 일반적인 표준 애노테이션을 정의하기 위한 JSR 250의 결과 중 일부로 몇몇 애노테이션을 정의하고 있다. * javax.activity: CORBA activity 서비스에 관련된 예외를 몇 개 정의 * javax.annotation.processing: 컴파일 전 애노테이션을 처리하기 위한 추가 단계에서 애노테이션을 처리할 수 있는 프로세서를 정의하기 위한 규약 정의 * javax.crypto 및 그 부 패키지들: 암호화 및 복호화, 키 생성, 키 동의 등 암호화 연산을 위한 API