Dev/JAVA

[JAVA] Java version에 대한 기록

just-e 2021. 1. 13. 00:02

Java 버전마다 바뀐점을 알아보자

목차

  • Java Overview란
  • Java 분류
  • Java 버전

내용

JavaOverview

  • Sun Microsoft에서 1995년에 개발한 객체지향 프로그래밍 언어로 창시자는 제임스 고슬링이다.
  • 2010년에 Sun이 오라클에 인수되어 현재 Java의 저작권자는 Oracle로 2019년 1월부터 유료화되었다.
  • Java EE는 이클립스 재단의 소유이다.

Java 분류

  • Java SE(Java Standard Edition / J2SE)
    • 대부분의 사람들이 가장 많이 접하는 표준 에디션으로, Java의 핵심 API화 기능들을 제공한다.
  • Jakarta EE, 구 Java EE(Java Enterprise Edition / J2EE)
    • 기업에서 운영하는 서버 페이지에 특화된 에디션이다. JSP와 서블릿을 비롯한 웹 애플리케이션 서버에 관련된 기술들이 포함되어 있다.
  • Java ME(Java Micro Edition / J2ME)
    • PDA나 셋톱박스, 센서 등의 임베디드 시스템 환경에 특화된 에디션이다.
  • JavaFX
    • 데스크톱 애플리케이션 개발 및 배포를 위한 에디션으로 크로스 플랫폼 이식과 GUI 라이브러리를 제공한다.

