반응형

Java 49

Java 23

1. 📝 Markdown Documentation Comments (JEP 467) - 정식 출시Javadoc 주석을 HTML 태그 없이 Markdown 문법으로 작성할 수 있습니다. /// 으로 시작하는 새로운 주석 스타일을 사용합니다.// ❌ 기존 HTML 방식/** * 두 수를 더합니다. * 두 정수를 받아 합계를 반환합니다. * * {@code a} - 첫 번째 정수 * {@code b} - 두 번째 정수 * * @return 두 수의 합 */public int add(int a, int b) { return a + b;}// ✅ Java 23 Markdown 방식/// ## 두 수를 더합니다.////// 두 정수를 받아 합계를 반환합니다.////// - `a` - 첫 번째 정수..

Java 2026.05.06

Java에서 데이터 없음을 표현하는 방법

"Java에서 '데이터/값 없음'을 어떻게 표현할 것인가?"상황별로 최적의 선택이 다릅니다. 다음 영역을 단계별로 살펴봅니다:null의 본질 ↓클래스 필드 (primitive vs wrapper) ↓Optional (어디에 쓸까) ↓메서드 반환 ↓Enum 탐색 (다양한 패턴) ↓컬렉션 / 배열 / 예외 처리1️⃣ null의 본질null = 참조할 객체 자체가 없음 (참조 타입 전용)"참조 없음" ≠ "빈 데이터"null → 주소 자체가 없음"", [] → 객체는 있는데 내용이 비어있음null 참조 사용 시 → NullPointerException 발생2️⃣ 클래스 필드 설계 원칙기본 원칙primitive 우선, 단 "값 없음"이 의미를 가질 땐 wrapper + null의사결정상황선택값..

Java 2026.04.18

Java 22

1. Unnamed Variables & Patterns (JEP 456) - 정식 기능언더스코어(_)를 사용하여 사용하지 않는 변수나 패턴을 표시할 수 있습니다.// 사용하지 않는 변수try { // ... } catch (Exception _) { // 예외 변수를 사용하지 않음 System.out.println("에러 발생");}// 람다에서 사용하지 않는 파라미터list. forEach((_, value) -> System.out.println(value));// 패턴 매칭에서if (obj instanceof Point(int x, _)) { // y 값은 필요 없음 System.out.println("x = " + x);}2. Statements Before super() (..

Java 21

Virtual Threads가상 스레드 기능이 정식 기능으로 변경되었습니다.Sequence CollectionsCollection 인터페이스에 순서를 명확하게 정의하는 새로운 기능들이 추가되었습니다.ex) getFirst(),getLast(),reversed()문자열 템플릿(Preview)변수와 표현식을 문자열에 더 쉽고 안전하게 포함할 수 있는 새로운 방법이 나왔습니다.String name = "Joan";String info = STR."My name is \{name}";// 결과: My name is JoanRecord PatternsJava20 - Record Patterns 프리뷰로 나왔던 Record Patterns가 정식 기능으로 변경되었습니다.Pattern Matching for swit..

Spring boot 3.1

Spring Boot 3.1은 개발 및 테스트 환경의 자동화와 편의성에 초점을 맞춘 릴리스입니다.Docker Compose 지원(개발환경)docker-compose.yml파일을 프로젝트 루트에 두면, 개발 환경에서 Spring Boot 애플리케이션을 실행할 때 Docker Compose가 자동으로 실행됩니다. 이로 인해 개발자가 로컬에서 DB나 Redis 같은 외부 서비스를 수동으로 설치하고 실행할 필요 없이, docker-compose up과 동일한 효과를 애플리케이션 실행만으로 얻을 수 있습니다.Testcontainers 지원 강화통합 테스트시 Testcontainers 사용이 훨씬 간편해졌습니다. @ServiceConnection 어노테이션을 통해 지금까지 수동으로 작성해주었던 연결 정보 코드들을 ..

Java/Spring 2025.07.22

Java 20

