JavaRush /Java Blog /Random-KO /새로운 Java... 다시... Java 10을 만나보세요

새로운 Java... 다시... Java 10을 만나보세요

Random-KO 그룹에 게시되었습니다
이전에 개발자들은 몇 년 동안 새로운 Java를 기다렸습니다. 일부는 공포를 품고 일부는 희망을 품었습니다. 시대는 변했고 JDK의 새 버전은 6개월마다 우리를 기쁘게 할 것입니다. 이것이 어떤 결과로 이어질지 아직 명확하지 않다면 전문가의 의견을 확인하세요 . 여기서는 우리가 가장 좋아하는 언어의 최신 버전인 Java 10의 주요 변경 사항을 나열하겠습니다. 새로운 Java... 다시... Java 10을 만나보세요 - 1새로운 "기능" 앞의 대괄호 안에는 JEP 번호, 즉 "JDK Enchancement Proposal"이 표시됩니다. JEP는 OpenJDK를 개선하기 위한 제안이며 승인, 지연 또는 거부될 수 있습니다. 즉, 본질적으로 JEP 모음은 OpenJDK의 개발 전략입니다.

자바 10의 중요한 기능

지역 변수 유형 추론(Local-Variable Type Inference) - Java에 var 키워드를 도입하여 지역 변수의 유형을 명시적으로 지정할 필요가 없도록 하는 제안입니다. 즉, 이제 초기화된 변수의 유형을 지정할 수 없지만 다음과 같이 작성하십시오.
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
이는 이전에 사용해야 했던 ArrayList<String> 유형 정의의 중복을 제거합니다. var가 키워드가 되지 않고 예약된 유형이라는 점이 흥미롭습니다. 즉, 변수, 메소드 또는 패키지의 이름으로 var를 사용할 수 있습니다. 하지만 그런 식으로 클래스 이름을 지정할 수는 없습니다(정말 손실입니다!). JDK 포리스트를 단일 저장소로 병합합니다 . JDK 9에는 root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn 등 8개의 저장소가 있습니다. Java 10에서는 이 전체 포리스트가 단일 저장소로 결합되어 상호 의존적인 변경 세트 저장소 전체에서 원자성 커밋을 수행할 수 있게 됩니다. 가비지 콜렉터 인터페이스는 개발자가 가비지 콜렉터를 제어하기 위해 사용할 수 있는 인터페이스가 아닙니다. 대신 JVM 소스 코드에 깔끔한 가비지 수집기 인터페이스가 있으므로 대체 수집기를 빠르고 쉽게 통합할 수 있습니다. JVM에 자체 가비지 수집기를 추가하려는 사람들은 이러한 개선 사항에 가장 만족할 것입니다. G1 가비지 수집기를 위한 병렬 전체 GC . JDK 9에서는 G1이 기본 가비지 수집기가 되었지만 이전에는 기본 가비지 수집기가 여러 스레드에서 가비지를 수집할 수 있는 병렬 GC였습니다. 이제 G1도 이 작업을 수행할 수 있습니다. 이전에는 단일 스레드에서 수행했기 때문에 때로는 어려움이 있었습니다. 그런데 개발자는 - XX:ParallelGCThreads. [310] 애플리케이션 클래스-데이터 공유 매개 변수를 사용하여 스레드 수를 구성할 수 있습니다. Java 10에서 채택된 이 개발은 향상된 로딩 및 추적을 제공하고 기존 클래스 공유(CDS) 기능을 확장합니다. 애플리케이션 클래스가 일반 아카이브에 위치하도록 허용합니다. 클래스 데이터 공유 또는 짧은 CDS는 *class 확장자를 가진 파일과 함께 작동합니다. 이 기능을 사용하면 클래스의 특정 하위 집합을 선택하고 처리한 후 특수 아카이브로 압축할 수 있습니다. 이 모든 작업은 메모리를 절약하기 위해 수행됩니다. JVM의 서로 다른 인스턴스는 표준 라이브러리에 포함된 동일한 클래스를 로드하는 경우가 많습니다. 그리고 CDS를 사용하면 이러한 모든 JVM 인스턴스가 단일 아카이브를 그 안에 배치된 클래스와 공유할 수 있습니다. 이렇게 하면 프로그램 로딩 시간과 메모리 사용량이 모두 줄어듭니다. 실제로 CDS는 버전 5부터 여러 JVM이 동일한 물리적 또는 가상 머신에서 실행될 때 JVM 시작 성능을 향상시키고 리소스 공간을 줄입니다. 그러나 이전에는 CDS 사용이 부트스트랩 로더로만 제한되었습니다. 이제 Application CDS라는 확장 버전을 사용하면 다른 로더용 클래스가 포함된 특수 아카이브를 로드할 수 있습니다. 스레드-로컬 핸드셰이크는 전역 VM 안전 지점을 실행하지 않고도 스레드 전체에서 콜백을 실행할 수 있도록 하는 JVM 내의 상당히 낮은 수준의 변경입니다. 이를 통해 한 번에(또는 전혀 중지하지 않음) 개별 스레드를 비용 없이 중지할 수 있습니다. [313] 네이티브 헤더 생성 도구(javah)를 제거합니다 . Java 9로 돌아가서 언어 개발자는 불필요한 도구를 적극적으로 제거하기 시작했으며 JEP 313은 이러한 훌륭한 작업을 계속합니다. 코드에 기본 메소드가 있는 경우 javah 도구는 JNI 헤더를 생성합니다. 건강한? 물론 JDK 8부터 기본 javac 컴파일러는 자체적으로 JNI 헤더를 생성할 수 있습니다. 그래서 이제 그들은 javah를 제거하기로 결정했습니다. 그런데 현재 JNI를 대체할 수 있는 파나마 프로젝트가 개발 중입니다 . [314] 추가 유니코드 언어 태그 확장 이 변경은 BCP 47 언어 태그에 대한 추가 유니코드 확장을 구현하기 위해 java.util.Locale 클래스 및 관련 API를 개선하기 위한 것입니다. 특히 통화 유형(cu)에 대한 태그, 첫 번째 날 이제 주(fw), 지역(rg) 및 시간대(tz) 재정의가 지원됩니다. 대체 메모리 장치의 힙 할당 이 혁신은 DRAM 이외의 메모리 유형을 사용하는 사람들에게 도움이 될 것입니다. 기술이 끊임없이 변화하고 있기 때문에 DRAM과 동일한 인터페이스와 성능 특성을 가진 비휘발성 메모리를 사용하는 것이 오늘날 객관적인 현실입니다. 따라서 JEP 316을 사용하면 JVM이 다른 유형의 메모리에 힙을 배치할 수 있습니다. [317] 실험적인 Java 기반 JIT 컴파일러 . 대부분의 JVM을 Java로 다시 작성할 것을 제안하는 Metropolis 프로젝트가 최근 발표되었습니다. 모르는 경우를 대비해 현재 버전은 C++로 작성되었습니다. 글쎄, 당신이 이미 알고 있다면 아마도 처음에는 그러한 아이디어가 당신에게 이상하게 보일 것입니다. JVM이 Java로 작성되었으므로 JVM을 실행하려면 JVM이 필요하지 않습니까? 이것은 서로 반대되는 거울을 연상시키는 재귀입니다. 그러나 현실은 조금 다릅니다. JVM이 Java로 작성되었다고 해서 이를 바이트코드로 컴파일해야 한다는 의미는 아닙니다. 실제로 AOT 컴파일을 사용한 다음 JIT가 코드를 컴파일하여 성능을 향상시킬 수 있습니다.

