자바 개발자면서 자바버전을 한번도 신경써 본적이 없다. 나는 진짜 자바 개발자가 맞는가? 반성하는 겸 자바 버전별 차이점을 알아보자.

모지리 개발자·2022년 8월 19일
14

java

목록 보기
1/3

이번 아이폰은 뭐가 바뀐지 그렇게 신경쓰면서...

나는 아이폰을 거의 10년째 써오고있다. 이번 아이폰은 노치가 없어진다더라, 카메라가 더 커진다더라, 그만큼 무게는 더 무거워진다고 하더라
등등 아이폰 뿐만 아니라 옷, 신발, 기계 등 관심 있는 분야에 대해서는 작년과 올해 제품의 차이, 작년 제품의 장단점, 올해 제품의 장단점을 그렇게 잘 파악하고 알아보려고 하면서 현업 개발자로 일하고 있는 현재 왜 관심 있어야하는 자바 버전별 차이에 대해서는 그렇게 무심했을까?

반성하기 위해, 또 더 깊게 알고 더 나은 개발자가 되기 위해 자바 버전별 차이점에 대해 작성해보려고 한다.

java 1.0 - 1996년 발표

가장 최초의 버전이다. 그 이후에 나온 마이너 버전인 JDK 1.0.2 버전은 최초 안정 버전이며 Java 1 이라고 불리게 되었다.

  • 메모리 관리, 다중 상속등의 기존 문제점을 극복하기 위한 목표로 접근
  • 플랫폼의 안정성 및 웹 브라우저에서의 Java Applet 시연으로 급 인기 상승

java 1.1 - 1997년 발표

추가된 기능은 아래와 같다.

  • AWT의 이벤트 모델의 확장 및 변경
  • 내부 클래스(inner class) 추가
  • JavaBeans, JDBC, RMI 등 추가
    AWT란 Abstract Window Toolkit의 약자로 자바를 이용하여 UI를 구성할 때 사용되는 기반 기술이다.
    JDBC는 Java Database Connectivity의 약자로 자바에서 데이터베이스라는 저장소에 데이터를 담기위한 API를 의미한다.
    RMI는 Remote Method Invocation의 약자로 JVM에 있는 메소드를 호출하는 것이 아니라 원격 JVM에 있는 메소드를 호출하기 위한 기술을 의미한다.

java 1.2 - 1998년 발표

jdk1.2 버전부터 1.5버전까지는 J2SE 로 불렀으며 새로운 버전의 자바라는 의미에서 Java 2라는 이름이 생겼다.
모바일 디바이스를 위한 J2ME나 Enterprise버전을 의미하는 J2EE와 구분하기 위해 이름을 J2SE로 구분하기 시작했다.
이름 뿐만 아니라 아래와 같은 사항이 추가되었다.

  • strict 예약어 추가
  • 자바에서 GUI를 제공하기 위한 Swing이 코어 라이브러리에 추가
  • JIT라는 컴파일러가 Sun JVM에 처음 추가
  • 자바 플러그인 추가
  • COBRA라는 지금은 별로 사용하지 않는 기술과 데이터를 주고 받기 위한 IDL 추가
  • 자바에서 각종 자료구조를 쉽게 처리학 위한 Collections라는 프레임워크 추가

JIT란 Just-In-Time의 약자로 어떤 메소드의 일부 혹은 전체 코드를 네이티브 코드로 변환하여 JVM에서 번역하지 않도록 함으로써 보다 빠른 성능을 제공하는 기술이다.

java 1.3 - 2000년 발표

  • HotSpot JVM 추가
  • COBRA와의 호완성을 위해 RMI 수정
  • 자바에서 사운드르 처리하기 위한 JavaSound 라이브러리 추가
  • JNDI가 코어 라이브러리에 추가
  • 자바의 디버깅을 보다 쉽게 하기 위한 JPDA 추가
  • Synthetic 프록시 클래스 추가

JNDI는 쉽게 말하면, 어떤 객체를 쉽게 찾을 수 있도록 도와주는 이름을 지정한 후, 나중에 그 이름으로 객체를 찾아가는 것을 의미한다.

