Skip to content

Commit

Permalink
기본이 중요하다
Browse files Browse the repository at this point in the history
  • Loading branch information
K-Diger committed Nov 3, 2023
1 parent e553cf7 commit 43ecc18
Showing 1 changed file with 172 additions and 46 deletions.
218 changes: 172 additions & 46 deletions _posts/2023-10-19-Language.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,38 +18,38 @@ mermaid: true
Equals 메서드는 두 객체의 ****이 같은지 비교하는 메서드이다.

```java
private void equals1() {
String string1 = "TEST";
String string2 = "TEST";
String newString1 = new String("TEST");
String newString2 = new String("Other TEST");
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("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("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);
}
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"는 문자열 리터럴로 이미 존재하는 문자열이기 때문에 동일한 객체를 가리킨다.
- 두 문자열은 내용이 동일하므로 equals 메서드는 true를 반환한다.
- string1 == string2는 두 문자열이 동일한 객체를 가리키는지를 확인하는 것인데, "TEST"는 문자열 리터럴로 이미 존재하는 문자열이기 때문에 동일한 객체를 가리킨다.

- string1.equals(newString1)은 string1과 newString1을 비교한다.
- 두 문자열은 내용이 동일하므로 equals 메서드는 true를 반환한다.
- string1 == newString1은 string1이 리터럴 문자열을 가리키고 newString1은 새로운 문자열 객체를 생성했기 때문에 두 객체는 서로 다르다.
- 두 문자열은 내용이 동일하므로 equals 메서드는 true를 반환한다.
- string1 == newString1은 string1이 리터럴 문자열을 가리키고 newString1은 새로운 문자열 객체를 생성했기 때문에 두 객체는 서로 다르다.

- newString1.equals(newString2)는 newString1과 newString2를 비교한다.
- 두 문자열 내용이 다르기 때문에 equals 메서드는 false를 반환한다.
- newString1 == newString2는 두 객체가 서로 다르기 때문에 false를 반환한다.
- 두 문자열 내용이 다르기 때문에 equals 메서드는 false를 반환한다.
- newString1 == newString2는 두 객체가 서로 다르기 때문에 false를 반환한다.

## 동일성 (==)

Expand Down Expand Up @@ -126,29 +126,37 @@ public class String {

![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 기반의 프로그램을 작성부터 빌드 후 실행까지 할 수 있는 환경 |
- JRE
- 빌드가 완료된 Java 기반의 프로그램을 실행 할 수 있는 환경
- JDK
- 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

### 스트림/람다
Expand All @@ -161,25 +169,34 @@ JDK 8, 11 등 보편적으로 JDK(Java) 버전을 가리킬 때 이 SE 버전을

#### 스트림 - 생성 / 중간연산 / 최종연산

---

### 날짜 및 시간 API (`LocalDateTime`)

`LocalDateTime`타입 등장

---

### 인터페이스 기본 메서드(Default Methods)

인터페이스에서도 메서드의 구현을 제공할 수 있게 되었다. 기존에 인터페이스를 구현한 클래스에 새로운 메서드가 추가되더라도 해당 클래스를 수정하지 않고도 기본 구현을 사용할 수 있음

---

### 반복자 개선

반복자를 사용하는 방식이 개선되어 forEach() 메서드를 통해 반복 작업을 수행할 수 있게 되었고 병렬 처리도 가능.

---

### 타입 어노테이션(Type Annotations `@NotNull`)

타입 어노테이션을 사용하여 코드의 가독성을 높일 수 있고, 정적 분석 및 코드 검증을 위한 정보를 추가할 수 있음

타입 어노테이션은 주로 `변수 선언`, `반환 타입`, `매개변수` 등의 `타입에 추가 정보`를 제공하는 데 사용됨

---

### 그 외

이 외에도 성능 개선, 보안 강화, 개선된 컴파일러 등 여러 가지 기능과 개선 사항이 추가됨
Expand All @@ -194,68 +211,82 @@ 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");
List sampleList=Arrays.asList("Java","Kotlin");
String[]sampleArray=sampleList.toArray(String[]::new);
assertThat(sampleArray).containsExactly("Java","Kotlin");
```

---

### var 키워드 추가

람다 매개변수에서 로컬 변수 구문인 var 키워드 추가됐다.

