Java 9에서 도입된 Stream API에는 조건(술어)을 기반으로 스트림 요소를 처리하는 두 가지 유용한 메서드가 있습니다. 바로 takeWhile()과 dropWhile()입니다. 두 메서드는 이름이 비슷하지만 동작 방식이 정반대이며, 이를 정확히 이해하면 스트림 데이터를 훨씬 유연하게 다룰 수 있습니다.핵심 차이점 한눈에 보기takeWhile(): 술어(predicate)가 false를 반환할 때까지 스트림의 모든 값을 취득합니다.dropWhile(): 술어와 일치하는 동안 스트림의 모든 값을 버립니다.스트림이 정렬된(ord
Java 9 Process API의 개선 사항자바(Java)는 9 버전에서 Process API를 크게 개선하여 운영체제(OS) 프로세스를 더욱 효율적으로 관리하고 제어할 수 있도록 지원합니다. 이전 버전에서는 순수 자바 코드만으로 운영체제 프로세스를 다루기가 상당히 까다로웠지만, 자바 9부터는 이러한 작업을 수행할 수 있는 새로운 클래스와 인터페이스가 추가되었습니다.ProcessHandle 인터페이스는 네이티브(native) 프로세스를 식별하고 제어 권한을 제공하며, 프로세스의 생존 여부(liveness)를 확인하거나 프로세스를
Java 9 StackWalker API란?StackWalker API는 Java 9에서 새롭게 도입된 기능으로, 메서드 내에서 작업을 수행할 때 손쉽게 필터링하고 지연(lazy) 방식으로 접근할 수 있도록 지원합니다. 스택 트레이스(stack trace) 정보를 효율적으로 얻을 수 있도록 설계된 API입니다.기존에는 Thread.getStackTrace()나 Throwable.getStackTrace()를 통해 전체 스택 프레임을 배열로 받아야 했지만, StackWalker API는 필요한 프레임만 선택적으로 탐색할 수 있어 성능
JShell은 Java 9에서 새롭게 도입된 Java 셸 도구로, 최초의 공식 REPL(Read-Evaluate-Print-Loop) 애플리케이션입니다. 이 도구를 활용하면 문장(statement), 루프(loop), 표현식(expression) 등 간단한 Java 프로그램과 로직을 손쉽게 실행하고 평가할 수 있습니다.Java REPL은 명령 프롬프트에서 간단한 프로그래밍 환경을 제공합니다. 사용자가 입력한 코드를 읽어 들여 즉시 평가하고 그 결과를 출력해 주기 때문에, 작은 코드 조각을 빠르게 테스트하거나 Java 문법을 학습할
Java 9는 JShell이라는 새로운 대화형(인터랙티브) 도구를 도입했습니다. 이 도구를 활용하면 자바의 클래스, 인터페이스, 열거형(enum), 객체, 문장(statement) 등을 사용자 친화적이고 간편한 방식으로 실행하고 테스트할 수 있습니다. JShell은 사용자가 입력한 명령을 평가(evaluate)하여 결과를 즉시 보여주는 방식으로 동작하며, REPL(Read-Evaluate-Print-Loop, 읽기-평가-출력-반복) 원리를 기반으로 작동합니다.JShell의 주요 명령어1. /var — 변수 목록 확인/var 명령어는
Java 9부터는 팩토리 메서드(factory method)를 사용하여 불변(immutable) 리스트, 셋(Set), 맵(Map)을 손쉽게 생성할 수 있습니다. 이를 통해 빈(empty) 컬렉션 또는 요소가 있는(non-empty) 컬렉션 객체를 간편하게 만들 수 있습니다.Java 8 이전 버전에서는 Collections 클래스의 유틸리티 메서드인 unmodifiableXXX()를 활용해 불변 컬렉션 객체를 생성했습니다. 예를 들어, 불변 리스트가 필요하다면 Collections.unmodifiableList() 메서드를 사용해야
Java 9 모듈 시스템이란?Java 9의 가장 큰 변화 중 하나로 꼽히는 모듈 시스템(Module System)은 지그소(Jigsaw) 프로젝트의 일환으로 도입되었습니다. 이를 통해 자바는 더 작고, 안전하며, 효율적인 플랫폼 구조로 재탄생하게 되었습니다.지그소 프로젝트는 다음과 같은 주요 기능들을 포함합니다.모듈화된 JDK(Modular JDK)모듈화된 자바 소스 코드(Modular Java Source Code)모듈화된 런타임 이미지(Modular Run-time Images)자바 내부 API 캡슐화(Encapsulate Ja
Java 9에서 도입된 불변(immutable) 정적 팩토리 메서드 Set.of()를 사용하면 수정 불가능한(unmodifiable) Set을 아주 간편하게 생성할 수 있습니다. 기존에는 Collections.unmodifiableSet() 등을 활용해 번거롭게 불변 컬렉션을 만들어야 했지만, Java 9부터는 한 줄의 코드로 손쉽게 처리할 수 있습니다.이 메서드로 생성된 Set 인스턴스는 다음과 같은 특징을 가집니다.불변성(Immutability): 팩토리 메서드가 반환하는 Set은 규약상 불변(immutable)입니다. 즉, 요
Arrays 클래스는 배열을 조작할 수 있는 다양한 메소드를 포함하고 있으며, 배열을 리스트 형태로 다룰 수 있게 해주는 정적 팩토리 메소드도 함께 제공합니다. Java 9에서는 Arrays 클래스에 세 가지 중요한 메소드가 새롭게 추가되었습니다. 바로 Arrays.equals(), Arrays.compare(), 그리고 Arrays.mismatch()입니다. 1. Arrays.equals() Java 9에서는 기존의 Arrays.equals() 메소드에 여러 개의 오버로드 버전이 추가되었습니다. 새로 추가된 메소드는 두 배열에
리스트의 불변(unmodifiable) 인스턴스가 한 번 생성되면 해당 리스트에서 요소를 추가, 삭제 또는 교체할 수 없을 때, 이 리스트를 수정할 수 없는 리스트라고 합니다. Java 9에서는 정적 팩토리 메서드인 List.of()를 통해 이러한 불변 리스트를 매우 간편하게 생성할 수 있습니다.List.of() 메서드로 생성된 리스트 인스턴스는 다음과 같은 특징을 가집니다.팩토리 메서드가 반환하는 리스트는 관례상 불변(immutable)입니다. 즉, 요소를 추가, 삭제 또는 교체할 수 없으며, 리스트에 대해 변경자(mutator)
수정 불가능한 Map(Unmodifiable Map)이란 한 번 생성되면 키(key)와 값(value)을 추가, 삭제 또는 수정할 수 없는 Map을 말합니다. Java 9에서는 Map 인터페이스에 추가된 정적 팩토리 메서드인 Map.of()와 Map.ofEntries()를 사용해 이러한 불변 Map을 매우 간편하게 생성할 수 있습니다.이 두 메서드로 생성된 Map 인스턴스는 다음과 같은 특징을 가집니다.팩토리 메서드가 반환하는 Map은 사실상 불변(immutable)입니다. 즉, 키와 값을 추가, 삭제, 변경할 수 없으며, 변경 메
ofNullable() 메서드는 Stream 클래스에 포함된 정적(static) 메서드로, 전달된 값이 null이 아니면 해당 요소 하나만 담고 있는 순차 스트림(sequential stream)을 반환하고, null이면 빈 스트림(empty stream)을 반환합니다.Java 9에서 새롭게 도입된 이 메서드는 스트림 처리 과정에서 발생할 수 있는 NullPointerException을 방지하고, 값이 null인지 매번 확인하는 번거로운 null 검사 코드를 제거해 줍니다. 즉, ofNullable() 메서드의 핵심 목적은 값이 n
Java 9에서 도입된 orTimeout()과 completeOnTimeout() 메서드는 모두 CompletableFuture 클래스에 정의되어 있으며, 비동기 작업의 시간 초과를 처리하는 데 사용됩니다. 두 메서드의 핵심 차이점은 시간 초과가 발생했을 때의 동작 방식에 있습니다.orTimeout() 메서드는 주어진 시간 내에 작업이 완료되지 않으면 TimeoutException을 발생시켜 CompletableFuture를 예외적으로 완료합니다. 반면 completeOnTimeout() 메서드는 시간 초과가 발생하면 미리 지정한
Java 9에서는 Collections API에 여러 정적 팩토리 메서드(static factory method)가 추가되었습니다. 이 메서드들을 활용하면 수정할 수 없는(unmodifiable) 리스트, 셋, 맵 컬렉션 객체를 몇 줄의 코드만으로 간편하게 생성할 수 있습니다. List.of(), Set.of(), Map.of(), Map.ofEntries()는 Java 9에서 불변(immutable) 컬렉션을 만들 수 있도록 제공되는 대표적인 정적 팩토리 메서드입니다. 불변 컬렉션의 주요 이점 적은 힙(Heap) 공간 사용: 이
Java 8과 Java 9의 iterate() 메서드 차이 Java 8에서 Stream API의 iterate() 메서드는 seed(초기값)와 단항 연산자(UnaryOperator)를 인수로 받습니다. 이렇게 생성된 스트림은 기본적으로 무한(infinite)스트림이므로, 개발자가 limit(), findFirst(), findAny() 같은 연산을 활용해 명시적인 종료 조건을 직접 추가해야 했습니다. 반면 Java 9부터는 iterate() 메서드에 새로운 인수인 Predicate가 추가되었습니다. 이 Predicate에 스트림을
자바 9에서는 인터페이스(interface) 내부에 private 메서드를 정의할 수 있게 되었습니다. 자바 8에서 도입된 static 메서드와 default 메서드에 이어 등장한 이 기능은 인터페이스 자체 안에서 공통 코드를 재사용할 수 있도록 해주는 중요한 변화입니다.기존에는 여러 default 메서드에서 동일한 로직이 필요할 때마다 코드를 반복해서 작성해야 했고, 이는 곧 코드 중복(code duplication)으로 이어졌습니다. private 메서드의 등장으로 이러한 문제가 깔끔하게 해결되었습니다.인터페이스에서 privat
Java 9는 Process 클래스에 새로운 메소드들을 추가하여 기능을 크게 개선했습니다. 또한 프로세스와 관련된 모든 세부 정보를 손쉽게 조회할 수 있도록 ProcessHandle 인터페이스와 ProcessHandle.Info 인터페이스를 새롭게 제공합니다.Java 9에서 Process 클래스에 추가된 새로운 메소드boolean supportsNormalTermination(): destroy() 메소드의 구현이 프로세스를 정상적으로 종료하는 방식이라면 true를 반환하고, 그렇지 않으면 false를 반환합니다.long pid()
Java Shell, 즉 JShell은 Java 9부터 공식적으로 도입된 REPL(Read-Evaluate-Print-Loop) 도구입니다. 별도의 main() 메서드 작성이나 코드 컴파일 과정 없이도 대화형 셸 환경에서 빠르게 프로토타이핑과 디버깅을 수행할 수 있다는 점이 가장 큰 장점입니다. 명령 프롬프트(또는 터미널)에서 jshell이라고 입력하기만 하면 바로 실행할 수 있습니다.1. 스니펫 저장하기 — /saveJShell에서 작성한 스니펫 소스 코드는 /save [-all|-history|-start] 명령을 사용해 파일로
JShell은 기존에 존재하는 클래스, 변수, 또는 메서드 이름을 일부만 입력한 상태에서 Tab 키를 누르면 자동 완성(auto-completion) 기능을 제공합니다. 입력한 내용만으로 항목을 특정할 수 없는 경우에는 가능한 옵션들을 보여줍니다.Tab 키를 눌렀을 때 수행되는 작업JShell에서 Tab 키를 누르면 다음 중 하나의 동작이 실행됩니다.입력한 내용과 일치하는 다른 이름이 없을 경우, JShell이 나머지 이름을 자동으로 입력해 줍니다.동일한 문자로 시작하는 이름이 여러 개 존재하는 경우, JShell은 해당 이름들의
JShell은 Java 9부터 도입된 Read-Evaluate-Print Loop(REPL) 도구로, 입력한 선언문, 문장, 표현식을 즉시 평가하고 그 결과를 바로 화면에 보여줍니다. 별도의 클래스나 main 메소드 작성 없이 코드를 빠르게 테스트할 수 있어 학습과 프로토타이핑에 매우 유용합니다. JShell은 명령 프롬프트(터미널)에서 jshell 명령어를 입력하여 실행할 수 있습니다.아래에서는 JShell에서 표현식, 변수, 메소드를 정의하고 활용하는 방법을 살펴보겠습니다.1. 표현식(Expression)JShell에는 유효한