현재 스프링 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 부터 지원 )
List<Integer> list = new ArrayList<Integer>();
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)할 수 있는 클래스 또는 인터페이스를 지정하여 해당 허용된 것들만 상속, 구현이 가능하도록 제한할 수 있다.