프로그램 실행 중에 생성된 객체는 가비지 컬렉터(Garbage Collector, GC)에 의해 자동으로 제거됩니다. 어떤 스레드에서도 객체를 참조하지 않고, JVM이 해당 객체에 더 이상 접근할 수 없다고 판단하면 그 객체는 가비지 컬렉션 대상이 됩니다.Object 클래스에는 finalize() 메서드가 있으며, GC가 힙(heap)에서 객체를 제거하기 전에 자동으로 호출됩니다. 하지만 Java 9부터 finalize() 메서드는 deprecated(사용 중단) 처리되었고, 대신 가비지 컬렉션 관리를 위한 새로운 클래스인 java
Java 9의 Optional.stream() 메서드 소개Java 9에서는 Optional 클래스에 stream() 메서드가 새롭게 추가되면서 기능이 한층 강화되었습니다. 이 메서드는 Optional 요소로 이루어진 Stream을 실제 값이 존재하는 요소만 담긴 Stream으로 변환할 때 유용하게 사용됩니다.동작 방식은 매우 직관적입니다. Optional 객체에 값이 존재하면 그 값을 포함하는 Stream을 반환하고, 값이 없다면(빈 Optional이라면) 빈 Stream(empty stream)을 반환합니다. 덕분에 null 체크
Java 9부터는 인터페이스(interface) 내부에 private 메서드와 private static 메서드를 추가할 수 있게 되었습니다. 인터페이스에서 private 메서드를 활용하면 default 메서드와 static 메서드 사이의 코드 중복을 효과적으로 줄일 수 있다는 점이 가장 큰 장점입니다.예를 들어, 두 개 이상의 default 메서드가 동일한 로직을 공유해야 하는 상황이라면, 해당 코드를 별도의 private 메서드로 분리한 뒤 각 default 메서드에서 호출하는 방식으로 깔끔하게 재사용할 수 있습니다.Java 9
JShell이란?JShell은 Java 언어를 학습하고 코드 프로토타입을 빠르게 만들어 볼 수 있도록 Java 9부터 제공되는 대화형(인터랙티브) 도구입니다. JShell은 사용자가 입력한 명령을 즉시 평가하여 결과를 보여주는 방식으로 동작하며, 이는 REPL(Read-Evaluate-Print-Loop), 즉 읽고-평가하고-출력하는 반복 구조를 기반으로 합니다.기본 임포트된 패키지 확인하기JShell 세션이 시작되면 기본적으로 몇 가지 유용한 Java 패키지들이 자동으로 임포트됩니다. /imports 명령을 입력하면 현재 임포트된
Java 9 모듈이란? 모듈(module)은 코드와 데이터를 하나로 묶은 단위입니다. 모듈의 코드는 여러 개의 패키지로 구성되며, 각 패키지에는 자바 클래스와 인터페이스가 포함됩니다. 모듈의 데이터에는 리소스 파일과 기타 정적 정보가 포함됩니다. 모듈의 중요한 특징 중 하나는 아티팩트(artifact)의 루트 디렉터리에 모듈을 설명하는 module-info.class 파일이 반드시 포함된다는 점입니다. 아티팩트 형식은 기존의 JAR 파일 또는 JMOD 파일일 수 있으며, 이 파일은 루트 디렉터리에 위치한 소스 파일 module-in
Java 9에서 Optional 클래스에 새롭게 추가된 ifPresentOrElse() 메서드는 Consumer와 Runnable, 두 개의 매개변수를 받는다는 점이 가장 큰 개선 사항입니다.ifPresentOrElse() 메서드의 목적이 메서드의 핵심 목적은 다음과 같습니다. Optional 객체에 값이 존재하면, 해당 값에 대해 지정된 동작을 실행합니다. 즉, action.accept(value)가 호출되며, 이 부분은 기존의 ifPresent() 메서드와 동일하게 작동합니다.그렇다면 ifPresent()와의 차이점은 무엇일까요
Java 9에서 도입된 JShell은 Java 언어의 다양한 기능과 방대한 표준 라이브러리를 빠르게 탐색하고, 실험하고, 학습할 수 있도록 도와주는 빠르고 친화적인 대화형 환경입니다.JShell의 가장 큰 장점 중 하나는 예외 처리 코드를 직접 작성할 필요가 없다는 점입니다. JShell은 발생하는 모든 예외를 자동으로 포착(catch)하여 관련 정보를 화면에 출력한 뒤, 곧바로 다음 프롬프트를 표시하기 때문에 세션을 계속 이어갈 수 있습니다.이 기능은 unchecked 예외에도 동일하게 적용됩니다. 즉, JShell은 checke
Java 9에서는 Optional 클래스의 기능을 한층 강화하기 위해 ifPresentOrElse()와 or() 두 가지 메서드가 새롭게 도입되었습니다. 두 메서드 모두 값의 존재 여부를 처리하지만, 그 목적과 동작 방식에는 뚜렷한 차이가 있습니다. Optional.ifPresentOrElse() 메서드는 값이 존재하면 해당 값을 인자로 받아 지정된 동작(action)을 수행하고, 값이 없으면 빈 상태일 때 실행할 동작(empty action)을 대신 수행합니다. 즉, 값의 유무에 따라 서로 다른 로직을 분기 처리할 때 유용합니다.
Java 9 모듈이란?모듈(Module)은 코드, 데이터, 그리고 리소스의 집합입니다. 즉, 클래스, 추상 클래스, 인터페이스와 같은 관련된 패키지와 타입들이 코드, 데이터 파일, 정적 리소스와 함께 하나로 묶인 단위를 의미합니다.Java 9부터 도입된 모듈 시스템(Project Jigsaw)은 기존의 JAR 파일 방식보다 더 강력한 캡슐화와 명시적인 의존성 관리를 제공합니다.모듈의 주요 특성모듈은 다른 모듈과 통신하기 위한 인터페이스를 반드시 정의해야 합니다.모듈은 모듈 인터페이스와 모듈 구현 사이의 명확한 분리를 정의합니다.모듈
Java 9에서 도입된 가장 중요한 기능 중 하나가 바로 모듈(Module)입니다. 모듈을 활용하면 코드를 모듈이라고 불리는 더 작은 단위의 구성 요소로 분리할 수 있습니다. 이는 각 모듈이 고유한 책임을 가지며, 정상적으로 동작하기 위해 필요한 다른 모듈에 대한 의존성을 직접 선언한다는 의미입니다.Java 9에서 모듈러 프로젝트 만드는 방법먼저 module-info.java라는 이름의 파일을 생성하고, 해당 모듈(패키지)에 추가해야 합니다. 예를 들어 패키지 이름이 com.mycompany.mypackage라면, 이 파일은 동일한
JShell은 Java 9에서 새롭게 도입된 대화형 명령줄 도구입니다. 입력을 받아 평가한 후 결과를 명령줄을 통해 사용자에게 출력하기 때문에 REPL(Read-Eval-Print-Loop)이라고도 부릅니다.JShell에서는 일반 Java 코드와 마찬가지로 여러 줄에 걸친 제어 흐름 문(control flow statements)을 실행할 수 있습니다. if-else 문, for 루프, while 루프 같은 제어 흐름 문도 모두 JShell에서 그대로 사용할 수 있습니다.JShell은 여러 줄로 구성된 문장을 인식하면 다음 줄을 입
Java 9에서는 InputStream 클래스에 transferTo() 메서드가 새롭게 추가되었습니다. 이 메서드는 입력 스트림에서 출력 스트림으로 데이터를 복사하는 작업을 손쉽게 처리할 수 있도록 도와줍니다. 즉, 입력 스트림에서 모든 바이트를 읽어 들인 순서 그대로 출력 스트림에 기록하는 기능을 수행합니다.Java 9 이전에는 스트림 간 데이터를 복사하려면 바이트 배열이나 버퍼를 직접 생성하고 반복문을 통해 읽고 쓰는 코드를 개발자가 일일이 작성해야 했습니다. 하지만 transferTo() 메서드의 등장으로 이러한 번거로운 과정
JLink는 자신만의 맞춤형 JRE(Customized JRE)를 생성할 수 있게 해주는 새로운 링커(Linker) 도구입니다. 보통 프로그램을 실행할 때는 Oracle이 제공하는 기본 JRE를 사용하지만, 직접 JRE를 구성해야 하는 상황이라면 이 도구를 활용하면 됩니다.JLink는 애플리케이션 실행에 필요한 클래스만 포함된 JRE를 만들어 주기 때문에, 배포 패키지의 크기를 크게 줄일 수 있고 전체 JRE에 대한 의존성도 해소할 수 있다는 장점이 있습니다.링크 타임(Link Time)이라는 새로운 단계Java 9에서는 코드를 컴
JShell이란? JShell은 Java 9에서 새롭게 도입된 명령줄 기반의 대화형 REPL(Read-Evaluate-Print-Loop) 도구입니다. 이 도구를 사용하면 Java로 작성된 선언문, 문장, 표현식을 즉시 평가할 수 있으며, 코드 조각(snippet)을 실행한 결과도 바로 확인할 수 있습니다. 때로는 이미 Java 파일로 작성해 둔 코드를 JShell에서 그대로 실행하고 싶은 경우가 있습니다. 이럴 때 파일을 JShell 세션에 불러오려면 /open 명령어를 사용하면 됩니다. 예제: Test.java 파일 준비 예를
JShell은 Java 9에서 도입된 REPL(Read-Eval-Print Loop) 대화형 도구로, 변수 선언, 문장(statement), 표현식(expression) 등 간단한 자바 코드를 main() 메서드 없이도 실행하고 평가할 수 있게 해줍니다.JShell의 스크래치 변수란?JShell에서 스니펫(snippet)이 반환하는 값은 별도의 설정 없이 자동으로 스크래치 변수(scratch variable)에 저장됩니다. 이러한 스크래치 변수는 달러 기호($)로 표현됩니다.표현식의 결과를 변수에 직접 할당하지 않으면, JShell
collect() 메서드란? Stream API의 collect() 메서드는 스트림에 담긴 모든 요소를 수집하여 지정된 컬렉션 타입에 저장하는 최종 연산(terminal operation)입니다. 개발자가 결과를 어떤 컬렉션에 저장할지 직접 지정해야 하며, 이때 Collectors 클래스를 활용합니다. Collectors에는 다양한 유틸리티 메서드가 제공되지만, 실무에서 가장 많이 사용되는 것은 다음 세 가지입니다. Collectors.toList() — 스트림 요소를 List로 수집 Collectors.toSet() — 스트림
자바 8(Java 8)부터 인터페이스는 디폴트(default) 메서드를 지원하기 시작했습니다. 그런데 여러 디폴트 메서드에서 동일한 로직이 반복되는 경우가 종종 발생합니다. 이럴 때 코드 재사용성을 높이기 위해 공통 로직을 별도의 디폴트 메서드로 분리해 작성할 수 있습니다.하지만 문제는 공통 코드가 외부에 노출되어서는 안 되는 기밀성 있는 코드일 때 발생합니다. 디폴트 메서드는 본질적으로 public이기 때문에, 해당 인터페이스를 구현하는 모든 클래스가 접근할 수 있습니다. 즉, 숨기고 싶은 코드를 디폴트 메서드에 두는 것은 바람직
JShell이란 무엇인가?JShell은 Java 9부터 도입된 대화형 커맨드 라인 도구로, Java 언어와 API를 학습하고 실험하며 탐색할 수 있도록 도와줍니다. main() 메서드가 포함된 복잡한 클래스를 작성할 필요 없이, 콘솔에 유효한 Java 코드를 입력하기만 하면 즉시 결과를 확인할 수 있습니다.JShell에서 현재 날짜와 시간을 얻는 다양한 방법을 코드 예제와 함께 살펴보겠습니다.1. java.util.Date로 현재 날짜와 시간 얻기가장 간단한 방법은 new Date()를 사용하는 것입니다. 아래 코드처럼 입력하면 현
Java 9에서 도입된 LocalDate.datesUntil() 메서드는 두 개의 LocalDate 인스턴스 사이에 날짜 스트림(Stream)을 생성해 주며, 필요에 따라 단계 크기(step)까지 지정할 수 있습니다. 이 메서드는 두 가지 오버로드된 형태로 제공됩니다. datesUntil() 메서드의 두 가지 형태 첫 번째 형태: 종료 날짜(end date)만 인수로 받습니다. 현재 날짜부터 종료 날짜까지의 모든 날짜를 하루 단위로 포함하는 스트림을 반환합니다. 두 번째 형태: 종료 날짜와 함께 Period 객체를 매개변수로 받습
Java 9부터 InputStream 클래스에 새롭게 추가된 readAllBytes() 메서드를 사용하면 스트림의 모든 바이트를 한 번에 바이트 배열(byte array)로 읽어들일 수 있습니다. 이 메서드는 InputStream 객체에서 남아 있는 모든 바이트를 읽고, 스트림의 끝(end of stream)이 감지되거나 예외가 발생할 때까지 실행을 블로킹(blocking)합니다.readAllBytes() 메서드의 특징과 주의 사항readAllBytes() 메서드는 InputStream 인스턴스를 자동으로 닫아주지 않는다는 점에 유