javac와 같은 도구는 일반적으로 Java 코드를 컴파일하는 데 사용됩니다. Java 프로그램을 바이트코드가 포함된 클래스 파일 세트로 변환합니다. 다음으로 JVM은 바이트코드를 실행하고 해당 인터프리터는 이를 프로세서 명령어로 변환합니다. 인터프리터 외에도 JVM에는 내장 컴파일러가 있으며 바이트코드에서 프로세서에 대한 명령을 생성할 수도 있습니다. 이것은 소위 런타임 컴파일, 즉 시작 중 컴파일입니다. 일반적으로 가장 자주 사용되는 코드는 이러한 컴파일을 거쳐 성능이 향상됩니다.

컴파일러는 다양한 방법으로 작업을 수행할 수 있습니다. JIT 컴파일(적시) - 동적, 프로그램 실행 중에 바로 또는 AOT 컴파일(사전) - 실행 전.

jaotc AOT 컴파일러는 JDK 9에 도입되었습니다. 현재 Hotspot JVM에는 두 개의 JIT 컴파일러인 C1(속도용)과 C2(최적화용)가 포함되어 있습니다.

JEP 317은 JDK용 컴파일러인 Graal 연구 프로젝트를 소개합니다. 이는 Metropolis를 현실로 만들고 JVM이 성능 면에서 C++로 작성된 현재 버전과 일치(또는 그 이상)할 수 있도록 하는 특정 기반입니다. 루트 인증서는 JDK의 표준 인증 기관(CA) 인증서의 기본 세트입니다. TLS와 같은 중요한 보안 구성 요소는 이제 OpenJDK 빌드에서 기본적으로 작동합니다. 이 유용한 추가 기능은 OpenJDK 바이너리와 Oracle JDK 바이너리가 기능적으로 동일한지 확인하기 위해 Oracle이 수행하는 작업의 일부일 가능성이 높습니다. 시간 기반 릴리스 버전 관리 - Java 10에서는 기능 릴리스에 새로운 기능이 추가되고 업데이트 릴리스에서는 버그가 수정됩니다. 기본적으로 JDK 버전 문자열 형식을 설정하는 새로운 방법이 있습니다. JDK 9의 다소 이상한 상황을 수정합니다. 첫 번째 업데이트는 JDK 9.0.1이었으며 이는 매우 논리적입니다. 두 번째 업데이트는 JDK 9.0.4인데 이는 비논리적입니다. 논리는 JDK 9 버전 번호 지정 체계 내에서 계획되지 않은 긴급 업데이트의 경우 업데이트 사이에 공간이 남아 있다는 것입니다. 업데이트가 필요하지 않았으니 그냥 JDK 9.0.2라고 부르면 어떨까요? 새로운 Java 버전 형식은 다음과 같습니다.
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