java 1.4 - 2002년 발표

  • assert 예약어 추가
  • Perl 언어의 정규표현식을 따르는 정규표현식 추가
  • exception chaining이라는 것을 통하여 하위 레벨의 예외의 캡슐화 가능
  • IPv6 지원 시작
  • NIO 라는 non-blocking 추가
  • 각종 로그를 처리하기 위한 logging API 추가
  • JPEG이나 PNG와 같은 이미지를 읽고 쓰기 위한 imageI/O API 추가
  • 통합 XML 파서와 JAXP라는 XSLT 프로세서 추가
  • JCE, JSSE, JAAS와 같은 통합 보안 및 cryptography extensions 추가
  • Java Web Start 추가
  • 각종 설정 값들을 저장하고 읽는데 사용되는 Preferences API(java.util.prefs) 추가

NIO는 이전버전까지의 IO를 처리할 때 사용한 java.io 패키지에서 제공하는 기능의 단점을 보완하기 위한 것이다. 성능이 비교할 수 없을 정도로 빠르다는 장점이 있다.

java 5 - 2004년 발표

상당히 많은 변화가 있던 시점이다.

  • 보다 안전하게 컬렉션 데이터를 처리할 수 있는 제네릭(generic) 추가
  • 어노테이션이라고 불리는 메타데이터 기능 추가
  • 기본 자료형과 그 기본 자료형을 객체로 다루는 클래스 간의 데이터 변환이 자동으로 발생하는 autoboxing 및 unboxing 기능 추가(int 와 Integer 데이터의 자동 변환이라고 생각하면됨)
  • 상수 타입을 나타내는 enum 추가
  • 매개변수의 개수를 가변적으로 선언할 수 있는 varags 추가(String ...strs 형식의 매개변수 선언을 의미함)
  • for 루프에 세미콜론이 아닌 콜론으로 구분하여 배열이나 컬렉션 타입에 저장되어 있는 데이터를 순차적으로 꺼내는 향상된 for루프 추가
  • import 앞에 static을 붙여 정적 import가 가능하도록 해주는 static import 추가

java 6 - 2006년 발표

Java5에 비하면 많은 기능이 추가되거나 변화가 일어나지는 않았다.

  • 스크립팅 언어가 JVM 위에서 수행 가능하게 됨
  • 각종 코어 기능의 성능 개선
  • Compiler API가 추가되어 프로그램에서 자바 컴파일러 실행이 가능

Java 6가 나온 목적은 안정성과 확장성에 있다.

java 7 - 2011년 발표

JDK 7이 나오기 까지 Sun 사는 오라클에 인수되는 등 Java는 여러가지 어려움을 겪었다...
그래서 java 6에서 java 7이 나오기까지 5년 이라는 시간이 걸렸고 오라클 Java 그룹 부사장인 "조지스 샤브"는 JDK 6 이후 7이 나오는 기간이 너무 길었던 것이 Java의 역사에서 가장 실망스러운 일이었다고 밝히기도 했다.
하지만 길었던 시간만큼 지금까지의 버전에서 제공하지 않은 많은 변화가 있었다.

  • 숫자 표시 방법 보완
  • switch 문 String 사용
  • 제네릭을 쉽게 사용할 수 있는 Diamond
  • 예외 처리 시 다중 처리가능

java 8 - 2014년 발표

  • Lambda Expression 추가
  • Streams 인터페이스 추가
  • Default Method 추가

java 9 - 2017년 발표

  • Java Platform Module System(Jigsaw) 추가
  • Java 9 JShell 추가
  • HTML5 Javadoc 추가
  • 익명 클래스에 대한 Diamond Operator 허용
  • 프로세스 API 추가

java 10 - 2018년 발표

  • var 키워드를 이용한 지역변수 타입 추론
  • 병렬 처리 가비지 컬렉션, 개별 쓰레드로 분리된 Stop-The-World 등이 추가
    - 기존에는 Stop-The-World가 발생하면 GC를 실행하면 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈췄었다. GC작업을 완료한 이후에야 중단했던 작업을 시작했는데 이게 개별 쓰레드로 분리되어서 Stop-The-World 시간이 개선되었다.
  • JVM 힙 영역에 시스템 메모리가 아닌 다른 종류의 메모리도 할당 가능
  • Enhanced for Loop를 위한 바이트 코드 생성