Java20은 기능적인 변화보다는 프리뷰와 Incubator API 위주로 변경점이 존재합니다. 즉 당장 사용되기보다는 추후 버전에서 정식 기능으로 구현하기 위해 준비하는 단계입니다.Scoped Values(Incubator)Scoped Values는 주로 다중 스레드 환경에서 변경 불가능한 값을 스레드 간에 안전하게 공유하기 위해서 사용됩니다. 특히 Virtual Thread와 함께 사용될 때 강력한 성능과 구조적 병렬성을 제공합니다.기존 Thread Local의 문제점메모리 누수 위험값 변경이나 삭제를 잊으면 문제가 발생특징특정 작업 범위(scope) 내에서만 사용할 수 있습니다.불변이며 Thread Local보다 더 안전하고 성능이 좋습니다.import java.lang.ScopedValue;pub..

Spring Boot 3.0 변경점

Java 지원 버전 변화Spring Boot 3.0부터는 Java 17버전 이상만 지원합니다.Java EE -> JakartaEE로 대체GraalVM기반의 Spring Native 공식 지원AOT 컴파일 지원: 기존의 JIT Compiler는 런타임에 바이트코드를 기계어로 변환하지만 AOT 컴파일로 빌드 타임에 정적 컴파일링어플리케이션 시작 시간과 메모리 사용량 감소OS에 맞는 기계어를 빌드타임에 컴파일하기 때문에 독립 실행 파일로 배포/실행 가능(JVM 불필요)'/api/hello'와 '/api/hello/'가 이제 불일치로깅 Datetime의 Default format 변경Logback 및 Log4j2의 default 로그 DatetimeFormatdl ISO-8601 표준에 맞게 변경됩니다.yyyy..

Java/Spring 2025.07.17

Synchronized & ReentrantLock

SynchronizedSynchronized란 현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터에 접근할 수 없도록 막기 위해 사용하는 키워드입니다.Synchronized 특징스레드가 Synchronized 키워드가 붙은 메서드에 진입하려면 해당 객체의 락을 획득해야합니다.락을 획득하지 못한 스레드는 RUNNABLE 상태에서 BLOCKED 상태로 전환됩니다. 락을 획득할 때까지 대기하며, 이 동안 CPU 실행 스케줄링에서 지외됩니다.여러 스레드가 대기 중일 경우, 락 획득 순서는 보장되지 않습니다.Synchronized 블록 안에서는 변수의 메모리 가시성 문제가 자동으로 해결되므로 별도의 volatile 선언이 필요하지 않습니다.Synchronized의 단점BLOCKED 상태의..

Java 2025.07.15

Java Virtual Thread

Virtual ThreadJava 21에서 정식으로 도입된 Virtual Thread는 기존의 Kernel-level thread와 User-level thread를 1:1 매핑하여 사용하는 JVM 스레드 모델을 개선한 여러 개의 가상 스레드를 하나의 네이티브 스레드에 할당하여 사용하는 방법입니다.Java ThreadJava thread는 ExecutorService를 두어 JVM 내부에서 스레드를 관리/실행합니다. 이렇게 ExecutorService를 통해 스케줄링되는 Thread는 JVM을 통해 커널 스레드를 만들어 실행합니다.Virtual Thread란Virtual Thread는 기존 Kernel thread(1) : User thread(1)의 구조가 아니라 Kernel thread(1): Use..

Java/일반 2025.07.12

Java 19

레코드 패턴 매칭(프리뷰)기존에는 instanceof를 통해 해당 객체인지 확인 후, 형변환을 통해 객체를 사용해야 했습니다.record Point(int x, int y) {}public void test(Object o) { if (o instanceof Point) { Point p = (Point) o; ... }}하지만 레코드 패턴 매칭을 통해 형변환 로직을 제거하고 record의 구성요소를 직접 추출해서 사용할 수 있습니다.public void test1(Object o) { if (o instanceof Point p) { int sum = p.x + p.y; ... }}public void test2(Object o) ..

반응형