새로운 API

JDK 10 표준 클래스 라이브러리에는 73가지가 추가되었습니다.
  • java.awt.툴킷

    int getMenuShortcutKeyMaskEx (): 바로 가기 메뉴에 해당하는 가속 키인 확장 수정자 키를 정의합니다.

  • java.awt.geom.Path2D:

    void trimToSize (): 이 인스턴스의 용량을 Path2D현재 크기로 자릅니다. 애플리케이션은 이 작업을 사용하여 경로 저장을 최소화할 수 있습니다. 내부 클래스 Path2D.DoublePath2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset):overloaded toString, 지정된 인코딩을 사용하여 바이트를 디코딩하여 버퍼의 내용을 문자열로 변환합니다.

  • java.io.PrintStream 및 lang.io.PrintWriter:

    이 두 클래스에는 모두 추가 인수를 취하는 세 개의 새로운 생성자가 있습니다 charset.

  • java.io.리더:

    long transferTo (Writer): 이 판독기에서 모든 문자를 읽고 읽은 순서대로 지정된 작성자에 문자를 씁니다.

  • java.lang.Runtime.버전:

    문자열 필드의 새 버전(JEP 322)에 대해 정수 값을 반환하는 4개의 새로운 메서드: feature (), interim ()및 .patch ()update ()

  • java.lang.StackWalker.StackFrame:

  • 문자열 getDescriptor():

    Java Virtual Machine 사양에 정의된 대로 이 스택 프레임이 나타내는 메서드에 대한 핸들을 반환합니다.

  • 문자열 getMethodType():

    return 은 MethodType스택 프레임이 나타내는 메서드의 매개변수 유형과 반환 유형을 나타냅니다.

  • java.lang.invoke.MethodType:

    Class <?> LastParameterType (): возвращает последний тип параметра этого типа метода. Если этот тип не имеет параметров, instead of него возвращается meaning sentinel void.class.

  • java.lang.management.RuntimeMXBean:

    long getPid () возвращает pid запущенной виртуальной машины Java.

  • java.lang.management.ThreadMXBean:

    ThreadInfo [] dumpAllThreads (boolean, boolean, int): возвращает информацию о потоке для всех потоков в реальном времени с трассировкой стека с указанным максимальным количеством элементов и информацией о синхронизации.

  • ThreadInfo [] getThreadInfo (long [], boolean, boolean, int):

    возвращает информацию о потоке для каждого потока, чья идентификация находится во входном массиве, с трассировкой стека указанного максимального количества элементов и информацией о синхронизации.

  • java.lang.reflect.MalformedParameterizedTypeException:

    добавлен новый конструктор, который принимает подробное сообщение в виде строки в качестве параметра.

  • java.net.URLDecoder и java.net.URLEncoder:

    оба этих класса получor новые перегруженные методы расcodeирования и codeирования, которые используют charset в качестве дополнительного параметра.

  • java.nio.channels.Channels:

    Два новых статических перегруженных метода, newReader (ReadByteChannel, Charset) и newWriter (WriteByteChannel, Charset), которые позволяют использовать charset.

  • java.nio.file.FileStore:

    long getBlockSize (): возвращает количество byteов на блок в этом хранorще файлов.

  • java.time.chrono:

    три класса в этом пакете, HijrahEra, MiinguoEra и ThaiBuddhistEra, получor метод String getDisplayName (TextStyle, Locale). Он возвращает текстовое Name, используемое для идентификации эпохи, подходящее для представления пользователю.

  • java.time.format.DateTimeFormatter:

    localizedBy (Locale): возвращает копию этого форматтера с локализованными значениями языка, календаря, региона, десятичного стиля и / or часового пояса, которые заменяют значения в этом формате.

  • java.util:

    DoubleSummaryStatistics, IntSummaryStatistics и LongSummaryStatistics получor новый конструктор, который принимает четыре числовых значения. Он создает непустой экземпляр с указанным счетчиком, минимумом, максимумом и суммой.

  • java.util.List, java.util.Map и java.util.Set:

    каждый из этих интерфейсов обзавёлся новым статическим методом copyOf (Collection). Они возвращают неизменяемые List, Map or Set, содержащие элементы данной коллекции, в своем порядке итерации.

  • java.util.Optional, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong:

    каждый из этих классов получает новый метод orElseThrow (), который по существу делает то же самое, что и get (), то есть если condition выполняется, meaning возвращается. В противном случае генерируется исключение NoSuchElementException.

  • java.util.Formatter и java.util.Scanner:

    Оба этих класса получor три новых конструктора, которые на вход получают charset в дополнение к другим аргументам.

  • java.util.Properties:

    Здесь появился новый конструктор, который принимает аргумент int. Это создает пустой список свойств без значений по умолчанию и с начальным размером, содержащим указанное количество элементов без необходимости динамического изменения размера. Также появилась новая, перегруженная version метода replace, которая принимает три параметра Object и возвращает логическое meaning.

  • java.SplittableRandom:

    void nextBytes (byte []): заполняет предоставленный пользователем массив byteов с генерируемыми псевдослучайными byteами.

  • java.util.concurrent.FutureTask:

    добавлен метод toString (), который возвращает строку, идентифицирующую FutureTask, а также ее состояние завершения. Состояние (в скобках) содержит одну из строк: «Completed Normally» (нормальное завершение), «Completed Exceptionally» (завершение с исключением), «Cancelled» (отменено) or «Not completed» (не завершено).

  • java.util.concurrent.locks.StampedLock:

    новые методы boolean isLockStamp (long), boolean isOptimisticReadStamp (long), boolean isReadLockStamp (long) и boolean isWriteLockStamp (long).

  • java.jar.JarEntry:

    String getRealName (): возвращает настоящее Name этого JarEntry. Если JarEntry является записью мультирелизного jar-file, настроенного для обработки, тогда Name, возвращаемое этим методом — Name пути версии, которую представляет JarEntry. Иначе JarEntry возвращает то же Name, что и ZipEntry.getName ().

  • java.util.jar.JarFile:

    Stream <JarEntry> versionedStream (): возвращает поток записей в файле с версией jar. Подобно методу getRealName для JarEntry, связан с мультирелизными jar-fileми.

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): возвращает локализованное Name для данного Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): возвращает локализованное Name для данного Unicode extension key.

  • java.util.stream.Collectors:

    toUnmodifiableList (), toUnmodifiableSet (), toUnmodifiableMap (Function, Function), toUnmodifiableMap (Function, Function, BinaryOperator) — эти четыре новых метода возвращают коллекторы (Collectors), которые накапливают входные элементы в соответствующую немодифицируемую коллекцию.

  • java.lang.model.SourceVersion:

    теперь это поле RELEASE_10 для представления версии JDK 10.

  • java.lang.model.util.TypeKindVisitor6 и javax.lang.model.util.TypeKindVisitor9:

    что-то не вполне понятное:).

  • R visitNoTypeAsModule (NoType, P):

    посещает псевдо-тип MODULE.

  • javax.remote.management.rmi.RMIConnectorServer:

    У этого класса было добавлено два поля: CREDENTIALS_FILTER_PATTERN и SERIAL_FILTER_PATTERN.

  • javax.ButtonModel:

    Представляете, Swing все еще обновляется!

  • ButtonGroup getGroup ():

    возвращает группу, к которой принадлежит кнопка. Обычно используется с radio buttons, которые являются взаимоисключающими в своей группе.

  • javax.plaf.basic.BasicMenuUI:

    Dimension getMinimumSize (JComponent): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION