Post

๐Ÿฃ chap1. ์ž๋ฐ” 8, 9, 10, 11 : ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”๊ฐ€?

์ž๋ฐ” ์—ญ์‚ฌ๋ฅผ ํ†ตํ‹€์–ด ๊ฐ€์žฅ ํฐ ๋ณ€ํ™”๊ฐ€ ์ž๋ฐ” 8์—์„œ ์ผ์–ด๋‚ฌ๋‹ค.




1.1 ์—ญ์‚ฌ์˜ ํ๋ฆ„์€ ๋ฌด์—‡์ธ๊ฐ€?

  • ์ž๋ฐ” 8์„ ์ด์šฉํ•˜๋ฉด ์ž์—ฐ์–ด์— ๋” ๊ฐ€๊น๊ฒŒ ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ง€๊ธˆ๊นŒ์ง€์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์€ ์ฝ”์–ด ์ค‘ ํ•˜๋‚˜๋งŒ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

    • ๋‚˜๋จธ์ง€ ์ฝ”์–ด๋Š” ์œ ํœด idle ์ƒํƒœ๋กœ ๋‘๊ฑฐ๋‚˜, ์šด์˜์ฒด์ œ๋‚˜ ๋ฐ”์ด๋Ÿฌ์Šค ๊ฒ€์‚ฌ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ”„๋กœ์„ธ์Šค ํŒŒ์›Œ๋ฅผ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉ
  • ์ž๋ฐ” 8 ๋“ฑ์žฅ ์ด์ „ : ๋‚˜๋จธ์ง€ ์ฝ”์–ด ํ™œ์šฉ โ†’ ์Šค๋ ˆ๋“œ
    • ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ์€ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ต๊ณ  ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
    • ์ž๋ฐ” 1.0 : ์Šค๋ ˆ๋“œ, ๋ฝ, ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ ์ง€์›
    • ์ž๋ฐ” 5 : ์Šค๋ ˆ๋“œ ํ’€(thread pool), ๋ณ‘๋ ฌ ์‹คํ–‰ ์ปฌ๋ ‰์…˜(concurrent collection)
    • ์ž๋ฐ” 7 : ํฌํฌ/์กฐ์ธ ํ”„๋ ˆ์ž„์›Œํฌ
    • ์ž๋ฐ” 8 : ์ŠคํŠธ๋ฆผ API, ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”, ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ
    • ์ž๋ฐ” 9 : ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(RxJava)


์ž๋ฐ” 8

  • ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ
  • ๋ฉ€ํ‹ฐ์ฝ”์–ด ํ”„๋กœ์„ธ์„œ์˜ ์‰ฌ์šด ํ™œ์šฉ
  • ์ŠคํŠธ๋ฆผ
    • DB ์ฟผ๋ฆฌ์—์„œ ๊ณ ์ˆ˜์ค€ ์–ธ์–ด๋กœ ๋™์ž‘ ํ‘œํ˜„ โ†’ ์ž๋ฐ”์—์„œ ์ตœ์ ์˜ ์ €์ˆ˜์ค€ ์‹คํ–‰ ๋ฐฉ๋ฒ• ์„ ํƒ ํ›„ ๋™์ž‘
    • synchronized ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
      • High Cost : ๋ฉ€ํ‹ฐ ์ฝ”์–ด CPU์—์„œ ๊ฐ ์ฝ”์–ด๋Š” ๋ณ„๋„ ์บ์‹œ๋ฅผ ๋‘๊ณ  ์žˆ๋Š” ๋ฐ, ๋ฝ์„ ์‚ฌ์šฉํ•˜๋ฉด ์บ์‹œ๊ฐ€ ๋™๊ธฐํ™”๋˜์–ด์•ผํ•จ โ‡’ ์บ์‹œ ์ผ๊ด€์„ฑ ํ”„๋กœํ† ์ฝœ ์ธํ„ฐ์ฝ”์–ด ํ†ต์‹ (cache-coherency-protocol intercore communication) ๋ฐœ์ƒ
  • โญ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(functional-style programming)




