본문 바로가기
Programming Language/JAVA

왜 Java 11을 사용하나요?

by Ray 2021. 5. 17.

1. Java 11의 특징

특징 
    - lambda 파라미터에 지역변수(var) 표현가능
    - Epsilon Garbege Collector : 할당을 처리하지만 메모리를 회수하지는 않습니다 
        메모리를 다 사용하면 OutOfMemory가 발생하고 JVM은 셧다운된다.
        수명이 짧은 서비스와 가비지를 사용하지 않는 것으로 알려진 애플리케이션에 유용
    - 모듈 : 모듈을 통해 애플리케이션에 필요한 구성 요소만 포함하는 런타임 구성을 사용자 지정가능
             메모리 공간을 더 적게 사용 -> 특히 마이크로서비스 아키텍처에서 유용
             모듈이 내보내는 패키지와 필요한 구성 요소를 명시적으로 선언하고 반사적 액세스를 제한
             -> 강력한 캡슐화를 적용
    - HTTP Client : Java 표준 HTTP 클라이언트 API.
                    HTTP 통신을 위해 사용된 코드보다 성능이 개선됨
                    HTTP/1.1, HTTP/2, WebSocket을 지원
    - JVM과 핵심 라이브러리 성능 향상
    - 프로파일링 진단 : Java Flight Recoder 
                       -> 실행 중인 Java 애플리케이션에서 진단 및 프로파일링 데이터를 수집
                       Java Mission Control 
                       -> JFR 및 JMC를 사용하면 메모리 누수, GC 오버헤드, 핫 메서드, 스레드 병목 상태 및 I/O 블로킹과 같은 런타임 문제를 진단
                       통합 로깅 
                       -> 세분화된 로깅은 JVM 충돌에 대한 근본 원인 분석을 수행하고 프로덕션 환경에서 성능 문제를 진단하는 데 유용
                       오버헤드가 낮은 힙 프로파일링 
    - 새로운 String 메소드 추가
                    strip(): 문자열 앞, 뒤의 공백 제거.
                    stripLeading(): 문자열 앞의 공백 제거.
                    stripTrailing(): 문자열 뒤의 공백 제거.                    

=> Java 8과 Java 11은 현재 Java LTS버전이며, Java 8에 비해 Java 11이 위와 같은 특징 및 장점을 가지고 있으므로 사용이 지향된다.

2. Java 8의 특징

Java 1.5의 제네릭 추가에 이어 가장 큰 변화가 일어난 업데이트이다.
그리고 가장 큰 변화와 특징은 람다와 스트림이다.

- lambda : 람다는 함수형 프로그래밍에서 사용되는 개념으로 '익명 함수'를 말한다.
           메소드를 하나의 식(expression)으로 표현하는 것으로, 메소드의 이름과 반환값이 없어서 '익명 함수'라고도 한다.
           람다식은 메소드의 매개변수로 전달될 수 있고, 메소드의 결과로 반환될 수 있다.
           또한, 매개변수 타입은 추론이 가능한 경우 생략할 수 있다.

           특징 
                - 익명 : 보통의 메소드와는 달리 이름이 없다.
                - 함수 : 메소드처럼 특정 클래스에 종속되지 않으므로 함수이다.
                - 전달 : 람다식을 메소드의 파라미터로 전달하거나 변수로 저장할 수 있다.
                - 간결성 : 익명 클래스처럼 필요없는 코드로 구현할 필요가 없다.

            목적 : 함수형 프로그래밍 패러다임으로 전환하기 위한 하나듸 '단계'이다.
                   이를 통해, 불필요한 코드를 줄이고 가독성을 향상시킬 수 있다.

            표현 : (파라미터) -> {몸체}
                 - 파라미터와 몸체로 구분
                 - 파라미터와 몸체 사이에 ->를 추가하여 식을 완성
                 - 몸체 부분이 단일문인 경우 중괄호와 return문 생략 가능

            한계 
                - 함수형으로 새롭게 정의한 것이 아니라, 기존의 인터페이스 형태를 축약형으로 표현.
                - 완전히 함수형 패러다임으로 적용할 수 없음
                - 오직 함수형 인터페이스를 기대하는 곳에서만 사용 가능

- Stream : 함수형 인터페이스를 통한 간단한 내부 데이터 순회 방법이다.
           데이터를 추상화해서 다루고, 다양한 형태로 저장된 데이터를 위한 공통된 방법을 제공한다.
           즉, 컬렉션이나 배열같은 저장 요소를 하나씩 참조하여 람다식을 적용하고 반복적으로 처리할 수 있도록 하는 기능이다.

           특징 
                - 내부 반복을 통해 작업을 수행
                - 재사용이 불가 -> 단 한번만 사용가능
                - 원본데이터를 변경하지 않음
                - filter-map기반의 API를 사용하며, Lazy연산을 통해 성능을 최적화
                - parallelStream() 메소드를 통해 간단한 병렬처리 지원 

            목적 : 불필요한 코드(for문, if문 등)을 줄이고 직관적으로 표현하여 가독성을 높인다.

            구조 : 스트림생성().중개연산().최종연산();

+ Java 버전별 특징 정리

JDK 1.1 - inner class
        - Java Beans
        - RMI
        - reflection
        - unicode
        - internationalization

J2SE 1.2 - strictfp
         - SWING GUI
         - JIT CORBA
         - Collections

J2SE 1.3 - HotSpot JVM
         - JNDI
         - JPDA
         - JavaSound

J2SE 1.4 - assert
         - regular expression
         - NIO
         - IPv6
         - XML API
         - JCE
         - JSSE
         - JASS
         - Java Web Start

J2SE 5  - generics
        - annotation
        - auto boxint / unboxing
        - enumeration
        - 가변길이 파라미터
        - static import
        - concurency API

Java SE 6 - interface에 @Override 추가됨
          - JDBC 4.0
          - Scripting Language Support
          - Java Compiler API
          - plugable annotation

Java SE 7 - diamond operator <>
          - try-resource
          - multi-catch
          - switch문에 String 사용
          - concurency API(new)
          - File NIO(new)
          - Java2D 지원
          - dynamic Language 지원

Java SE 8 - lambda expression
          - type annotaion
          - stream api 추가
          - repeating annotation
          - static link library
          - interface default method
          - unsigned integer 계산
          - 날짜와 시간 API(new) -> JodaTime
          - rhino 대신 nashorn javascript 엔진 탑재

Java SE 9 - Jingsaw 기반 런타임 모듈화(module)
          - JShell 추가(인터프리터 쉘처럼 사용)
          - private interface method
          - immutable collection
          - 통합 로깅
          - HTTP/2
          - HTML 5 JavaDoc
          - 프로퍼티 파일에 UTF-8지원

Java SE 10 - var 키워드를 이용한 지역변수 타입 추론
           - 병렬처리 가비지 컬렉터
           - 개별 Thread로 분리된 Stop-The World
           - 루트 CA
           - JVM Heap 영역을 시스템 메모리가 아닌 다른 메모리에도 할당

Java SE 11 - lambda 파라미터에 지역변수 문법
           - 엡실론 가비지 컬렉터
           - HTTP 클라이언트 표준화

Java SE 12 - switch문 확장(->)
           - 가비지 컬렉터 개선
           - 마이크로 벤치마크 툴 추가
           - 성능 개선

Java SE 13 - switch문에 yield 예약어 추가