๐ฃ 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 ์ง์
- ์ธํฐ๋ท ์ ํ๋ฆฟ ํ๋ก๊ทธ๋จ์ ์ฃผ์ ์ธ์ด
- ๊ฐ์ฒด ์งํฅ
- ์บก์ํ
- ์์ง๋์ด๋ง์ ์ธ ๋ฌธ์ ๊ฐ ํจ์ฌ ์ ์
- โ๋ชจ๋ ๊ฒ์ ๊ฐ์ฒด๋คโ๋ก ๋์
- ์ผ๋จ ๋ง๋ค๋ฉด ๋ชจ๋ ๊ณณ์์ ์คํ ๊ฐ๋ฅ(write-once run-anywhere)
- ์บก์ํ
- ์ด๊ธฐ์๋ C, C++์ ๋นํด ์ถ๊ฐ์ ์ผ๋ก ๋๋ ๋น์ฉ ๋๋ฌธ์ ์๋ฐ์ ๋ํ ๋ฐ๊ฐ ์กด์ฌ But, ํ๋์จ์ด์ ๋ฐ์ ์ผ๋ก ์คํ์๊ฐ ํฌ๊ฒ ์ง์ฅ โ
์๋ฐ 8
์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋ชจํ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ๋ค- ๋ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ๋๊ตฌ
- ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ๋ฅผ ๋ ๋น ๋ฅด๊ณ ์ ํํ๋ฉฐ ์ฝ๊ฒ ์ ์ง๋ณด์์ ์ฅ์ ์ ๊ณต
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
)
- ๊ธฐ๋ณธ๊ฐ (e.g.
โจย ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํต์ฌ : ๊ฐ์ ๋ฐ๊พธ๋ ๊ฒ
โ ์ผ๊ธ๊ฐ(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์ ์ง์ ์ ๋ฌ
๊ธฐ์กด์ ๋นํด ๋ฌธ์ ์์ฒด๋ฅผ ๋ ์ง์ ์ ์ผ๋ก ์ค๋ช
- ๋๋ค : ์ต๋ช
ํจ์
- ๋๋ค๋ฅผ ํฌํจํ์ฌ ํจ์๋ ๊ฐ์ผ๋ก ์ทจ๊ธ ๊ฐ๋ฅ
- ์จ๊ฒจ์ง ํ์ผ ํํฐ๋ง ๋ฐฉ์
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, ๋๋ค๊ฐ ๋ช ์ค ์ด์์ผ๋ก ๊ธธ์ด์ง๊ฒ ๋๋ค๋ฉด ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ํ์ฉํ๋ ๊ฒ ๋ฐ๋์งํ๋ค. ์ฝ๋์ ๋ช ํ์ฑ์ด ์ฐ์