1.2 ์™œ ์•„์ง๋„ ์ž๋ฐ”๋Š” ๋ณ€ํ™”ํ•˜๋Š”๊ฐ€?

  • ์™„๋ฒฝํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด

  • ์‹œ๊ณต์„ ์ดˆ์›”ํ•˜๋Š” ์™„๋ฒฝํ•œ ์–ธ์–ด๋ฅผ ์›ํ•˜์ง€๋งŒ ํ˜„์‹ค์ ์œผ๋กœ ๊ทธ๋Ÿฐ ์–ธ์–ด๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋‹ค.
  • C, C++

    • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์•ˆ์ „์„ฑ ๋ถ€์กฑ But, ์ž‘์€ ๋Ÿฐํƒ€์ž„ โ€œFoot Printโ€
    • ๋‚ฎ์€ ์•ˆ์ •์„ฑ โ†’ ํ”„๋กœ๊ทธ๋žจ์ด ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ๋ฐ”์ด๋Ÿฌ์Šค ์นจํˆฌ ๊ฐ€๋Šฅ
  • ์ž๋ฐ”์˜ ์œ„์น˜

    • ์ž˜ ์„ค๊ณ„๋œ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋กœ ์‹œ์ž‘
    • ์ฝ”๋“œ๋ฅผ JVM ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ ํ•˜๋Š” ํŠน์ง• โ†’ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ JVM ์ง€์›
    • ์ธํ„ฐ๋„ท ์• ํ”Œ๋ฆฟ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ์š” ์–ธ์–ด
    • ๊ฐ์ฒด ์ง€ํ–ฅ
      1. ์บก์Šํ™”
        • ์—”์ง€๋‹ˆ์–ด๋ง์ ์ธ ๋ฌธ์ œ๊ฐ€ ํ›จ์”ฌ ์ ์Œ
        • โ€˜๋ชจ๋“  ๊ฒƒ์€ ๊ฐ์ฒด๋‹คโ€™๋กœ ๋Œ€์ž…
      2. ์ผ๋‹จ ๋งŒ๋“ค๋ฉด ๋ชจ๋“  ๊ณณ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅ(write-once run-anywhere)
    • ์ดˆ๊ธฐ์—๋Š” C, C++์— ๋น„ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋“œ๋Š” ๋น„์šฉ ๋•Œ๋ฌธ์— ์ž๋ฐ”์— ๋Œ€ํ•œ ๋ฐ˜๊ฐ ์กด์žฌ But, ํ•˜๋“œ์›จ์–ด์˜ ๋ฐœ์ „์œผ๋กœ ์‹คํ–‰์‹œ๊ฐ„ ํฌ๊ฒŒ ์ง€์žฅ โŒ
  • ์ž๋ฐ” 8์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ๋ชจํƒœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…๋“ค
    1. ๋” ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋„๊ตฌ
    2. ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ๋ฅผ ๋” ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๋ฉฐ ์‰ฝ๊ฒŒ ์œ ์ง€๋ณด์ˆ˜์˜ ์žฅ์  ์ œ๊ณต


1.2.2 ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ

  • ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ(stream processing)

    • ์ŠคํŠธ๋ฆผ : ํ•œ ๋ฒˆ์— ํ•œ ๊ฐœ์”ฉ ๋งŒ๋“ค์–ด์ง€๋Š” ์—ฐ์†์ ์ธ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ๋“ค์˜ ๋ชจ์ž„
    • ์œ ๋‹‰์Šค, ๋ฆฌ๋ˆ…์Šค์˜ ๋งŽ์€ ํ”„๋กœ๊ทธ๋žจ : ํ‘œ์ค€ ์ž…๋ ฅ์—์„œ ๋ฐ์ดํ„ฐ Read โ†’ ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ๋ฐ์ดํ„ฐ Write
  • e.g. Unix Command

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

์œ ๋‹‰์Šค์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋ช…๋ น์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰

  • ์ŠคํŠธ๋ฆผ API
    • ์–ด๋–ค ํ•ญ๋ชฉ์„ ์—ฐ์†์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ
    • Before : ํ•œ ๋ฒˆ์— ํ•œ ํ•ญ๋ชฉ ์ฒ˜๋ฆฌ
    • After(์ž๋ฐ” 8) : ๊ณ ์ˆ˜์ค€ ์ถ”์ƒํ™” โ†’ ์ผ๋ จ์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌ ์ŠคํŠธ๋ฆผ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ด์šฉํ•˜์—ฌ ์ž…๋ ฅ ๋ถ€๋ถ„์„ ์—ฌ๋Ÿฌ CPU ์ฝ”์–ด์— ์‰ฝ๊ฒŒ ํ• ๋‹น