Java 버전 / J2SE: 15, Java SE: 6

  • Java 1.0 / JDK 1.0
    • 1996년 1월 23일에 발표.
    • 발표 이전에 이름은 Oak였으며, 안정화 작업을 거친 이후 Java로 이름 변경.
  • Java 1.1 / JDK 1.1
    • 1997년에 2월 19일 발표.
    • 주요 사항
      • AWT 이벤트 모델을 광범위하게 재구성.
      • 언어에 추가된 Inner Class, JavaBeans, JDBC, RMI, Replection, 유니코드 지원, 국제화 등이 추가.
  • Java 1.2 / J2SE 1.2
    • 1998년 12월 8일 발표.
      • 일반 지원은 2003년 11월 종료.
    • GUI, JIT, CORBA 등의 굵직한 기능이 추가(59개의 패키지에서 1520개의 클래스로 Java 플랫폼의 크기를 3배 늘림.)되면서 2부터 약칭을 J2SE(Java 2 Standard Edition)로 표기하기 시작.
    • 주요 사항
      • 썬의 JVM에는 처음으로 JIT 컴파일러가 장착.
      • Java Applet을 구동하는 웹 브라우저 플러그인
      • strictfp, Swing, GUI, CORBA, Collections 등이 추가.
  • Java 1.3 / J2SE 1.3
    • 2000년 3월 8일 발표.
      • 일반 지원은 2006년 11월 종료.
    • 주요 사항
      • HotSpot JVM 포함
      • RMI가 CORBA를 지원하도록 변경.
      • JNDI(핵심 라이브러리에 포함)
      • JPDA(Java 플랫폼 디버거 아키텍처)
      • JavaSound, 합성 프록시 클래스 등이 추가.
  • Java 1.4 / J2SE 1.4
    • 2002년 2월 6일 발표.
      • 일반 지원은 2008년 10월, 연장 지원은 2013년 2월 종료.
    • 주요 사항
      • 언어 변경 assert 키워드.
      • 인터넷 프로토콜 IPv6 지원.
      • 통합 보안 및 암호화 확장(JCE, JSSE, JAAS)
      • 환경 설정 API(java.util.prefs)
      • 정규표현식, Non-Blocking IO(NIO), XML API, Java Web Start 등이 추가.
  • Java 5 / J2SE 5.0
    • 2004년 9월 30일 발표.
      • 일반 지원은 2009년 9월, 연장 지원은 2015년 5월 종료.
    • 주요 사항
      • J2SE 5.0까지 Windows 9x와 Windows NT 4.0이 지원.
      • 이때부터 버전 중 앞의 1을 제외하고 표기하기 시작. 그러나 내부적으로 여전히 1.5, 1.6, 1.7 등을 사용.
      • Generics: 컬렉션에 컴파일 유형 안전성을 제공하고 대부분의 유형 변환이 필요하지 않음.
      • Annotation: AOP(Ospect Oriented Programming: 관심지향 프로그래밍)을 편리하게 구현.
      • Auto Boxing/Unboxing: 기본 유형(int 등)과 래퍼 클래스(Integer 등) 간의 자동 변환
      • Enumeration: enum 키워드는 typesafe를 생성하며, 순서형 값을 만듦.
      • 가변 길이 파라미터(Varargs): e.g.) void main(String… lines)
      • Static Import, 새로운 Concurrency API 들이 추가.
      • Java는 표준 입력(stdin) 지원이 안 좋았는데, J2SE 5에 들어서 java.util.Scanner가 추가되면서 이전보다 편하게 표준 입력을 사용하게 됨.
  • Java 6 / Java SE 6
    • 2006년 12월 11일 발표.
      • 일반 지원은 2013년 2월, 연장 지원은 2018년 12월 종료.
    • 주요 사항
      • 이때부터 표기가 J2SE에서 Java SE로 변경되었고, `.0`을 삭제.
      • Scripting Language Support: Mozilla JavaScript Rhino 통합을 위한 API로 스크립팅 언어와의 통합 및 기본 제공.
      • JDBC 4.0, Java Compiler API, Pluggable Annotation 등 추가
  • Java 7 / Java SE 7
    • 2011년 7월 7일 발표.
      • 일반 지원은 2015년 4월 종료. 연장 지원은 2022년 7월 종료 예정.
    • 주요 사항
      • Dynamic Language 지원 switch 문에서 String 사용.
      • try문에서 자동 자원 관리.
      • Diamond Operator<>, 이진수 리터럴, 숫자 리터럴에 _ 지원.
      • 새로운 Concurrency API, 새로운 NIO 라이브러리, Elliptic Curve Cryptography, Java2D를 위한 Xrender, Upstream, Java Deployment Ruleset 등이 추가.
  • Java 8 / Java SE 8
    • 2014년 3월 18일 발표.
      • 일반 지원은 2019년 1월에 종료. 연장 지원은 2023년 9월에 종료될 예정.
    • Lambda Expression, Rhino 대신 Nashorn JavaScript 엔진 탑재.
    • Annotation on Java Types, Unsigned Integer 계산, Repeating Annotation, 새로운 날짜와 시간 API, Static Link JNI Library, Interface Default Method, PermGen 영역 삭제, Stram API 등이 추가.
    • Java 9 발표의 지연 때문에 2018년 9월로 연장되었다가, 이후 라이선스 이관 문제로 인해 2019년 1월로 다시 연장.
    • 32비트를 지원하는 마지막 공식 Java 버전으로, 이후 버전의 32비트 지원은 오직 서드파티를 통해서만 지원.
  • Java 9 / Java SE 9
    • 2017년 9월 21일 발표.
      • 일반 지원은 2018년 3월에 종료.
    • 주요 사항
      • Project Jigsaw기반으로 런타임이 모듈화된 것.
        • 런타임의 모듈화는 하위 호환성을 어느 정도 포기하고 성능을 추구한 것.
        • 콘솔 프로그램 개발에는 더 이상 AWT나 Swing 같은 불필요한 라이브러리를 사용X, 최상위 모듈인 Base만 사용.
        • 특정 프로그램에 최적화된 최소 런타임을 제작할 수 있게 되면서 패키징 역시 간편.
      • Java를 인터프리터 언어 셸처럼 사용할 수 있는 JShell이 추가.
      • Java 바이트코드를 기계어로 미리 번역하는 선행 컴파일(Ahead-Of-Time Compilation) 역시 실험 기능으로 추가.
      • Deprecated 표시에는 해당 버전과 제거 예정 여부를 표시.
      • 불변 컬렉션을 생성할 수 있도록 새로운 팩토리 메서드 추가.
      • 통합 로깅, HTTP/2, private 인터페이스 메소드, HTML5 Javadoc 등도 지원.
      • 프로퍼티 파일에 UTF-8이 지원되어 인코딩 문제로 고생할 필요가 없어짐.
      • Java Applet 기능 지원 종료.
  • Java 10 / Java SE 10
    • 2018년 9월 25일 발표.
      • 일반 지원은 2018년 9월에 종료.
    • 주요 사항
      • var 키워드를 이용한 지역 변수 타입 추론가능하며, C#과 기능 동일.
      • 병렬 처리 가비지 컬렉션, 개별 쓰레드로 분리된 Stop-The-Word, 루트 CA 목록 등이 추가.
      • JDK의 Repository가 하나로 통합되었으며, JVM Heep 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당할 수 있게 됨.
      • 실험 기능으로 Java 기반의 JIT 컴파일러 추가.
      • Deprecated API는 Java SE 10에서 완전 삭제되어 컴파일 불가.
  • Java 11 / Java SE 11
    • 2018년 9월 25일 발표.
      • 일반 지원은 2023년 9월, 연장 지원은 2026년 9월에 종료될 예정.
    • 주요 사항
      • 이클립스 재단으로 넘어간 Java EE가 JDK에서 삭제되고, Java FX도 JDK에서 분리되어 별도의 모듈로 제공.
      • 람다 파라미터에 대한 지역 변수 문법, 엡실론 가비지 컬렉터, HTTP 클라이언트 표준화 등의 기능 추가.
      • 가장 큰 변화는 라이선스 부분
        • Java SE11부터 Oracle JDK의 독점 기능이 오픈소스 버전인 OpenJDK에 이식.
          • Oracle JDK와 OpenJSK가 완전히 동일해진다는 뜻.
        • Oracle JSK는 Java Se11부터 LTS(장기 지원) 버전으로 3년마다 출시되는데 출시 후 5년 동안 오라클 기술 지원이 제공되고 최대 3년까지 지원기간 연장.
          • Oracle JDK는 이제 3년에 한 번 출시되니 Java의 실질적인 version up을 담당하는 것은 OpenJDK가 된 셈.
          • OpenJDK는 기업들을 위한 기술 지원X.
          • 새로운 버전이 나오면 이전 버전에 대한 마이너 업데이트와 보안 업데이트는 중단.
        • Oracle JDK 구독형 유료 모델로 전환.
          • 2019년 1월부터 오라클이 제공하는 모든 JDK는 유료화되며, 구독권을 구입하지 않으면 JDK에 접근 자체가 금지.
          • 기존 일반/연장 지원 서비스는 구독권에 포함되므로 별도의 서비스로 제공 X.
          • 개인 사용자는 2021년 1월부터 비용 지불.
          • 많은 기업들이 Oracle JDK에서 발을 빼거나, OpenJDK를 기반으로 한 다른 서드파티 JDK가 대안으로 떠오름.
  • Java 12 / Java SE 12
    • 2019년 3월 19일 공개.
    • 가비지 컬렉터 및 성능 개선.
    • 특징 중 하나로 문법적으로 Switch문을 확장.
      • 기존) switch(day) { case MONDAY: case FRIDAY: case SUNDAY: System.out.println(6); break; case TUESDAY: System.out.println(7); break; case THURSDAY: case SATURAY: System.out.println(6); break; case WEDNESDAY: System.out.println(6); break; }
      • 바뀜) switch(day) { case MONDAY, FRIDAY, SUNDAY -> System.out.println(6); case TUESDAY -> System.out.println(7); case THURSDAY, SATURAY -> System.out.println(6); case WEDNESDAY -> System.out.println(6); }

참조 자료

'Dev > JAVA' 카테고리의 다른 글

[JAVA] 변수(Variable), 연산자(Operator), 조건문과 반복문  (0) 2021.01.12
[JAVA] 자바란?  (0) 2021.01.12