JShell은 Java 및 Java API를 빠르게 프로토타이핑하고 디버깅하며 학습할 수 있는 대화형 셸을 제공합니다. 별도의 main() 메서드를 작성하거나 코드를 실행 전에 컴파일할 필요가 없다는 점이 가장 큰 장점입니다.클래스 선언 방법클래스는 일반적인 Java 코드를 작성하는 것과 동일한 방식으로 선언할 수 있습니다. JShell은 클래스 선언이 완료되는 시점을 자동으로 감지하여 처리해 줍니다.아래 코드 예제에서는 두 개의 필드(매개변수)와 하나의 메서드를 가진 Employee 클래스를 선언합니다.C:\Users\User&g
모듈(Module)은 패키지들을 담는 컨테이너입니다. 각 모듈에는 모듈 디스크립터(module descriptor)가 포함되어 있으며, 여기에는 모듈 이름, 모듈 의존성(즉, 이 모듈이 의존하는 다른 모듈의 이름), 그리고 내보내는(export) 패키지의 이름이 기술됩니다. 내보낸 패키지는 해당 모듈에 의존하는 모듈만 사용할 수 있습니다.module com.tutorialspoint.app { /** com.tutorialspoint.app 모듈이 의존하는 모듈 선언 */ requires com.tutorialspoi
Java 9부터 InputStream 클래스에 readNBytes() 메서드가 새롭게 추가되었습니다. 이 메서드는 입력 스트림에서 요청한 개수만큼의 바이트를 읽어 지정된 바이트 배열(byte array)에 저장하는 역할을 합니다. readNBytes() 메서드는 다음 세 가지 상황 중 하나가 발생할 때까지 실행을 블로킹(blocking)합니다. len 바이트 만큼의 입력 데이터를 모두 읽은 경우 스트림의 끝(end of stream)을 감지한 경우 예외(exception)가 발생한 경우 또한 이 메서드는 작업이 끝난 후에도 입력
Project Jigsaw(프로젝트 지그소)의 가장 중요한 목표는 모듈화(modularity) 개념을 도입하여 Java 9에서 모듈을 생성하고, 이를 JDK 전반에 적용하는 것입니다. 이를 통해 자바 플랫폼은 더 작고, 안전하며, 확장 가능한 구조로 발전하게 됩니다. 모듈화(Jigsaw)의 주요 장점 강력한 캡슐화(Strong Encapsulation): 모듈은 사용이 허용된 부분에만 접근할 수 있습니다. 패키지가 module-info.java 파일에서 명시적으로 export되지 않는 한, 해당 패키지의 public 클래스라도
JShell이란 무엇인가?JShell은 Java 9부터 도입된 대화형(Read-Eval-Print Loop) 도구로, Java 코드를 실행하고 즉각적인 결과를 확인할 수 있게 해줍니다. 별도의 컴파일이나 빌드 과정 없이도 표현식이나 간단한 알고리즘을 빠르게 테스트할 수 있으며, 표현식, 클래스, 메서드, 변수 등을 손쉽게 실행해 볼 수 있습니다.JShell에서 자주 사용하는 키보드 단축키JShell에서 생산성을 높여주는 대표적인 키보드 단축키는 다음과 같습니다.Enter – 현재 줄의 입력 내용을 검증하고 실행합니다.왼쪽 화살표(←
JShell은 Java 9부터 도입된 대화형(Interactive) 도구로, Java 역사상 최초의 공식 REPL(Read-Eval-Print Loop) 도구입니다. 명령줄 환경에서 간단한 프로그래밍 환경을 제공하며, 사용자가 입력한 코드를 읽고(Read), 평가하고(Eval), 그 결과를 출력(Print)해 줍니다.흥미로운 점은 JShell을 명령줄뿐만 아니라 Java 코드 내에서 프로그래밍 방식으로 생성할 수도 있다는 것입니다. JShell 및 관련 API는 모두 jdk.jshell 패키지에 포함되어 있으며, 다음과 같은 핵심
JShell이란 무엇인가? JShell은 Java 9부터 도입된 명령줄(command-line) 도구입니다. 간단한 단일 문장부터 복합 문장, 나아가 완전한 형태의 메서드나 클래스까지 Java 코드를 직접 입력할 수 있으며, 입력된 코드를 즉시 평가(evaluate)하고 그 결과를 화면에 출력해 줍니다. 덕분에 별도의 컴파일 과정 없이도 Java 코드를 대화형으로 빠르게 실험하고 학습할 수 있는 REPL(Read-Eval-Print Loop) 환경을 제공합니다. 정방향 참조(Forward Reference)의 개념 정방향 참조란,
Collectors 클래스는 Stream API의 핵심 구성 요소입니다. Java 9부터 이 클래스에 새로운 메서드인 filtering()이 추가되어, 다운스트림 수집(collect) 과정에서 스트림 요소를 필터링할 수 있게 되었습니다. 스트림에서 제공하는 filter() 메서드와 비슷해 보이지만, 둘 사이에는 중요한 차이점이 있습니다. 스트림의 filter()는 그룹화(grouping)가 일어나기 전에 값을 미리 걸러내는 반면, Collectors.filtering()은 Collectors.groupingBy()와 함께 사용할
Collectors.flatMapping()이란?Java 9에서는 Collectors 클래스에 새로운 정적 메서드인 flatMapping()이 추가되었습니다. 이 메서드는 기존의 Collectors.mapping()과 유사하지만, 중첩된 컬렉션(nested collections)을 훨씬 더 효율적으로 처리할 수 있다는 점에서 차별화됩니다.Collectors.flatMapping()은 두 가지 인자를 받습니다.입력 요소에 적용할 매핑 함수(Function)함수를 통과한 요소들을 누적할 다운스트림 컬렉터(Collector)Collect
Java 9에서는 Thread.getStackTrace(), Throwable.getStackTrace(), SecurityManager.getClassContext()의 대안으로 StackWalker API가 새롭게 도입되었습니다. 이 API는 필요한 스택 프레임만 순회(traverse)하고 구체화(materialize)하는 메커니즘을 제공하며, 추가적인 스택 프레임이 필요할 때 효율적으로 지연(lazy) 접근할 수 있도록 설계되었습니다.예외(exception) 스택 트레이스의 각 스택 요소에 접근해야 하는 경우에는 Throwab
Java 9는 국제화(Internationalization) 분야에서 여러 가지 중요한 개선 사항을 도입했습니다. 대표적인 변화로는 유니코드 8.0(Unicode 8.0) 표준 지원, UTF-8 기반 프로퍼티(properties) 파일 처리, 그리고 CLDR(Common Locale Data Repository) 로케일 데이터의 기본 활성화를 들 수 있습니다.유니코드 8.0 완전 지원Java 9는 유니코드 8.0 표준을 완전히 지원합니다. 이를 통해 10,555개의 새로운 문자, 29개의 문자 체계(scripts), 그리고 42개의
toEpochSecond() 메소드란?Java 9부터 LocalDate 클래스에 toEpochSecond() 메소드가 제공되어, 로컬 날짜를 에포크 초(epoch seconds)로 손쉽게 변환할 수 있습니다.이 메소드는 LocalDate 객체를 에포크 기준 시점인 1970-01-01T00:00:00Z로부터 경과한 초 단위 값으로 변환합니다. 여기서 LocalDate는 지정된 시간(LocalTime)과 시간대 오프셋(ZoneOffset)과 결합되어, 1970년 1월 1일 자정을 기준으로 하는 총 초(second)를 계산하게 됩니다.문
Java 9에서는 ofInstant() 메서드가 새롭게 도입되어 java.time.Instant 객체를 다양한 날짜·시간 타입으로 간편하게 변환할 수 있게 되었습니다. 이 메서드는 LocalDate, LocalTime, LocalDateTime 클래스에 포함된 정적(static) 메서드로, Instant 객체를 변환할 때 java.time.ZoneId 형태의 시간대 정보를 반드시 함께 전달해야 합니다.Java 8에서는 Instant를 LocalDate나 LocalTime으로 변환하려면 instant.atZone(zone).toLoc
Java 9부터 새롭게 개선된 Process API를 통해 실행 중인 프로세스에 대한 다양한 정보를 손쉽게 조회하고 제어할 수 있게 되었습니다. 이번 글에서는 프로세스를 식별하고 종료하는 핵심 인터페이스인 ProcessHandle과 함께, 실제 코드 예제를 통해 프로세스를 종료(destroy)하는 방법을 자세히 알아보겠습니다.ProcessHandle과 ProcessHandle.Info 인터페이스란?ProcessHandle 인터페이스는 운영체제 수준의 네이티브 프로세스를 식별하고 제어할 수 있는 기능을 제공합니다. 이 인터페이스를 사
Java 9에서는 프로세스 처리(Process Handling) 관련 클래스와 새로운 API가 도입되었습니다. ProcessHandle 인터페이스와 이에 포함된 다양한 메서드를 활용하면 현재 실행 중인 프로세스의 PID뿐만 아니라 다른 관련 프로세스들의 상세 정보도 손쉽게 확인할 수 있습니다.특정 프로세스의 모든 자식(child) 프로세스를 가져오고 싶다면 java.lang.ProcessHandle.children() 메서드를 사용하면 됩니다. 이 메서드는 해당 프로세스의 자식 프로세스들을 Stream 형태로 반환하며, 만약 자식
Java 9 Process API 개요 Java 9에서는 Process API가 대폭 개선되어 운영체제 수준의 프로세스를 훨씬 세밀하게 제어하고 관리할 수 있게 되었습니다. 이 버전에서 새롭게 도입된 ProcessHandle 인터페이스는 프로세스의 네이티브 프로세스 ID(PID), 시작 시간, 누적 CPU 사용 시간, 인수(arguments), 명령어(command), 사용자(user), 부모 프로세스, 그리고 자식(하위) 프로세스까지 폭넓은 정보를 제공합니다. 또한 isAlive() 메서드로 프로세스의 생존 여부(liveness)
Java 9에서는 java.util.concurrent.Flow 패키지를 통해 리액티브 스트림즈(Reactive Streams)가 공식적으로 도입되었습니다. 이는 상호 운용 가능한 발행-구독(Publish-Subscribe) 프레임워크를 지원하며, 비동기 경계(다른 스레드 또는 스레드 풀로 요소를 전달하는 과정)를 넘어 비동기 데이터 스트림을 처리할 수 있게 해줍니다.리액티브 스트림즈의 가장 큰 특징은 역압력(Backpressure) 메커니즘입니다. 수신 측이 임의의 양의 데이터를 강제로 버퍼링하지 않고 처리 가능한 만큼만 요청하기
Java 9 리액티브 스트림과 SubmissionPublisher 소개Java 9부터는 Publisher, Subscriber, Subscription, Processor라는 네 가지 핵심 인터페이스와, 그중 Publisher 인터페이스를 구현한 구체 클래스인 SubmissionPublisher가 표준 라이브러리에 추가되면서 리액티브 스트림(Reactive Streams) 프로그래밍이 가능해졌습니다. 각 인터페이스는 리액티브 스트림의 기본 원칙에 따라 서로 다른 역할을 담당합니다.SubmissionPublisher 클래스의 subm
Java 9에서는 CompletableFuture 클래스에 delayedExecutor() 메서드가 새롭게 추가되었습니다. 이 메서드는 지정한 지연 시간(delay)이 지난 후에 작업을 실행할 수 있는 Executor 객체를 반환하며, 비동기 작업의 실행 시점을 의도적으로 늦춰야 할 때 매우 유용합니다.CompletableFuture는 두 가지 오버로드(overload)된 delayedExecutor() 메서드를 제공합니다.첫 번째 형태: CompletableFuture가 내부적으로 사용하는 기본(default) Executor 객
Java 9부터는 지연 평가(laziness)와 프레임 필터링 기능을 갖춘 StackWalker API가 새롭게 도입되었습니다. StackWalker 객체를 사용하면 현재 스레드의 호출 스택을 자유롭게 탐색하고 접근할 수 있으며, 여기서 핵심 역할을 하는 메서드가 바로 walk()입니다. walk() 메서드는 현재 스레드에 대한 StackFrame 스트림을 열어 해당 스트림에 함수를 적용한 결과를 반환합니다. 사용 방법은 간단합니다. 먼저 StackWalker.getInstance() 메서드로 StackWalker 객체를 얻은 뒤