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