Skip to content

Commit

Permalink
GITBOOK-193: No subject
Browse files Browse the repository at this point in the history
  • Loading branch information
GoldenPearls authored and gitbook-bot committed Nov 14, 2024
1 parent 3e05b96 commit 857713e
Showing 1 changed file with 25 additions and 20 deletions.
45 changes: 25 additions & 20 deletions developLog/programming-lanuage/java/effective-java/7/item-45.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,27 @@

μŠ€νŠΈλ¦Όμ΄λž€ μžλ°” 8λΆ€ν„° **λ‹€λŸ‰μ˜ 데이터 처리 μž‘μ—…**(순차/병렬)을 λ•κ³ μž λ‚˜μ˜¨ API이며, 두 가지 핡심적인 좔상 κ°œλ…μ„ μ œκ³΅ν•œλ‹€.

μŠ€νŠΈλ¦Όμ€ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ νŒŒμ΄ν”„λΌμΈμœΌλ‘œ 연결될 수 μžˆλŠ” λ‹€μ–‘ν•œ λ©”μ„œλ“œλ₯Ό μ§€μ›ν•˜λŠ” 개체 μ‹œν€€μŠ€μ΄λ‹€. λ°μ΄ν„°μ˜ 흐름, 즉 슀트림이 ν˜λŸ¬κ°€λŠ” κ³Όμ •μ—μ„œ 데이터가 순차적으둜 ν•˜λ‚˜μ”© μ‚¬μš©λ˜κ³  사라진닀.
`슀트림`은 **μ›ν•˜λŠ” κ²°κ³Όλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ νŒŒμ΄ν”„λΌμΈμœΌλ‘œ 연결될 수 μžˆλŠ” λ‹€μ–‘ν•œ λ©”μ„œλ“œλ₯Ό μ§€μ›ν•˜λŠ” 개체 μ‹œν€€μŠ€**이닀. λ°μ΄ν„°μ˜ 흐름, 즉 슀트림이 ν˜λŸ¬κ°€λŠ” κ³Όμ •μ—μ„œ 데이터가 순차적으둜 ν•˜λ‚˜μ”© μ‚¬μš©λ˜κ³  사라진닀.

λŒ€μš©λŸ‰ 데이터λ₯Ό μ²˜λ¦¬ν•  λ•Œ νš¨μœ¨μ„ 높이기 μœ„ν•΄, μ˜€ν† λ°•μ‹±/μ–Έλ°•μ‹± 과정이 ν•„μš” μ—†λŠ” `Intstream` κ³Ό 같은 κΈ°λ³Έν˜• μŠ€νŠΈλ¦Όλ„ μ œκ³΅ν•œλ‹€.

> πŸ”– **슀트림의 좔상 κ°œλ…**\
> 1\. 슀트림(stream) : 데이터 μ›μ†Œμ˜ μœ ν•œ ν˜Ήμ€ λ¬΄ν•œ μ‹œν€€μŠ€\
> 2\. 슀트림 νŒŒμ΄ν”„λΌμΈ(stream pipeline) : 이 μ›μ†Œλ“€λ‘œ μˆ˜ν–‰ν•˜λŠ” μ—°μ‚° 단계λ₯Ό ν‘œν˜„
> 2\. 슀트림 νŒŒμ΄ν”„λΌμΈ(stream pipeline) : 이 μ›μ†Œλ“€λ‘œ μˆ˜ν–‰ν•˜λŠ” **μ—°μ‚° 단계λ₯Ό ν‘œν˜„**
#### ☁️ 슀트림 νŒŒμ΄ν”„λΌμΈ <a href="#undefined" id="undefined"></a>
## 1. 슀트림 νŒŒμ΄ν”„λΌμΈ <a href="#undefined" id="undefined"></a>

