현재 스프링 3.0 이상의 버전을 기반으로 프로젝트를 하고 있고

최근 우아한테크코스 프리코스를 참여해서 Java 17 버전으로 1달간 미션을 진행해보았다.

두 경험을 하면서 기초적인 반복문 제어문을 다루는 것을 넘어,
다양한 자바 API를 사용할 기회가 있었는데
비교적 최근인 2021년 9월 14일에 출시된 자바 17 이어서
자바의 다양한 API를 사용해볼 수 있었다.

우아한테크코스 최종 코딩테스트를 준비하면서
언제 프레임워크 단이 아닌, 자바의 본질에 대해 밀도있게 학습할 수 있을까 싶어
자바 기초부분 부터 숙달까지 싹 다 점검하고 있는 와중에
어떤 블로그에서 자바 버전별 특징을 정리해놓은 글을 보았다.

내가 주로 사용하는 언어의 역사를 제대로 알아야 하지 않겠는가?
하는 생각과 정리하는게 왠지 재밌어 보여서
내 나름대로 정리해보려고 한다!
이후에는,

  • 객체지향 프로그래밍과 Java
  • Java Stream API, Lambda, Functional Interface
  • Java Collection Framework
  • 다양한 Java API

에 대한 순서로 프리코스 최종 코딩테스트 ( 23.12.16 ) 전 까지 정리해보려 한다.

JDK 1.0

  • 1996년 1월에 공개되었다.
  • 발표 이전에 불린 이름은 Oak 였다.
  • 1.0.2 버전까지 안정화 작업을 거쳤고, Java로 이름이 바뀌었다.

JDK 1.1

  • 1997년 2월에 공개되었으며, JDBC(Java DataBase Connectivity), Inner Class, Java Beans, RMI(Remote Method Invocation), Reflection ( 객체를 통해 클래스의 정보를 분석해내는 프로그램 기법 ), Unicode 지원, Internationalization이 추가됨.

Java Beans

  • 자바로 작성된 SW Component
  • 뷰와 로직을 분리하여, 일관된 방식으로 자바 클래스를 사용할 수 있게 도와준다.

Beans 규약

  • 기본 생성자가 반드시 존재해야 한다.
  • 모든 속성은 private 접근 제어자를 가진다.
  • 속성에 접근 및 가져올 수 있는 getter, setter 메서드를 구성한다.
    ( 개인적 생각 : 요즘엔 객체 속성의 불변성 보장, 외부에서 객체의 상태를 꺼내서 쓰는게 아닌, 객체 자체가 일하는 방향으로 구현하는 것이 좀더 '객체가 일하는' 객체지향 프로그래밍 방식에 부합해 이 규약은 요즘엔 효용성이 없는 것 같다 )
  • Serializable을 구현한다.
    ( 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록
    바이트(byte) 형태로 데이터 변환하는 기술, 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러서 이야ㅎ기 함 )
    ( Serializable I/F 구현 시, JVM에서 해당 객체를 저장하거나, 다른 서버로 전송이 가능해진다. )

J2SE 1.2

  • 1998년 12월에 공개
  • Swing GUI, JIT, Collection Framework 등의 기능이 추가되었다.
  • 여기서부터 약칭을 J2SE(Java 2 Standard Edition)으로 표기했고, 이 표기는 5까지 사용된다.

