From e553cf7fd1081bbba4f2cb9301138a03c24c42d5 Mon Sep 17 00:00:00 2001 From: Diger Date: Fri, 3 Nov 2023 18:26:52 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B8=B0=EB=B3=B8=EC=9D=B4=20=EC=A4=91?= =?UTF-8?q?=EC=9A=94=ED=95=98=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _posts/2022-08-15-JDK.md | 137 ----------- _posts/2023-05-10-java-versioning.md | 224 ------------------ _posts/2023-10-19-Language.md | 338 +++++++++++++++++++++++++++ 3 files changed, 338 insertions(+), 361 deletions(-) delete mode 100644 _posts/2022-08-15-JDK.md delete mode 100644 _posts/2023-05-10-java-versioning.md create mode 100644 _posts/2023-10-19-Language.md diff --git a/_posts/2022-08-15-JDK.md b/_posts/2022-08-15-JDK.md deleted file mode 100644 index e9a490e..0000000 --- a/_posts/2022-08-15-JDK.md +++ /dev/null @@ -1,137 +0,0 @@ ---- - -title: JDK에 관하여 - -date: 2022-08-15 -categories: [Java, JDK] -tags: [Java, JDK] -layout: post -toc: true -math: true -mermaid: true - ---- - -![JDK](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMk8as%2FbtqKsoI4jA3%2F5VnitlEi9njb43qk9kHuik%2Fimg.webp) - -# JRE? JDK? - -### 우선, JRE 란 무엇인가? 를 알아보자. - -JRE (Java Runtime Environment) 의 약자로 JVM, Java Class Library, Java Command, JDBC 등, Java 프로그램을 실행할 수 있는 기본 패키징을 가리킨다. - -### 그러면 JDK 란 무엇인가? 를 알아보자. - -JDK (Java Development Kit) 의 약자로, JRE 를 포함하여, 컴파일러인 javac, javadoc, jar 등 실제 개발환경에 필요한 요소들을 패키징 한 것이다. - -| JRE | JDK | -|-------------------------------------|-----------------------------------------| -| 빌드가 완료된 Java 기반의 프로그램을 실행 할 수 있는 환경 | Java 기반의 프로그램을 작성부터 빌드 후 실행까지 할 수 있는 환경 | - -
- -# JDK 를 다운 받다 보면... - -Java SE 8 ... 9 - -Java EE 8 ... 9 - -뭐 이런 용어가 있다 이것들도 알아봐보자. - -### Java SE (Java Standard Edition) - -말 그대로, 가장 보편적으로 쓰이는 Java 버전을 뜻한다. - -JDK 8, 11 등 보편적으로 JDK(Java) 버전을 가리킬 때 이 SE 버전을 뜻하는 것이다. - -### Java EE (Java Enterprise Edition) - -서버측 개발을 위한 플랫폼으로 이 역시 SE 를 기반으로 하되, 부가적인 기능이 추가된 것이다. - ---- - -# JDK 버전 별 기능 - -## JDK 버전 출시년도와 차이점 정리 - -### Java 8 - 2014년 - -> 오라클 인수 후 첫번째 버전 -> -> 2개 버전으로 나뉨(Oracle JDK, OpenJDK) -> -> Lambda, new Date and Time API(LocalDateTime, …) -> -> interface default method -> -> Optional -> -> PermGen Area 제거 - ---- - -### Java 9 - 2017년 - -> 모듈시스템 등장(jigsaw) - ---- - -### Java 10 - 2018년 3월 - -> var 키워드 -> -> 병렬 처리 가비지 컬렉션 도입으로 인한 성능 향상 -> -> JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능 - ---- - -### Java 11 - 2018년 9월 - -> Oracle JDK와 OpenJDK 통합 -> -> Oracle JDK가 구독형 유료 모델로 전환 -> -> 서드파티 JDK 로의 이전 필요 -> -> lambda 지역변수 사용법 변경 -> -> (var x, var y) -> x.process(y) => (x, y) -> x.process(y) - ---- - -### Java 12 - 2019.03 - -> switch문 확장 - ---- - -### Java 13 - 2019.09 - -> switch문 개선을 위한 yield 예약어 추가 - ---- - -### Java 14 - 2020.03 - -> instanceof 패턴 매칭 (preview) -> -> record (data object) 선언 기능 추가 (preview) - ---- - -### Java 15 - 2020.09 - -> EdDSA 암호화 알고리즘 추가 -> -> 패턴 매칭 (2차 preview, 상단 Java 14 참조) -> -> 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가(ZGC) -> -> Solaris 및 SPARC 플랫폼 지원 제거 -> -> 외부 메모리 접근 API (인큐베이팅) -> -> 레코드 (2차 preview, 상단 Java 14 참조) -> -> 클래스 봉인 (preview) diff --git a/_posts/2023-05-10-java-versioning.md b/_posts/2023-05-10-java-versioning.md deleted file mode 100644 index d759666..0000000 --- a/_posts/2023-05-10-java-versioning.md +++ /dev/null @@ -1,224 +0,0 @@ ---- - -title: Java 8 vs Java 11 vs Java 17 - -date: 2023-05-10 -categories: [Spring, Toby] -tags: [Spring, Toby] -layout: post -toc: true -math: true -mermaid: true - ---- - -# 참고 자료 - -[Java 8 Documentation by Oracle Page](https://www.oracle.com/java/technologies/javase/8-whats-new.html) - -[Java 11 Documentation by Baeldung](https://www.baeldung.com/java-11-new-features) - -[Java 17 Documentation by Oracle Blog](https://blogs.oracle.com/java/post/announcing-java17) - ---- - -# Java 8 - -## 람다 - -함수형 프로그래밍을 지원하기 위해 람다 표현식이 도입되었습니다. - -이를 사용하여 익명 함수를 작성하고 전달할 수 있으며, 코드의 간결성과 가독성을 향상시킬 수 있는 방법이 추가됨 - -## 스트림 API - -데이터 처리를 위한 Stream API 추가. - -이를 통해 컬렉션, 배열 등의 데이터를 처리하고 조작할 수 있으며, 병렬 처리를 지원하여 성능을 향상 시킬 수 있음 - -## 날짜 및 시간 API - -Java 8에서는 java.time 패키지를 통해 새로운 날짜와 시간 API가 제공됩니다. - -이 API는 날짜, 시간, 기간 등을 표현하고 조작하는 데 유용합니다. - -`LocalDateTime` - -## 기본 메서드(Default Methods) - -인터페이스에서도 메서드의 구현을 제공할 수 있게 되었음 - -기존에 인터페이스를 구현한 클래스에 새로운 메서드가 추가되더라도 해당 클래스를 수정하지 않고도 기본 구현을 사용할 수 있음 - -## 병렬 처리 - -병렬 스트림이라는 개념이 도입되어 멀티코어 시스템에서 병렬로 작업을 처리할 수 있게 됨 - -이를 통해 빠른 처리와 성능 향상을 얻을 수 있음 - -## 반복자 개선 - -반복자를 사용하는 방식이 개선되어 forEach() 메서드를 통해 반복 작업을 수행할 수 있게 되었고 병렬 처리도 가능. - -## 타입 어노테이션(Type Annotations) - -타입 어노테이션을 사용하여 코드의 가독성을 높일 수 있고, 정적 분석 및 코드 검증을 위한 정보를 추가할 수 있음 - -타입 어노테이션은 주로 `변수 선언`, `반환 타입`, `매개변수` 등의 `타입에 추가 정보`를 제공하는 데 사용됨 - -`@NotNull` - -## 스크립트 엔진 - -Java 8에서는 JavaScript, Ruby, Python 등의 스크립트 엔진을 사용하여 Java 코드에 스크립팅 기능을 추가할 수 있게됨 - -## 그 외 - -이 외에도 성능 개선, 보안 강화, 개선된 컴파일러 등 여러 가지 기능과 개선 사항이 추가됨 - ---- - -# Java 11 - -## 문자열 메서드 추가 - -`isBlank`, `lines`, `strip`, `stripLeading`, `stripTrailing` 및 `repeat`와 같은 새로운 메서드들이 추가됨 - -여러 줄 문자열에서 공백이 아닌 제거된 줄을 추출하기 위해 새로운 메서드를 어떻게 사용할 수 있는지 살펴보겠습니다. - -## 파일 메서드 추가 - -파일 입출력에 관한 편의 메서드 추가 - -```java -Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text"); -String fileContent = Files.readString(filePath); -assertThat(fileContent).isEqualTo("Sample text"); -``` - -## Collection to Array - -java.util.Collection 인터페이스에는 IntFunction 인수를 사용하는 toArray 메서드가 추가됨 - -List -> Array의 변환이 간편해짐 - -```java -List sampleList = Arrays.asList("Java", "Kotlin"); -String[] sampleArray = sampleList.toArray(String[]::new); -assertThat(sampleArray).containsExactly("Java", "Kotlin"); -``` - -## Predicate not 메서드 추가 - -Predicate Inteface에 정적 not 메소드가 추가됨 - -```java -List sampleList = Arrays.asList("Java", "\n \n", "Kotlin", " "); -List withoutBlanks = sampleList.stream() - .filter(Predicate.not(String::isBlank)) - .collect(Collectors.toList()); -assertThat(withoutBlanks).containsExactly("Java", "Kotlin"); -``` - -## var 키워드 추가 - -람다 매개변수에서 로컬 변수 구문인 var 키워드 추가됨 - -```java -List sampleList = Arrays.asList("Java", "Kotlin"); -String resultString = sampleList.stream() - .map((@Nonnull var x) -> x.toUpperCase()) - .collect(Collectors.joining(", ")); -assertThat(resultString).isEqualTo("JAVA, KOTLIN"); -``` - -## 새로운 HTTP Client 추가 - -Java 9에서 도입된 java.net.http 패키지의 새로운 HTTP 클라이언트가 Java 11의 표준 기능이 됨 - -새 HTTP API는 전반적인 성능을 개선하고 HTTP/1.1 및 HTTP/2를 모두 지원함 - -```java -HttpClient httpClient = HttpClient.newBuilder() - .version(HttpClient.Version.HTTP_2) - .connectTimeout(Duration.ofSeconds(20)) - .build(); -HttpRequest httpRequest = HttpRequest.newBuilder() - .GET() - .uri(URI.create("http://localhost:" + port)) - .build(); -HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()); -assertThat(httpResponse.body()).isEqualTo("Hello from the server!"); -``` - -## Java 파일 실행의 간소화 - -javac를 사용하여 Java 소스 파일을 컴파일할 필요없이 실행 가능 - -이전 버전 -```shell -$ javac HelloWorld.java -$ java HelloWorld -Hello Java 8! -``` - -신규 버전 -```shell -$ java HelloWorld -Hello Java 11! -``` - -## A No-Op Garbage Collector 추가 - -Epsilon이라는 새로운 가비지 수집기가 Java 11에서 실험판으로 열렸음 - -메모리를 할당하지만 실제로 가비지를 수집하지 않기 때문에 No-Op(작업 없음)라고 한다. - -따라서 Epsilon은 메모리 부족 오류를 시뮬레이션하는 데 적용할 수 있다. - -분명히 Epsilon은 일반적인 프로덕션 Java 애플리케이션에 적합하지 않지만 유용할 수 있는 몇 가지 특정 사용 사례가 있다. - -`성능 시험`, `메모리 부하 테스트`, `VM 인터페이스 테스트 및 수명이 매우 짧은 작업` - -이 GC를 사용하려면 - -```shell --XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -``` -플래그를 사용하면 된다. - ---- - -# Java 17 - -## Sealed class 추가 - -Sealed classe와 interface는 다른 클래스나 인터페이스가 확장하거나 구현할 수 없도록 범위를 제한한다. - -### Sealed class vs Final class -`확장 가능성` - -- Final 클래스 - - Final 클래스는 어느 곳에서도 상속할 수 없다. - -- Sealed 클래스 - - Sealed 클래스는 제한된 범위 내에서만 상속이 가능하다. 특정 클래스나 인터페이스 목록을 permits 절로 지정하여, 해당 클래스나 인터페이스만이 sealed 클래스를 상속하거나 구현할 수 있다. - -`유연성` - -- Final 클래스 - - Final 클래스는 상속을 금지하므로, 하위 클래스에서 상속 받은 메서드를 오버라이드 할 수 없다. - -- Sealed 클래스 - - Sealed 클래스는 permits 절에 선언된 클래스들에 대한 상속을 허용하지만, 해당 클래스들 내에서는 상속을 계속할 수 있다. - - 즉, Sealed 클래스의 하위 클래스는 다른 메서드를 추가하거나, 상속 계층을 더 확장할 수 있다. - -`설계 목적` - -- Final 클래스 - - Final 클래스는 보안 상의 이유로 상속을 막거나, 불변성을 보장하고자 할 때 사용된다. 다른 클래스가 해당 클래스를 상속하거나 변경하지 못하도록 하여 의도한 동작을 보장한다. - -- Sealed 클래스 - - Sealed 클래스는 클래스 계층 구조의 일부를 통제하고 특정 클래스나 인터페이스를 상속 또는 구현할 수 있는 클래스의 범위를 제한함으로써, 더 명확하고 제한된 클래스 계층을 구성할 수 있게된다. - -## diff --git a/_posts/2023-10-19-Language.md b/_posts/2023-10-19-Language.md new file mode 100644 index 0000000..6080393 --- /dev/null +++ b/_posts/2023-10-19-Language.md @@ -0,0 +1,338 @@ +--- + +title: Fundamental Java +date: 2023-10-19 +categories: [Java] +tags: [Java] +layout: post +toc: true +math: true +mermaid: true + +--- + +# 동등성, 동일성 + +## 동등성 (Equals) + +Equals 메서드는 두 객체의 **값**이 같은지 비교하는 메서드이다. + +```java +private void equals1() { + String string1 = "TEST"; + String string2 = "TEST"; + String newString1 = new String("TEST"); + String newString2 = new String("Other TEST"); + + System.out.println("string1.equals(string2) = " + string1.equals(string2)); + System.out.println("string1 == string2 = " + string1 == string2); + + System.out.println("-------------------"); + + System.out.println("string1.equals(newString1) = " + string1.equals(newString1)); + System.out.println("string1 == newString1 = " + string1 == newString1); + + System.out.println("-------------------"); + + System.out.println("newString1.equals(newString2) = " + newString1.equals(newString2)); + System.out.println("newString1 == newString2 = " + newString1 == newString2); +} +``` + +- string1.equals(string2)은 "TEST" 문자열을 비교한다. + - 두 문자열은 내용이 동일하므로 equals 메서드는 true를 반환한다. + - string1 == string2는 두 문자열이 동일한 객체를 가리키는지를 확인하는 것인데, "TEST"는 문자열 리터럴로 이미 존재하는 문자열이기 때문에 동일한 객체를 가리킨다. + +- string1.equals(newString1)은 string1과 newString1을 비교한다. + - 두 문자열은 내용이 동일하므로 equals 메서드는 true를 반환한다. + - string1 == newString1은 string1이 리터럴 문자열을 가리키고 newString1은 새로운 문자열 객체를 생성했기 때문에 두 객체는 서로 다르다. + +- newString1.equals(newString2)는 newString1과 newString2를 비교한다. + - 두 문자열 내용이 다르기 때문에 equals 메서드는 false를 반환한다. + - newString1 == newString2는 두 객체가 서로 다르기 때문에 false를 반환한다. + +## 동일성 (==) + +Equals 메서드는 두 객체의 **메모리 위치**가 같은지 비교하는 메서드이다. + +따라서 참조값 자체를 비교한다. + +--- + +# 동일한 hashCode의 경우 equals 가 같다고 할 수 있는가? + +HashCode가 만들어지는 원리와 존재 이유를 살펴보면 답이 나온다. + +## HashCode의 존재 이유/생성 과정 + +HashCode는 여러개의 객체를 다루는 Hash컬렉션에서 주로 사용되는데, 이 때 각 객체를 유일하게 식별할 수 있는 방법이 있어야한다. + +그래서 각 객체에 고유한 코드를 부여하기 위한 로직이 내부적으로 동작하게 된다. HashCode를 생성하는 것은 각 객체마다도 다르게 되어있는데 예시로 살펴보면 아래와 같다. + +String의 HashCode를 구현한 부분이다. + +```java +public class String { + + @Override + public int hashCode() { + int hash = 0; + for (int i = 0; i < this.length(); i++) { + hash = 31 * hash + this.charAt(i); + } + return hash; + } + +} +``` + +위와 같이 각 객체마다 랜덤한 값을 부여하기 위한 로직이 동작한다. + +이로써 알게된 사실은 + +- **HashCode가 같은** 객체여도 HashCode를 생성하는 과정에서 랜덤한 요소가 있기 때문에 **완전히 다른 객체일 수**도 있다는 것이다. + +- 또한 **Equals가 같다**해도 **HashCode의 결과는 다를 수**도 있다. + +- **== 연산자**로 **True** 결과를 받은 객체들은 **HashCode도 같다**. + +## 결론 + +- Equals가 같아도 HashCode는 다를 수 있다. + +- HashCode가 같아도 Equals는 다를 수 있다. + +--- + +# JVM의 구성 요소 + +![JVM: Architecture](https://techvidvan.com/tutorials/wp-content/uploads/sites/2/2020/06/JVM-Model.jpg) + +- [ClassLoader](https://k-diger.github.io/posts/ClassLoader) +- [Memory](https://k-diger.github.io/posts/JVM-Memory) +- [Execution Engine](https://k-diger.github.io/posts/Execution-Engine) +- [JIT Compiler](https://k-diger.github.io/posts/JITCompiler) +- [Garbage Collector](https://k-diger.github.io/posts/JVM-GC) + +--- + +# Java LTS 버전별 피쳐 + +[Java 8 Documentation by Oracle Page](https://www.oracle.com/java/technologies/javase/8-whats-new.html) + +[Java 11 Documentation by Baeldung](https://www.baeldung.com/java-11-new-features) + +[Java 17 Documentation by Oracle Blog](https://blogs.oracle.com/java/post/announcing-java17) + +![JDK](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMk8as%2FbtqKsoI4jA3%2F5VnitlEi9njb43qk9kHuik%2Fimg.webp) + + +## JRE? JDK? + +JRE (Java Runtime Environment) 의 약자로 JVM, Java Class Library, Java Command, JDBC 등, Java 프로그램을 실행할 수 있는 기본 패키징을 가리킨다. + +JDK (Java Development Kit) 의 약자로, JRE 를 포함하여, 컴파일러인 javac, javadoc, jar 등 실제 개발환경에 필요한 요소들을 패키징 한 것이다. + +| JRE | JDK | +|-------------------------------------|-----------------------------------------| +| 빌드가 완료된 Java 기반의 프로그램을 실행 할 수 있는 환경 | Java 기반의 프로그램을 작성부터 빌드 후 실행까지 할 수 있는 환경 | + +JDK 를 다운 받다 보면 `Java SE` 8 ... 9, `Java EE` 8 ... 9 뭐 이런 용어가 있다 이것들도 알아봐보자. + +## Java SE (Java Standard Edition) + +말 그대로, 가장 보편적으로 쓰이는 Java 버전을 뜻한다. + +JDK 8, 11 등 보편적으로 JDK(Java) 버전을 가리킬 때 이 SE 버전을 뜻하는 것이다. + +## Java EE (Java Enterprise Edition) + +서버측 개발을 위한 플랫폼으로 이 역시 SE 를 기반으로 하되, 부가적인 기능이 추가된 것이다. + +## JDK 8 + +### 스트림/람다 + +스트림을 통해 컬렉션, 배열 등의 데이터를 처리하고 조작할 수 있으며, 병렬 처리를 지원하여 성능을 향상 시킬 수 있다. + +함수형 프로그래밍을 지원하기 위해 람다 표현식이 도입되었습니다. + +이를 사용하여 익명 함수를 작성하고 전달할 수 있으며, 코드의 간결성과 가독성을 향상시킬 수 있는 방법이 추가됨 + +#### 스트림 - 생성 / 중간연산 / 최종연산 + + +### 날짜 및 시간 API (`LocalDateTime`) + +`LocalDateTime`타입 등장 + +### 인터페이스 기본 메서드(Default Methods) + +인터페이스에서도 메서드의 구현을 제공할 수 있게 되었다. 기존에 인터페이스를 구현한 클래스에 새로운 메서드가 추가되더라도 해당 클래스를 수정하지 않고도 기본 구현을 사용할 수 있음 + +### 반복자 개선 + +반복자를 사용하는 방식이 개선되어 forEach() 메서드를 통해 반복 작업을 수행할 수 있게 되었고 병렬 처리도 가능. + +### 타입 어노테이션(Type Annotations `@NotNull`) + +타입 어노테이션을 사용하여 코드의 가독성을 높일 수 있고, 정적 분석 및 코드 검증을 위한 정보를 추가할 수 있음 + +타입 어노테이션은 주로 `변수 선언`, `반환 타입`, `매개변수` 등의 `타입에 추가 정보`를 제공하는 데 사용됨 + +### 그 외 + +이 외에도 성능 개선, 보안 강화, 개선된 컴파일러 등 여러 가지 기능과 개선 사항이 추가됨 + +--- + +## JDK 11 + +### G1 GC가 기본 값으로 등록됨 + +LTS 기준 **JDK 8**까지는 **Parallel GC**가 **기본값**이었다. + +JDK 7에 첫 등장한 **G1 GC**가 **기본값**으로 등록된 버전이다. + +### 문자열 메서드 추가 + +`isBlank`, `lines`, `strip`, `stripLeading`, `stripTrailing` 및 `repeat`와 같은 새로운 메서드들이 추가됨 + +### Collection to Array + +toArray()가 추가되어 List -> Array의 변환이 간편해졌다. + +```java +List sampleList = Arrays.asList("Java", "Kotlin"); +String[] sampleArray = sampleList.toArray(String[]::new); +assertThat(sampleArray).containsExactly("Java", "Kotlin"); +``` + +### var 키워드 추가 + +람다 매개변수에서 로컬 변수 구문인 var 키워드 추가됐다. + +```java +List sampleList = Arrays.asList("Java", "Kotlin"); +String resultString = sampleList.stream() + .map((@Nonnull var x) -> x.toUpperCase()) + .collect(Collectors.joining(", ")); +assertThat(resultString).isEqualTo("JAVA, KOTLIN"); +``` + +### 새로운 HTTP Client 추가 + +Java 9에서 도입된 java.net.http 패키지의 새로운 HTTP 클라이언트가 Java 11의 표준 기능이 됐다. + +새 HTTP API는 전반적인 성능을 개선하고 HTTP/1.1 및 HTTP/2를 모두 지원한다. + +```java +HttpClient httpClient = HttpClient.newBuilder() + .version(HttpClient.Version.HTTP_2) + .connectTimeout(Duration.ofSeconds(20)) + .build(); +HttpRequest httpRequest = HttpRequest.newBuilder() + .GET() + .uri(URI.create("http://localhost:" + port)) + .build(); +HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString()); +assertThat(httpResponse.body()).isEqualTo("Hello from the server!"); +``` + +### Java 파일 실행의 간소화 + +javac를 사용하여 Java 소스 파일을 컴파일할 필요없이 실행 가능해졌다. + +이전 버전 +```shell +$ javac HelloWorld.java +$ java HelloWorld +Hello Java 8! +``` + +신규 버전 +```shell +$ java HelloWorld +Hello Java 11! +``` + +### A No-Op Garbage Collector 추가 + +Epsilon이라는 새로운 가비지 수집기가 Java 11에서 실험판으로 열렸다. + +메모리를 할당하지만 실제로 가비지를 수집하지 않기 때문에 No-Op(작업 없음)라고 한다. + +따라서 Epsilon은 메모리 부족 오류를 시뮬레이션하는 데 적용할 수 있다. + +분명히 Epsilon은 일반적인 프로덕션 Java 애플리케이션에 적합하지 않지만 유용할 수 있는 몇 가지 특정 사용 사례가 있다. + +`성능 시험`, `메모리 부하 테스트`, `VM 인터페이스 테스트 및 수명이 매우 짧은 작업` + +이 GC를 사용하려면 + +```shell +-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC +``` +플래그를 사용하면 된다. + +--- + +## Java 17 + +### Sealed class 추가 + +Sealed classe와 interface는 다른 클래스나 인터페이스가 확장하거나 구현할 수 없도록 범위를 제한한다. + +### Sealed class vs Final class + +`확장 가능성` + +- Final 클래스 + - Final 클래스는 어느 곳에서도 상속할 수 없다. + +- Sealed 클래스 + - Sealed 클래스는 제한된 범위 내에서만 상속이 가능하다. 특정 클래스나 인터페이스 목록을 permits 절로 지정하여, 해당 클래스나 인터페이스만이 sealed 클래스를 상속하거나 구현할 수 있다. + +`유연성` + +- Final 클래스 + - Final 클래스는 상속을 금지하므로, 하위 클래스에서 상속 받은 메서드를 오버라이드 할 수 없다. + +- Sealed 클래스 + - Sealed 클래스는 permits 절에 선언된 클래스들에 대한 상속을 허용하지만, 해당 클래스들 내에서는 상속을 계속할 수 있다. + - 즉, Sealed 클래스의 하위 클래스는 다른 메서드를 추가하거나, 상속 계층을 더 확장할 수 있다. + +`설계 목적` + +- Final 클래스 + - Final 클래스는 보안 상의 이유로 상속을 막거나, 불변성을 보장하고자 할 때 사용된다. 다른 클래스가 해당 클래스를 상속하거나 변경하지 못하도록 하여 의도한 동작을 보장한다. + +- Sealed 클래스 + - Sealed 클래스는 클래스 계층 구조의 일부를 통제하고 특정 클래스나 인터페이스를 상속 또는 구현할 수 있는 클래스의 범위를 제한함으로써, 더 명확하고 제한된 클래스 계층을 구성할 수 있게된다. + +--- + + +# Java final 키워드 + +## 변수 / 메서드 / 클래스 + +# 추상클래스와 인터페이스 차이 + +## Java 는 다중상속이 불가 + +# Warpper 클래스 + +## Boxing/Unboxing + +객체지향 / null / Generic + +# Reactive Streams + +# Spring Reacitve Stack에 대해 이해하기 + +# Webflux + +# Publish/Subscribe + +# Mono/Flux