![](https://velog.velcdn.com/images/semi-cloud/post/8f2e7dd2-405b-4653-bc32-9269a0f7cc59/image.png)

**슀트림 νŒŒμ΄ν”„λΌμΈ μ—°μ‚°**
### 🌱 **슀트림 νŒŒμ΄ν”„λΌμΈ μ—°μ‚°**

슀트림 νŒŒμ΄ν”„λΌμΈμ€ μ†ŒμŠ€ μŠ€νŠΈλ¦Όμ—μ„œ μ‹œμž‘ν•΄ 쒅단 μ—°μ‚°μœΌλ‘œ λλ‚˜λ©°, κ·Έ 사이에 ν•˜λ‚˜ μ΄μƒμ˜ 쀑간 연산이 μžˆμ„ 수 μžˆλ‹€.

**1. 쀑간 μ—°μ‚°(Intermediate Operation)**\
각 쀑간 연산은 **μŠ€νŠΈλ¦Όμ„ μ–΄λ– ν•œ λ°©μ‹μœΌλ‘œ λ³€ν™˜**ν•˜λŠ” 역할을 μˆ˜ν–‰ν•˜λ©°, λͺ¨λ‘ ν•œ μŠ€νŠΈλ¦Όμ„ λ‹€λ₯Έ 슀트림으둜 λ³€ν™˜ν•˜κ²Œ ν•˜μ—¬ λ©”μ„œλ“œ 체이닝을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 각 μ›μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•˜κ±°λ‚˜ νŠΉμ • 쑰건을 만쑱 λͺ»ν•˜λŠ” μ›μ†Œλ₯Ό κ±ΈλŸ¬λ‚Ό 수 μžˆλ‹€.
#### **1. 쀑간 μ—°μ‚°(Intermediate Operation)** 각 쀑간 연산은 **μŠ€νŠΈλ¦Όμ„ μ–΄λ– ν•œ λ°©μ‹μœΌλ‘œ λ³€ν™˜**ν•˜λŠ” 역할을 μˆ˜ν–‰ν•˜λ©°, λͺ¨λ‘ ν•œ μŠ€νŠΈλ¦Όμ„ λ‹€λ₯Έ 슀트림으둜 λ³€ν™˜ν•˜κ²Œ ν•˜μ—¬ λ©”μ„œλ“œ 체이닝을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€. λ³€ν™˜ 된 슀트림의 μ›μ†Œ νƒ€μž…μ€ λ³€ν™˜ μ „ 슀트림의 μ›μ†Œ νƒ€μž…κ³Ό 같을 μˆ˜λ„ 있고 λ‹€λ₯Ό μˆ˜λ„ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 각 μ›μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•˜κ±°λ‚˜ νŠΉμ • 쑰건을 만쑱 λͺ»ν•˜λŠ” μ›μ†Œλ₯Ό κ±ΈλŸ¬λ‚Ό 수 μžˆλ‹€.&#x20;

* `filter()`, `map()`, `sorted()`

**2. 쒅단 μ—°μ‚°(Terminal Operation)**\
쒅단 연산은 λ§ˆμ§€λ§‰ 쀑간 연산이 내놓은 **μŠ€νŠΈλ¦Όμ— μ΅œν›„μ˜ 연산을 κ°€ν•˜λŠ”** 역할을 ν•œλ‹€. 예λ₯Ό λ“€μ–΄, μ›μ†Œλ₯Ό μ •λ ¬ν•΄ μ»¬λ ‰μ…˜μ— λ‹΄κ±°λ‚˜ νŠΉμ • μ›μ†Œλ₯Ό ν•˜λ‚˜ μ„ νƒν•˜λŠ” 식이닀.
#### **2. 쒅단 μ—°μ‚°(Terminal Operation)** 쒅단 연산은 λ§ˆμ§€λ§‰ 쀑간 연산이 내놓은 **μŠ€νŠΈλ¦Όμ— μ΅œν›„μ˜ 연산을 κ°€ν•˜λŠ”** 역할을 ν•œλ‹€. 예λ₯Ό λ“€μ–΄, μ›μ†Œλ₯Ό μ •λ ¬ν•΄ μ»¬λ ‰μ…˜μ— λ‹΄κ±°λ‚˜ νŠΉμ • μ›μ†Œλ₯Ό ν•˜λ‚˜ μ„ νƒν•˜λŠ” 식이닀.

* `forEach()`, `collect()`, `match()`, `count()`, `reduce()`

Expand All @@ -39,32 +37,39 @@ List<Integer> transactionsIds =

![](https://velog.velcdn.com/images/semi-cloud/post/7f73e3a6-941c-4c4d-af7e-b3a19d1b921e/image.png)

[https://www.geeksforgeeks.org/java-8-stream-tutorial/](https://www.geeksforgeeks.org/java-8-stream-tutorial/)
> [https://www.geeksforgeeks.org/java-8-stream-tutorial/](https://www.geeksforgeeks.org/java-8-stream-tutorial/)
#### ☁️ 슀트림 νŒŒμ΄ν”„λΌμΈ νŠΉμ§• <a href="#undefined" id="undefined"></a>
### 🌱 슀트림 νŒŒμ΄ν”„λΌμΈ νŠΉμ§• <a href="#undefined" id="undefined"></a>

**1. 지연 평가(lazy evaluation)**
#### **1. 지연 평가(lazy evaluation)** <a href="#undefined" id="undefined"></a>

λ¨Όμ € μ§€μ—°μ΄λž€ **결과값이 ν•„μš”ν• λ•ŒκΉŒμ§€ 계산을 λŠ¦μΆ”λŠ”** 기법을 μ˜λ―Έν•œλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ μ–΄λŠ λΆ€λΆ„μ—μ„œ κ°€μž₯ 큰 이읡을 얻을 수 μžˆμ„κΉŒ?

> λŒ€μš©λŸ‰μ˜ λ°μ΄ν„°μ—μ„œ, **μ‹€μ œλ‘œ ν•„μš”ν•˜μ§€ μ•Šμ€ 데이터듀을 νƒμƒ‰ν•˜λŠ” 것을 방지**ν•΄ 속도λ₯Ό 높일 수 μžˆλ‹€. 즉, 쒅단 연산에 쓰이지 μ•ŠλŠ” 데이터 μ›μ†ŒλŠ” 계산 μžμ²΄μ— 쓰이지 μ•ŠλŠ”λ‹€. 그리고 이것을 `Short-Circuit` 방식이라 λΆ€λ₯Έλ‹€.
![](https://velog.velcdn.com/images/semi-cloud/post/46a80a05-ff1a-4ab6-9e43-88aadb31e8cc/image.png)\
[https://www.logicbig.com/tutorials/core-java-tutorial/java-util-stream/short-circuiting.html](https://www.logicbig.com/tutorials/core-java-tutorial/java-util-stream/short-circuiting.html)
<figure><img src="https://velog.velcdn.com/images/semi-cloud/post/46a80a05-ff1a-4ab6-9e43-88aadb31e8cc/image.png" alt=""><figcaption></figcaption></figure>

> [https://www.logicbig.com/tutorials/core-java-tutorial/java-util-stream/short-circuiting.html](https://www.logicbig.com/tutorials/core-java-tutorial/java-util-stream/short-circuiting.html)
슀트림 νŒŒμ΄ν”„λΌμΈμ„ μ‹€ν–‰ν•˜κ²Œ 되면, `JVM` 은 κ³§λ°”λ‘œ 슀트림 연산을 μ‹€ν–‰μ‹œν‚€μ§€ μ•ŠλŠ”λ‹€. μ΅œμ†Œν•œμœΌλ‘œ ν•„μˆ˜μ μΈ μž‘μ—…λ§Œ μˆ˜ν–‰ν•˜κ³ μž 검사λ₯Ό λ¨Όμ € ν•˜κ³ , 이λ₯Ό λ°”νƒ•μœΌλ‘œ μ΅œμ ν™” 방법을 μ°Ύμ•„λ‚΄ κ³„νšν•œλ‹€. 그리고 κ·Έ κ³„νšμ— 따라 κ°œλ³„ μš”μ†Œμ— λŒ€ν•œ 슀트림 연산을 μˆ˜ν–‰ν•œλ‹€.

예λ₯Ό λ“€μ–΄, `10000` 개의 데이터쀑에 길이가 5κ°€ λ„˜λŠ” λ¬Έμžμ—΄μ—μ„œ κ°€μž₯ μ•ŒνŒŒλ²³μˆœμœΌλ‘œ μ•žμ— μžˆλŠ” 2개의 λ¬Έμžμ—΄λ§Œ 가지고 였고 μ‹Άλ‹€κ³  ν•˜μž. 지연 평가가 없이 μˆœμ„œλŒ€λ‘œ λ°”λ‘œ λ™μž‘ν–ˆλ‹€λ©΄, `10000` 개의 데이터λ₯Ό λͺ¨λ‘ μˆœνšŒν•΄μ•Ό ν–ˆμ„ 것이닀.

ν•˜μ§€λ§Œ μ–΄μ§œν”Ό μ΅œμ’…μ μœΌλ‘œ 2개만 νƒμƒ‰ν•˜λ©΄ λ˜λŠ”λ° 전체 데이터λ₯Ό λ‹€ λ³Ό ν•„μš”κ°€ μžˆμ„κΉŒ?

1. `limit` μ‚¬μš© O\
![](https://velog.velcdn.com/images/semi-cloud/post/d762d983-e0dd-4f8f-a535-c7fef2c58483/image.png)
2. `limit` μ‚¬μš© X\
![](https://velog.velcdn.com/images/semi-cloud/post/ee8b44f3-0172-4b03-bcd6-f3979d65f342/image.png)
1. `limit` μ‚¬μš© O\


<figure><img src="https://velog.velcdn.com/images/semi-cloud/post/d762d983-e0dd-4f8f-a535-c7fef2c58483/image.png" alt=""><figcaption></figcaption></figure>
2. `limit` μ‚¬μš© X\


<figure><img src="https://velog.velcdn.com/images/semi-cloud/post/ee8b44f3-0172-4b03-bcd6-f3979d65f342/image.png" alt=""><figcaption></figcaption></figure>

κ²°κ³Όλ₯Ό 봐보자. `limit(n)` 연산이 λ‚΄λΆ€μ μœΌλ‘œ μžμ‹ μ—κ²Œ λ„λ‹¬ν•œ μš”μ†Œκ°€ `n` κ°œκ°€ λ˜μ—ˆμ„ λ•Œ 슀트림 λ‚΄ λ‹€λ₯Έ μš”μ†Œλ“€μ— λŒ€ν•΄ 더 이상 μˆœνšŒν•˜μ§€ μ•Šκ³  νƒˆμΆœν•˜λ„λ‘ λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμ—, 길이가 `5`κ°€ λ„˜λŠ” 데이터 `4` κ°œκ°€ μ•„λ‹Œ, 맨 μ•žμ— `2` 개 데이터가 좜λ ₯된 것을 λ³Ό 수 μžˆλ‹€.\
![](https://velog.velcdn.com/images/semi-cloud/post/bc56f393-72aa-492e-b91c-c14269478d0e/image.png)


<figure><img src="https://velog.velcdn.com/images/semi-cloud/post/bc56f393-72aa-492e-b91c-c14269478d0e/image.png" alt=""><figcaption></figcaption></figure>

**μ˜ˆμ™Έ 사항: Stateful operations**

Expand Down Expand Up @@ -97,7 +102,7 @@ List<Integer> transactionsIds =
기본적으둜 슀트림 νŒŒμ΄ν”„λΌμΈμ€ 순차적으둜 μˆ˜ν–‰λœλ‹€. νŒŒμ΄ν”„λΌμΈμ„ λ³‘λ ¬λ‘œ μ‹€ν–‰ν•˜λ €λ©΄, νŒŒμ΄ν”„λΌμΈμ„ κ΅¬μ„±ν•˜λŠ” 슀트림 쀑 ν•˜λ‚˜μ—μ„œ `parallel` λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ£ΌκΈ°λ§Œ ν•˜λ©΄ λ˜λ‚˜, 효과λ₯Ό λ³Ό 수 μžˆλŠ” 상황은 λ§Žμ§€ μ•Šλ‹€.
#### ☁️ λ°˜λ³΅λ¬Έμ„ 슀트림으둜 무쑰건 λ°”κΎΈλŠ”κ²ƒμ΄ μ’‹μ„κΉŒ? <a href="#undefined" id="undefined"></a>
### 🌱 λ°˜λ³΅λ¬Έμ„ 슀트림으둜 무쑰건 λ°”κΎΈλŠ”κ²ƒμ΄ μ’‹μ„κΉŒ? <a href="#undefined" id="undefined"></a>
μŠ€νŠΈλ¦Όμ„ μ œλŒ€λ‘œ μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ 짧고 κΉ”λ”ν•΄μ§€μ§€λ§Œ, 잘λͺ» μ‚¬μš©ν•˜λ©΄ 읽기 μ–΄λ ΅κ³  μœ μ§€λ³΄μˆ˜κ°€ νž˜λ“€λ‹€. κ·Έλ ‡λ‹€λ©΄ 방법은?
Expand Down Expand Up @@ -194,7 +199,7 @@ public class Anagrams {
4. μ›μ†Œλ“€μ˜ μ‹œν€€μŠ€λ₯Ό μ»¬λ ‰μ…˜μ— λͺ¨μœΌλŠ” 경우(κ³΅ν†΅λœ 속성을 κΈ°μ€€μœΌλ‘œ) : `collect()`
5. μ›μ†Œλ“€μ˜ μ‹œν€€μŠ€μ—μ„œ νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” μ›μ†Œλ₯Ό 찾을 경우 : `filter()`
#### ☁️ 슀트림으둜 μ²˜λ¦¬ν•˜κΈ° μ–΄λ €μš΄ 경우 <a href="#undefined" id="undefined"></a>
### 🌱 슀트림으둜 μ²˜λ¦¬ν•˜κΈ° μ–΄λ €μš΄ 경우 <a href="#undefined" id="undefined"></a>
ν•œ 데이터가 νŒŒμ΄ν”„λΌμΈμ˜ μ—¬λŸ¬ 단계λ₯Ό ν†΅κ³Όν•΄μ•Όν• λ•Œ, 이 λ°μ΄ν„°μ˜ 각 λ‹¨κ³„μ—μ„œμ˜ 값듀에 λ™μ‹œμ— μ ‘κ·Όν•˜λŠ” κ²½μš°μ—λŠ” μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜κΈ° νž˜λ“€λ‹€. νŒŒμ΄ν”„λΌμΈμ€ 일단 ν•œ 값을 λ‹€λ₯Έ 값에 λ§€ν•‘ν•˜κ³  λ‚˜λ©΄ μ›λž˜μ˜ 값은 μžƒλŠ” ꡬ쑰이기 λ•Œλ¬Έμ΄λ‹€.
Expand Down

0 comments on commit 857713e

Please sign in to comment.