1.2.3. ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”๋กœ ๋ฉ”์„œ๋“œ์— ์ฝ”๋“œ ์ „๋‹ฌํ•˜๊ธฐ

  • ๋™์ž‘ ํŒŒ๋ผ๋ฏธํ„ฐํ™”(behavior parameterization)
    • ์ฝ”๋“œ ์ผ๋ถ€๋ฅผ API๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ (= ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์˜ ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ธฐ๋Šฅ)


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

โ€˜๋ณ‘๋ ฌ์„ฑ์„ ๊ณต์งœ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋‹คโ€™

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

  • ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ–‰?

    • ๊ณต์œ ๋œ ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ(shared mutable data)์— ์ ‘๊ทผ ํ•˜์ง€ ์•Š์•„์•ผํ•œ๋‹ค. (์ˆœ์ˆ˜ ํ•จ์ˆ˜, ๋ถ€์ž‘์šฉ ์—†๋Š” ํ•จ์ˆ˜, ์ƒํƒœ ์—†๋Š” ํ•จ์ˆ˜)
  • ๊ณต์œ ๋œ ๋ณ€์ˆ˜๋ฅผ ๋™์‹œ์— ๋ฐ”๊พธ๋ ค๊ณ  ํ•  ๋•Œ

    • synchronized : ๊ณต์œ ๋œ ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๊ทœ์น™ ์ƒ์„ฑ But, synchronized ๋Š” ์‹œ์Šคํ…œ์— ์•…์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.
  • ์ž๋ฐ” 8 ์ŠคํŠธ๋ฆผ์„ ์ด์šฉํ•ด์„œ ๋ณ‘๋ ฌ์„ฑ ํ™œ์šฉ ๊ฐ€๋Šฅ


1.2.5. ์ž๋ฐ”๊ฐ€ ์ง„ํ™”ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

  • ์ž๋ฐ” 8์˜ ํฐ ๋ณ€ํ™” : ๊ณ ์ „์ ์ธ ๊ฐ์ฒด ์ง€ํ–ฅ โ†’ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

โœจย ์–ธ์–ด๋Š” ํ•˜๋“œ์›จ์–ด๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๊ธฐ๋Œ€์˜ ๋ณ€ํ™”์— ๋ถ€์‘ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ณ€ํ™”ํ•ด์•ผ ํ•œ๋‹ค.




1.3 ์ž๋ฐ” ํ•จ์ˆ˜

  • ํ•จ์ˆ˜ = (์ •์ ) ๋ฉ”์„œ๋“œ

  • ์ž๋ฐ” 8์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ’ ์ฒ˜๋Ÿผ ์ทจ๊ธ‰
  • ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’
    • ๊ธฐ๋ณธ๊ฐ’ (e.g. int , boolean)
    • ๊ฐ์ฒด(๊ฐ์ฒด์˜ ์ฐธ์กฐ) (e.g. new )

โœจย ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ•ต์‹ฌ : ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ

โ†’ ์ผ๊ธ‰๊ฐ’(first class : ํผ์ŠคํŠธ ํด๋ž˜์Šค)

  • ๋Ÿฐํƒ€์ž„ ์‹œ, ๋ฉ”์„œ๋“œ ์ „๋‹ฌํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉ ๊ฐ€๋Šฅ


1.3.1 ๋ฉ”์„œ๋“œ์™€ ๋žŒ๋‹ค๋ฅผ ์ผ๊ธ‰ ์‹œ๋ฏผ์œผ๋กœ

  • ๋ฉ”์„œ๋“œ ์ฐธ์กฐ(method reference)

e.g.

1
2
3
4
5
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
	public boolean accept(File file) {
			return file.isHidden();
	}
});
  • FileFilter๋กœ isHidden์„ ๊ฐ์‹ผ ํ›„ ์ธ์Šคํ„ด์Šคํ™”
