๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Dev Book Review/Java8 in Action

[์ž๋ฐ”8์ธ์•ก์…˜] Chap.1 ์ž๋ฐ” 8์„ ๋ˆˆ์—ฌ๊ฒจ ๋ด์•ผํ•˜๋Š” ์ด์œ 

์†Œ์Šค์ฝ”๋“œ

https://github.com/mjung1798/Jyami-Java-Lab/tree/master/java8-in-action

 

mjung1798/Jyami-Java-Lab

๐Ÿ’ป Jyami์˜ Spring boot ๋ฐ Java ์‹คํ—˜์†Œ ๐Ÿ’ป. Contribute to mjung1798/Jyami-Java-Lab development by creating an account on GitHub.

github.com

1. ์ž๋ฐ”์˜ ๋ณ€ํ™”

a. ์ž๋ฐ”์˜ ์‹œ์ž‘

  • ์ถœ๋ฐœ์ž์ฒด๊ฐ€ ๋งŽ์€ ์œ ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๋Š” ์ž˜ ์„ค๊ณ„๋œ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด
  • ์†Œ์†Œํ•œ ๋™์‹œ์„ฑ๋„ ์ง€์›
  • JVM ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ํŠน์ง• -> ์ธํ„ฐ๋„ท ์• ํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋žจ ์ฃผ ์–ธ์–ด
  • ์บก์Šํ™” ๋•๋ถ„์— C์— ๋น„ํ•ด ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง์  ๋ฌธ์ œ๊ฐ€ ํ›จ์”ฌ ์ ๋‹ค.

b. ์–ธ์–ด ์ƒํƒœ๊ณ„์˜ ๋ณ€ํ™”

๋น…๋ฐ์ดํ„ฐ์— ์ง๋ฉดํ•˜๋ฉด์„œ ๋ฉ€ํ‹ฐ์ฝ”์–ด ์ปดํ“จํ„ฐ, ์ปดํ“จํŒ… ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ์›€์ง์ž„์ด ์ƒ๊น€ : ๋ณ‘๋ ฌ ํ”„๋กœ์„ธ์‹ฑ ํ™œ์šฉ

๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์™€ ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•ด์•ผ ํ–ˆ๋‹ค => ์ž๋ฐ” 8์˜ ๋ณ€ํ™”

c. ์ž๋ฐ” 8์˜ 3๊ฐ€์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…

1. ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ(Stream processing) : ์—ฌ๋Ÿฌํ–‰์˜ ์ŠคํŠธ๋ฆผ์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ์—ฌ๋Ÿฌ ํ–‰์˜ ์ŠคํŠธ๋ฆผ์„ ์ถœ๋ ฅ์œผ๋กœ ๋งŒ๋“ ๋‹ค.

cat file1 file2 | tr "[A-Z]" "[a-z]" | sort | tail -3

Stream<T> : ํ•˜๋ ค๋Š” ์ž‘์—…์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ผ๋ จ์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“ค์–ด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ, ์ž…๋ ฅ ๋ถ€๋ถ„์„ ์—ฌ๋Ÿฌ CPU ์ฝ”์–ด์— ํ• ๋‹น ๊ฐ€๋Šฅ

2. ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”(behavior prameterization)๋กœ ๋ฉ”์„œ๋“œ์— ์ฝ”๋“œ ์ „๋‹ฌ

์ฝ”๋“œ์˜ ์ผ๋ถ€๋ฅผ API๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ : ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

3. ๋ณ‘๋ ฌ์„ฑ๊ณผ ๊ณต์œ  ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ

์ŠคํŠธ๋ฆผ ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ์™€ ๋™์‹œ์— ์‹คํ–‰๋˜๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ–‰์ด ๋œ๋‹ค.

๊ณต์œ  ๊ฐ€๋ณ€๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค => ์ˆœ์ˆ˜(pure) ํ•จ์ˆ˜, ๋ถ€์ž‘์šฉ์—†๋Š”(side-effect-free) ํ•จ์ˆ˜, ์ƒํƒœ์—†๋Š”(stateless) ํ•จ์ˆ˜ : ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ž๋ฐ” ์—ญ์‹œ ํ•˜๋“œ์›จ์–ด๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๊ธฐ๋Œ€์˜ ๋ณ€ํ™”์— ๋ถ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€ํ™”ํ•˜์˜€๋‹ค.

 

2. ์ž๋ฐ” ํ•จ์ˆ˜