J2SE 1.3

  • 2000년 3월에 공개
  • HotSopt JVM, JNDI, JPDA, JavaSount 등이 추가되었다.
    ( Hot 한 Spot을 찾아내서 해당 부분에서 JIT 컴파일러를 사용하는 방법
    -> 내부적으로 프로파일링을 통해 핫스팟을 찾아내고, 해당 부분에 대한 네이티브 코드를 생성한다.
    Hotspot JVM

J2SE 1.4

  • 2002년 2월 공개
  • assert, 정규표현식, IPv6, Non-blocking IO, XML API, JCE, JSSE, Java Web Start 등이 추가되었다.
    Java assert문

J2SE 5

  • 2004년 9월에 공개
  • Generics, Annotation, Concurrency API, Enumeration, Auto Boxing/Unboxing, 가변 길이 파라미터, static import, Scanner 등이 추가되었다.
  • 이때부터 버전 표기에서 1을 빼기 시작함. ( 하지만 JDK를 다운받아서 보면 내부적으로 1.xx 로 버전이 표시되어 있다. )

Generics

  • 기존 Collection Framework를 사용할 때 발생할 수 있는 ClassCastException을 컴파일 시간에 검증할 수 있다.
  • 즉, 형변환 시 실수가 일어나는 것을 작성 중에 방지할 수 있다.
  • 코드에 대한 데이터를 명확하게 하여 가독성을 높일 수 있다.

Concurrency API

  • 이 API를 통해 병렬 프로그래밍, 멀티 스레드를 쉽게 구현할 수 있다.

Enumeration

  • 데이터 구조를 더 쉽게 정의하고 사용할 수 있는 열거체이다.

Java SE 6

  • 2006년 12월에 공개
  • Scripting Language Support, JDBC 4.0, Java Compiler API, Pluggable Annotation이 추가되었다.
  • 또 가비지 컬렉터 G1 GC를 오직 테스트용으로만 사용하도록 추가했다.
  • 이떄부터 표기가 Java SE로 변경되었다.

Java SE 7 ( LTS )

  • 2011년 7월에 공개
  • Diamond Operator(<>),
    switch문에서 String을 사용 가능,
    try 문 내에 선언된 자원을 try가 종료될 때 자동 해제
    => 자동 자원 관리 기능 ( Try-With-Resources ) 기능
    => try(...) 안에 선언된 객체의 close() 메서드들을 호출함.
    따라서, finally에서 close()를 명시적으로 호출할 필요가 없다.
    -> 단, 자원 객체가 AutoCloseable I/F를 구현해야 한다. ( AutoClosable 또한 Java 7 부터 지원 )
// Java SE 7 이전
List<Integer> list = new ArrayList<Integer>();

// Java SE 7 이후
List<Integer> list = new ArrayList<>();

Java SE 8

  • Lambda Expression, Stream API, Optional, Annotation on Java Types, Unsigned Integer 계산, 새로운 날짜/시간 API, Static Link JNI Library, Interface의 Default 메서드가 추가됨.
  • 32비트를 지원하는 마지막 공식 Java 버전, 이후 버전의 32비트 지원은 오직 서드파티를 통해서만 지원됨.

Java SE 9

  • Interface private method, Reactive Stream API

Java SE 10

  • var 키워드를 통한 지역 변수 타입 추론
  • 병렬 처리 가비지 컬렉션
  • JVM 힙 영역을 시스템 메로리가 아닌 다른 종류의 메모리에도 할당 가능

Java SE 11

  • 2018년 9월에 공개

  • 이클립스 재단으로 넘어간 Java EE가 JDK에서 삭제되고,
    JavaFX도 JDK에서 분리되어 별도의 모듈로 제공된다.

  • String 클래스에 새로운 메서드 추가
    - strip() : 문자열 앞, 뒤에 공백 제거

    • stripLeading() : 문자열 앞 공백 제거
    • stripTrailing() : 문자열 뒤 공백 제거
    • isBlank() : 문자열이 비어있거나, 공백만 포함되어 있는 경우 true 반환
    • repeat(n) : 입력한 수만큼 문자열을 반복한다.
  • Collection I/F에 toArray() 메서드 추가

  • Predicate I/F에 not() 메서드 추가

  • 자바 파일 실행 시, javac을 통해 컴파일 하지 않고도, 바로 java 파일을 실행 가능하게 함.

  • Oracle JDK의 독점 기능이 오픈소스 버전인 Open JDK에 이식되었다.

Java SE 12

  • 2019년 3월에 공개
  • 가비지 컬렉터 개선
  • 성능 개선
  • 유니코드 11 지원
  • switch 문 표현 확장
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

Java SE 13

  • 2019년 9월에 공개
  • switch 문에 yield 예약어가 추가되었다.
var a = switch (day) {
    case MONDAY, FRIDAY, SUNDAY:
        yield 6;
    case TUESDAY:
        yield 7;
    case THURSDAY, SATURDAY:
        yield 8;
    case WEDNESDAY:
        yield 9;
};

Java SE 14

  • 2020년 3월에 공개
  • instanceof 패턴 매칭
  • Record ( Data Object ) 타입을 지원한다.

Java SE 15

  • 2020년 9월에 공개
  • sealed class 미리보기
    - 상속 가능한 클래스를 지정할 수 있는 봉인 클래스가 제공됨.
    - 상속 가능한 대상은 상위 클래스 또는 인터페이스 패키지 내에 속해 있어야 한다.
  • Record 2차 미리보기
  • 다중 텍스트 블록을 지원

Java SE 16

  • 2021년 3월에 공개
  • Record 정식 지원
    레코드 특징
    • 불변(immutable) 데이터 객체를 쉽게 생성할 수 있다.
    • final 클래스가 되어, abstract로 선언이 불가능하고, 모든 클래스 멤버가 final이 된다.
    • 자동으로 필드를 캡슐화 시킨다.
    • 모든 클래스 멤버에 대한 생성자와 public을 갖는 getter, equals, hashCode, toString 메서드가 자동 생성된다.
  • Vector API에 자동 병렬 프로세싱을 지원하는 자동 벡터 API가 추가될 예정
  • 자바 네이티브(JNI 등) 개발 시, C++ 14 규격을 지원하기 시작했다.
  • OpenJDK의 버전 관리가 Mercurial 이었으나, Git으로 대체되었다.
  • OpenJDK 소스를 Github에서 볼 수 있음.
  • ARM 64비트 윈도우 운영체제가 지원된다. MacOS의 경우 실리콘 맥 지원이 시험 빌드에서 네이티브 지원을 시작함.
  • 값 유형의 클래스를 동기화에 사용 시, 경고 메시지가 개선됨.

Java SE 17

  • 2021년 9월에 공개
  • M1 및 이후 프로세서 탑재 컴퓨터 제품군에 정식 지원
  • Sealed Class 가 정식 추가됨.
    - 무분별한 상속은 오히려 설계와 가독성에 있어서 안좋은 영향을 끼친다.
    - Java 15에서 봉인 클래스가 Preview로 제안되었음.
    - 봉인 클래스를 통해 허용되는 하위 유형을 정의하여, 세분화된 상속 제어를 할 수 있음.
    • 즉, 확장(extends) 하거나 구현(implements)할 수 있는 클래스 또는 인터페이스를 지정하여 해당 허용된 것들만 상속, 구현이 가능하도록 제한할 수 있다.

0개의 댓글