1
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
  • ๋ฉ”์„œ๋“œ ์ฐธ์กฐ(์ด ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋ผ)๋ฅผ ์ด์šฉํ•ด, listFiles์— ์ง์ ‘ ์ „๋‹ฌ
  • ๊ธฐ์กด์— ๋น„ํ•ด ๋ฌธ์ œ ์ž์ฒด๋ฅผ ๋” ์ง์ ‘์ ์œผ๋กœ ์„ค๋ช…

  • ๋žŒ๋‹ค : ์ต๋ช… ํ•จ์ˆ˜
    • ๋žŒ๋‹ค๋ฅผ ํฌํ•จํ•˜์—ฌ ํ•จ์ˆ˜๋„ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ ๊ฐ€๋Šฅ

Image

  • ์ˆจ๊ฒจ์ง„ ํŒŒ์ผ ํ•„ํ„ฐ๋ง ๋ฐฉ์‹


1.3.2 ์ฝ”๋“œ ๋„˜๊ฒจ์ฃผ๊ธฐ

  • e.g. Apple ํด๋ž˜์Šค์™€ getColor ๋ฉ”์„œ๋“œ ์กด์žฌ <์‚ฌ๊ณผ ๋ฌด๊ฒŒ | ์ƒ‰์ƒ์œผ๋กœ ํ•„ํ„ฐ๋ง>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// ๋…น์ƒ‰ ์‚ฌ๊ณผ ํ•„ํ„ฐ๋ง ๋ฉ”์„œ๋“œ
public static List<Apple> filterGreenApples(List<Apple> inventory) {
	List<Apple> result = new ArrayList<>();

	for (Apple apple: inventory) {
		if (GREEN.equals(apple.getColor())) {
			result.add(apple);
		}
	} return result;
}

// 150๊ทธ๋žจ ์ด์ƒ ์‚ฌ๊ณผ ํ•„ํ„ฐ๋ง ๋ฉ”์„œ๋“œ
public static List<Apple> filterHeavyApples(List<Apple> inventory) {
	List<Apple> result = new ArrayList<>();

	for (Apple apple: inventory) {
		if (apple.getWeight() > 150) {
			result.add(apple);
		}
	} return result;
}
  • ์ค‘๋ณต ์ฝ”๋“œ (copy & paste) ๊ฐœ์„ 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static boolean isGreenApple(Apple apple) {
	return GREEN.equals(apple.getColor());
}

public static boolean isHeavyApple(Apple apple) {
	return apple.getWeight() > 150;
}

public interface Predicate<T>{
	boolean test(T t);
}

static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p){
	List<Apple> result new ArrayList<>();
	for (Apple apple: inventory) {
		if (p.test(apple)) {
			result.add(apple);
		}
	}
	return result;
}
1
2
3
filterApples(inventory, Apple::isGreenApple);

filterApples(inventory, Apple::isHeavyApple);
  • ํ”„๋ ˆ๋””์ผ€์ดํŠธ(Predicate) : boolean ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜


1.3.3 ๋ฉ”์„œ๋“œ ์ „๋‹ฌ์—์„œ ๋žŒ๋‹ค๋กœ

  • ํ•œ ๋‘๋ฒˆ๋งŒ ์‚ฌ์šฉํ•  ๋ฉ”์„œ๋“œ ์ •์˜ โ†’ ๋น„ํšจ์œจ์ 
  • ๋”ฐ๋กœ ์ •์˜๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.
1
2
3
4
5
filterApples(inventory, (Apple a) -> GREEN.equals(a.getColor()));

filterApples(inventory, (Apple a) -> a.getWeight() > 150);

filterApples(inventory, (Apple a) -> a.getWeight() < 80 || RED.equals(a.getColor()));
  • But, ๋žŒ๋‹ค๊ฐ€ ๋ช‡ ์ค„ ์ด์ƒ์œผ๋กœ ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒŒ ๋ฐ”๋žŒ์งํ•˜๋‹ค. ์ฝ”๋“œ์˜ ๋ช…ํ™•์„ฑ์ด ์šฐ์„ 
This post is licensed under CC BY 4.0 by the author.