```java
List<String> sampleList = Arrays.asList("Java", "Kotlin");
String resultString = sampleList.stream()
.map((@Nonnull var x) -> x.toUpperCase())
.collect(Collectors.joining(", "));
assertThat(resultString).isEqualTo("JAVA, KOTLIN");
List<String> 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.1HTTP/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!");
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에서 실험판으로 열렸다.
Expand All @@ -273,6 +304,7 @@ Epsilon이라는 새로운 가비지 수집기가 Java 11에서 실험판으로
```shell
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
```

플래그를 사용하면 된다.

---
Expand All @@ -283,6 +315,8 @@ Epsilon이라는 새로운 가비지 수집기가 Java 11에서 실험판으로

Sealed classe와 interface는 다른 클래스나 인터페이스가 확장하거나 구현할 수 없도록 범위를 제한한다.

---

### Sealed class vs Final class

`확장 가능성`
Expand Down Expand Up @@ -312,27 +346,119 @@ Sealed classe와 interface는 다른 클래스나 인터페이스가 확장하

---

# final 키워드

## final 변수

변수의 값 변경을 금지한다. (상수화한다.)

## final 메서드

Override를 금지한다.

## 클래스

상속을 금지한다.

---

# 추상 클래스와 인터페이스 차이

**추상 클래스**는 멤버 변수를 가질 수 있고 기본 메서드를 가지고 있을 수 있으며 사용자에게 구현할 메서드를 명세할 수 있다.

**인터페이스**는 멤버 변수를 가질 수 없고, 기본적으로 구현할 메서드를 명세하는 기능만 존재한다. (JDK 8 버전부터는 기본 메서드를 제공한다.)

가장 큰 차이점은 다중 상속 가능 여부이다. **추상 클래스는 다중 상속이 불가능**하며 **인터페이스는 가능**하다.

---

## 다중상속이 불가능한 이유

다중 상속의 가장 큰 문제점은 **다이아몬드 현상**이다.

![](https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995652405C723D2216)

```java
class GrandFather {
void myMethod(){
System.out.println("GrandFather");
}
}

class FatherA extends GrandFather {
@Override
void myMethod(){
System.out.println("FatherA");
}
}

class FatherB extends GrandFather {
@Override
void myMethod(){
System.out.println("FatherB");
}
}

class Son extends FatherA, FatherB{
@Override
void myMethod() {
super.myMethod(); // 어떤 메서드를 호출해야하는가?
}
}
```


`FatherA`와 `FatherB`를 모두 **상속받은 Son 클래스** 입장에서는 `어떤 부모의 myMethod()`를 사용해야 할지 판단할 수 없다. 하라면 하겠지만 복잡성을 다루는 코드를 써야하고, 이에 따른 휴먼 에러가 발생할 가능성이 높게된다.

이렇게 코드의 복잡성을 증가시키게 되는 이유로 자바에서는 클래스 다중 상속이 불가능하다. (인터페이스는 가능하다.)

---

# Primitive Type, Wrapper Class

# Java final 키워드
JavaPrimitive Type, Wrapper Class 두 가지의 범주를 가진 데이터 타입이 존재한다.

## 변수 / 메서드 / 클래스
Wrapper Class는 모두 Object를 상속받은 **객체**로써 다루어진다.

# 추상클래스와 인터페이스 차이
## Primitive Type

## Java 는 다중상속이 불가
- Primitive Type은 메모리 사용량이 적고, 연산 속도가 빠르다.

# Warpper 클래스
- Primitive TypeGarbage Collector에 의해 자동으로 관리되지 않는다.

## Boxing/Unboxing
- Primitive TypeJava뿐만 아니라 다른 프로그래밍 언어에서도 사용되는 표준 타입이라서 다른 프로그래밍 언어와의 호환성을 높이는 데 도움이 된다.

객체지향 / null / Generic
## Wrapper Class

- Wrapper ClassNull을 가질 수 있다. 그래서 Null값을 다뤄야하는 상황이라면 반드시 해두는게 좋다. (Entity Class)

- Generic에 사용될 수 있다. 컬렉션을 다루거나 제네릭을 활용한 타입의 확장성을 챙길 수 있다.
- Generic에 기본 자료형 사용시 AutoBoxingAutoUnBoxing이 일어난다.
- Boxing : Primitive -> Wrapper Class
- UnBoxing : Wrapper Class -> Primitive

AutoBoxing/AutoUnBoxing 같은 경우는 성능 차이가 확연하게 나타나는 기술이다. 따라서 무분별하게 사용되고 있는 곳이 없는지 꼼꼼하게 체크해야한다.

---

# Reactive Streams


---


# Spring Reacitve Stack에 대해 이해하기


---


# Webflux

---

# Publish/Subscribe

---

# Mono/Flux

0 comments on commit 43ecc18

Please sign in to comment.