java 11 - 2018년 발표

  • hotspot/jvmti 기능 등이 추가
    jvmti를 통해 액세스 할 수 있는 낮은 오버헤드 샘플링 Java 힙 할당 방법을 제공한다.

java 12 - 2019년 3월 발표

  • Switch 문을 확장

java 13 - 2019년 9월 발표

  • Yield 예약어 추가

java 14 - 2020년 3월 발표

  • record라는 데이터 오브젝트 선언 기능이 추가됨
  • record 클래스는 final 클래스라 상속할 수 없음
    record 사용방법

java 15 - 2020년 9월 발표

  • sealed class(봉인 클래스) 추가

java 16 - 2021년 3월 발표

  • OpenJDK 버전 관리가 Mercurial에서 Git으로 바뀜
  • OpenJDK의 소스를 Git에서 확인할 수 있다. OpenJDK github 링크

java 17 - 2021년 9월 발표

  • 의사 난수 생성기를 통해 예측하기 어려운 난수를 생성하는 API 정식 추가

그래서 나는 무슨 버전을 써야해??

휴대폰으로 예시를 들어보자면 보통 새로 출시된 휴대폰은 그전 휴대폰보다 성능이 좋다. 대부분의 사람들은 새로운 휴대폰을 선호하기는 하지만 각각의 기준에 따라 휴대폰을 구입한다. 나는 성능보다는 가격, 성능보다는 무게 등등
그래서 새로운 버전의 휴대폰이 나왔음에도 불구하고 2년전 제품, 1년 전 제품을 찾아서 구매하고는 한다.

자바 버전을 선택할 때도 그래야할까?? -> 똑같다
가장 최신의 버전이 가장 좋다고 말할 수 없다. Java를 사용하는 사용자의 기준에 따라 선택하면 될 것 같다.

어떤 버전을 선택할지는 아래의 블로그를 참고하면 된다.ㅎㅎ

블로그링크

링크 왼쪽 링크의 글을 읽기전까지는 가장 최신의 안정적인 버전을 선택하는 것이 가장 좋다고 생각했는데... 무엇이 정답인지는 계속 찾아봐야겠다.

그래서 뭐 어디까지 알아야해?

솔직히, java언어의 버전별 특징을 다 알고있어야해? 라고 묻는다면 나는 아니라고 생각한다.
자바의 신 책에 의하면 몇 년 동안 자바를 다룬 분들이라도 100% 다 알고있진 못할 것 이라고 한다.

하지만 중요한 것은 Java라는 언어는 지금도 꾸준하게 계속 발전하고 있는 것이라고 생각한다.
이글을 쓰기 전까지 나는 단한번도 Java 버전을 생각하면서 개발을 했던 적이 없다.

중학교, 고등학교 때 한국사를 공부하면서 정말 하기 싫었던 기억이 있다.
나는 이렇게 여쭤봤던 거 같다.

"선생님 저는 미래가 궁금하고 과거에 어땠는지는 별로 안궁금해요"
선생님께서는
"과거를 알아야 미래를 알 수 있는거야"
라고 말씀해주셨다.

자바에 대한 역사도 비슷한 맥락으로 이해하고 있으면 될 것 같다.

왜 발전했었고, 왜 발전하고 있는지를 알고있으면, 어떻게 발전할지도 알 수 있는 개발자가 될 수 있을 것이다.

이번 자바 버전별 특징을 공부하면서 적어도 3월, 9월 쯤에 발표되는 애플의 행사를 보면서 새로 나온 제품에만 관심을 가지는 것이 아니라
이번 3월, 9월 Java 버전은 뭐가 바뀌고 추가되었는지 살펴볼 수 있는 사람이 된 것 같다.

profile
항상 부족하다 생각하며 발전하겠습니다.

0개의 댓글

관련 채용 정보