์ž๋ฐ”์˜ ํ•จ์ˆ˜ : ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ํ•จ์ˆ˜

์ž๋ฐ”8๋กœ ์ธํ•ด ์ด๊ธ‰ ์‹œ๋ฏผ => ์ผ๊ธ‰ ์‹œ๋ฏผ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚ฌ๋‹ค.

  • ์ผ๊ธ‰(first-class) ์‹œ๋ฏผ : ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ, ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๊ฐ’ : ๊ธฐ๋ณธ๊ฐ’(int, double), ๊ฐ์ฒด(String, Integer, HashMap ๋“ฑ)
  • ์ด๊ธ‰ ์‹œ๋ฏผ : ์ „๋‹ฌ ํ•  ์ˆ˜ ์—†๋Š” ๊ตฌ์กฐ์ฒด, ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ๊ฐ’ : ๋ฉ”์„œ๋“œ, ํด๋ž˜์Šค

a. ๋ฉ”์„œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค(method reference)

์ด ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค : ๋ฉ”์„œ๋“œ๊ฐ€ ์ด๊ธ‰๊ฐ’์ด ์•„๋‹Œ ์ผ๊ธ‰๊ฐ’์ด ๋˜์—ˆ๋‹ค.

๊ฐ์ฒด ๋ ˆํผ๋Ÿฐ์Šค(new Object())๋กœ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ ๋ฐ›์•˜๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ฉ”์„œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ „๋‹ฌ ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค.

b. ๋žŒ๋‹ค(lambda):์ต๋ช…ํ•จ์ˆ˜(anonymous function)

ํ•จ์ˆ˜๋„ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง์ ‘ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žˆ๋Š” ํŽธ๋ฆฌํ•œ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์„ ๋•Œ ์ƒˆ๋กœ์šด ๋žŒ๋‹ค ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋žŒ๋‹ค ๋ฌธ๋ฒ• ํ˜•์‹์œผ๋กœ ๊ตฌํ˜„๋œ ํ”„๋กœ๊ทธ๋žจ == ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ == ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰๊ฐ’์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

 

3. ์ŠคํŠธ๋ฆผ(stream)

์ปฌ๋ ‰์…˜ ์ŠคํŠธ๋ฆผ
๋ฐ˜๋ณต๊ณผ์ •์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•œ๋‹ค (for-each) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜๋ฆฌ๋œ๋‹ค
์™ธ๋ถ€๋ฐ˜๋ณต(external iteration) ๋‚ด๋ถ€ ๋ฐ˜๋ณต(internal iteration)
  ์—ฌ๋Ÿฌ CPU ์ฝ”์–ด์— ์ž‘์—…์„ ๊ฐ๊ฐ ํ• ๋‹นํ•ด์„œ ์ฒ˜๋ฆฌ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋ง(filtering)
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœ(extracting)
  • ๋ฐ์ดํ„ฐ ๊ทธ๋ฃนํ™”(gropuing)
  • ๋™์ž‘์„ ์‰ฝ๊ฒŒ ๋ณ‘๋ ฌํ™” ๊ฐ€๋Šฅ
    ํฌํ‚น(forking) => ํฌํ‚น๋œ ๋ฆฌ์ŠคํŠธ ์ฒ˜๋ฆฌ => ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์นจ

์ถ”๊ฐ€ : ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค
  • ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ปดํฌ๋„ŒํŠธ๊ฐ„์— ์ƒํ˜ธ์ž‘์šฉ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค(๊ฐ€๋ณ€์ด ์•„๋‹ˆ๋‹ค)

 

4. ๋””ํดํŠธ ๋ฉ”์„œ๋“œ

๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์–ด๋ ค์›€ ํ•ด๊ฒฐ : ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ํด๋ž˜์Šค๋„ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ–ˆ๋‹ค.

๊ตฌํ˜„ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ

 

5. ๊ทธ ์™ธ

  • Optional<T> ํด๋ž˜์Šค : ๊ฐ’์„ ๊ฐ–๊ฑฐ๋‚˜ ๊ฐ–์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด
  • ๊ตฌ์กฐ์ (structural) ํŒจํ„ด ๋งค์นญ ๊ธฐ๋ฒ• : ๋ฐ์ดํ„ฐ ํ˜•์‹ ๋ถ„๋ฅ˜์™€ ๋ถ„์„์„ ํ•œ๋ฒˆ์— ์ˆ˜ํ–‰