CHAP01 - Modern-Java-in-Action/Online-Study GitHub Wiki
Java 8์ ์ญ์ฌ์ ๊ฐ์ฅ ํฐ ๋ณํ๊ฐ ์์๋ค. Java 9 (๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ธ ๋ณ๋ ฌ ์คํ๊ธฐ๋ฒ ์ง์. RxJava)๋ ํ๊ธฐ์ ์ด๊ฑฐ๋ ์์ฐ์ฑ์ด ๋ฐ๋์ ๋๋ ์๋์๊ณ ์๋ฐ 10์์๋ type inference ๊ด๋ จํด ์ฝ๊ฐ์ ๋ณํ๊ฐ ์์๋ค.
- Reactive Programing์ด๋? ์ผ๋น ์ ํฌ๋ธ
- ํด๋ผ์ด์ธํธ-์๋ฒ ๋๊ธฐ์ ๊ตฌ์กฐ๊ฐ ๋๋ถ๋ถ์ด์๋๋ฐ, ๊ท๋ชจ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ๋ณต์กํ ๋น๋๊ธฐ์ ์์ฒญ์ ์ฒ๋ฆฌํด์ผ๋๋ ์ํฉ์ด ์๋ค. ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ ์ด๊ฒ์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋์ ๋์๋ค.
- ์ ์: ๋ณํ์ ์ ํ์ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ๊ด๋ จ๋ ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์.
- ์๋ ์๋ฐ๋ imperative ํ๋ก๊ทธ๋๋ฐ ์ฌ์ฉํ์์.
- imperative (๋ช
๋ นํ)๊ณผ declarative (์ ์ธ์ ) ํ๋ก๊ทธ๋๋ฐ ์ฐจ์ด๋?
- declarative: ์ถ์ํ ํ๋๊ฒ (e.g., ์คํธ๋ฆผ) (blog)
8๋ฒ์ ์ด์ ์ ์ฝ๋์ ๋น๊ต
//์๋ฐ 8 ์ด์
Collections.sort(inventory, new Comparator<Apple>() {
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
});
//์๋ฐ 8
// ๋ค๋ฅธ ๋ฉ์๋์ ๋ฉ์๋๋ฅผ ๋๊ธฐ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง.
inventory.sort(comparing(Apple::getWeight));
-
-
JDK, J2EE, J2SE ์ฐจ์ด๊ฐ ๋ญ์ฃ ?
- JDK - ๊ธฐ๋ณธ ์๋ฐ kit, ํด๋ผ์ด์ธํธ ์ฌ์ด๋
- J2EE - ์๋ฒ ์ฌ์ด๋
- J2SE(=์ค๋๋ Java SE) - Swing, Applets, etc
- ์๋ฐ 8 ์ด์ - ์ฝ์ด๋ค์ ์ฌ์ฉํ๊ธฐ ์ํด ์ฐ๋ ๋๋ฅผ ์ ํ์ฉํ๋ผ๊ณ ํ๋๋ฐ, ์ค์ ์ฐ๋ ๋๋ฅผ ๋ค๋ฃจ๋ ์ผ์ error-proneํ๊ณ ์ด๋ ต๋ค.
- ์๋ฐ 5 - ์ฐ๋ ๋ํ์ด๋ ๋์์ ์ธ ์ปฌ๋ ์ ๋ค๊ณผ ๊ฐ์ ๋ธ๋ก๋ค์ ์ถ๊ฐ
- ์๋ฐ 7 - fork/join ํ๋ ์์ํฌ์ ๋ณ๋ ฌ์ฑ ๋ฑ์ฅ์ผ๋ก ์ข ๋ ์ค์ฉ์ ์ด์ง๋ง ์ฌ์ ํ ์ด๋ ต.
- ์๋ฐ 8 ๋ถํฐ - ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๋ณ๋ ฌ์ฑ ๋ฑ์ฅ
-
JDK, J2EE, J2SE ์ฐจ์ด๊ฐ ๋ญ์ฃ ?
-
๊ฐ์ฅ ํฐ ๋ณํ๋ฅผ ๊ฐ์ง ์๋ฐ 8์ ์ค์ํ ์ถ๊ฐ์ฌํญ๋ค
- Streams API
- ์คํธ๋ฆผ์ ์ฌ์ฉํจ์ผ๋ก์จ, synchronized๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
- Techniques for passing code to methods
- behavior parameterization์ ๊ตฌํํ ์ ์๊ณ , ๋ ์ค๋ฅด๋ ์๋ก์ด ์ปดํจํฐ ์ํคํ ์ฒ๋ก์ธ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ์๋ ฅ์ ๋ฐํํ๋ค.
- Default methods in interface
- ์ธํฐํ์ด์ค ๋ด๋ถ์์๋ ๋ก์ง์ด ํฌํจ๋ ๋ฉ์๋๋ฅผ ์ ์ธ ๊ฐ๋ฅ
- ๋์ ์ด์ : ํ์ ํธํ์ฑ
- Streams API
์๋ฐฑ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์๊ณ ์ด์๋จ๊ธฐ ์ํด์๋ ์งํ๊ฐ ํ์ํ๋ค. **C๋ C++**์ ๊ฒฝ์ฐ๋ ์ค๋๋๊ณ ํ๋ก๊ทธ๋๋ฐ ์์ ์ฑ์ด ๋ถ์กฑํ์ง๋ง runtime footprint๊ฐ ์๋ค๋ ๊ฐ์ ์ด ์์ด OS๋ฅผ ๊ฐ๋ฐํ๊ฑฐ๋ ์๋ฒ ๋๋ ์์คํ ์์ ์์ง๋ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ Algol, COBOL, Pascal ๊ฐ์ ์งํ ํ์ง ๋ชปํ ์ธ์ด๋ค์ ์ค๋๋ ์ด์๋จ์ง ๋ชปํ์๋ค. Java๊ฐ ์ต์ํ์ง ์์๋ ํ ๋ผ๋ฐ์ดํธ ๋จ์์ ๋น ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ก์ด ๊ฐ๋ ๋์ ๋ ํ์ํ๊ฒ ๋์๋ค (์, ๋ณ๋ ฌํ๋ก์ธ์ฑ) . ์ฆ, ์ด์๋จ๊ธฐ ์ํด์๋ ์งํ๊ฐ ํ์ํ๋ค.
์๋ฐ๋ ์บก์ํ์ ๊ฐ์ ๊ฐ์ฒด์งํฅ ๋ชจ๋ธ๊ณผ write-once and run-anywhere์ ์ปจ์ ๋๋ถ์ ์ ์ง๋ฅผ ๋ฐ์ ํด์๋ค.
์ด ๋ฐ์ผ๋ก ์๋ฐ 8์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ 3๊ฐ์ง ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ ์์ธํ ๋ฐฐ์๋ณด์.
- ์คํธ๋ฆผ = ํ ๋ฒ์ ํ๋์ฉ ์์ฑ๋๋ ์ผ๋ จ์ ๋ฐ์ดํฐ ํญ๋ชฉ
- ์์ธํ ๋ถ๋ถ์ 4~7์ฅ์์ ์ค๋ช ํ๋ค.
- ์ ๋์ค ๊ธฐ๋ฐ๋ ์คํธ๋ฆผ ํ๋ก์ธ์ฑํ๊ณ ๋น์ท
// ์ ๋์ค ๋ช
๋ น์ด ํ์ดํ(|)๋ฅผ ํตํด ์ฐ๊ฒฐ
// ํ์ผ ๋๊ฐ๋ฅผ ํฉ์ณ ๋ชจ๋ ๋ฌธ์๋ฅผ ์๋ฌธ์๋ก ๋ฐ๊พธ๊ณ ์ ๋ ฌํ ๋ค 3์ค์ ๊ฐ์ ธ์จ๋ค.
// ๋ช
๋ น์ ์์ฐจ์ ์ด ์๋ cat, tr, sort, tail ๊ฐ๊ฐ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ค.
cat file1 file2 | tr "[A-Z]" "[a-z]" | sort | tail -3
// ์ฝ๋ ์ค๋ช
: ๋ํ์ผ์ ์ฐ๊ฒฐํด์ ์คํธ๋ฆผ ์์ฑ -> ๋ฌธ์๋ฅผ ๋ฒ์ญ -> ํ ์ ๋ ฌ -> ๋ง์ง๋ง 3์ค
- ๋ ๋ค๋ฅธ ๋น์ทํ ์ฌ๋ก: ์๋์ฐจ ์กฐ๋ฆฝ ๋ผ์ธ
- ์๋ฐ ์คํธ๋ฆผ ํน์ง: ์ค๋ ๋ ์ด์ฉํ ๋ณต์กํ ์์ ์ ์ถ๊ฐํ์ง ์๊ณ ๋ ๋ณ๋ ฌ์ฑ์ ์ป์ ์ ์๋ค.
- ์๋ฐ 8 ์ด์ ์๋ ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ๋ฉ์๋๋ก ์ ๋ฌํ ๋ฐฉ๋ฒ์ด ์์๋ค.
- 2, 3์ฅ์์ ์์ธํ ๋ค๋ฃฌ๋ค.
์ฐธ๊ณ , ์ค๋๋ ์๋ธ์์คํ ์ ๋ด๋ ํฐ์์คํ ๋์์ธ์ด ์ฃผ๋ก ์ฌ์ฉ๋๋๋ฐ, ๋ํดํธ๋ฉ์๋์ ๋ชจ๋๋ค์ ๋์ ํด์ ํด๊ฒฐํ์๋ค.
- ์์ ํ๊ฒ ๋์์ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด์๋ ์๋ก ๊ณต์ ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ง ์์์ผ ํ๋ค.
- ๊ณต์ ๋ ๋ณ์๋ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด ๋ณ๋ ฌ์ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์ ๊ทผํ ์ ์๊ฒ ๋ง๋ ํจ์๋ฅผ pure, side-effect-free, stateless ํจ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- 18, 19์ฅ์์ ์์ธํ ๋ค๋ฃฌ๋ค.
- ์๋ฐ๊ฐ ์งํํ๋ฉด์...
- ํธ๋ฆฌํจ ์ค๋ค.
- ์ ๋๋ฆญ์ด ๋์ค๋ฉด์, ๋ฆฌ์คํธ ์ ํ ํ์ ์ด ๊ฐ๋ฅํ๊ณ ์ปดํ์ผ์ ํ ๋ ๋๋ง์ ์๋ฌ๋ฅผ ๊ฒ์ถํ ์ ์๋ ํธ๋ฆฌํจ์ ์ฃผ์๋ค.
- (OOP์) ํ์ ๋ฐํ iterator ๋์ (ํจ์ํ์) for-each ๋ฃจํ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
- ๊ฐ์ฒด์งํฅ๊ณผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋๊ฐ์ง ์ฅ์ ์ ๋ชจ๋ ํ์ฉํ ์ ์๊ฒ ๋์๋ค.
- ์์ฝ, ํธ๋ฆฌํด์ง.
- ํ๋ก๊ทธ๋๋ฐ์์ ํจ์๋ ๋ฉ์๋ ํนํ static ๋ฉ์๋์ ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉ๋๋ค. (์ดํด x)
- ์ด์๋ํด, ์๋ฐ์์๋ ์ํ์ ์ธ ํจ์์ฒ๋ผ ์ฌ์ฉ๋๋ฉฐ ๋ถ์์ฉ์ ์ผ์ผํค์ง ์๋ ํจ์๋ฅผ ์๋ฏธํ๋ค.
- ํจ์์ ๋ฉ์๋ ์ฉ์ด์ ์ธ ์ฐจ์ด๊ฐ ์๋ค.
- ๊ธฐ์กด ์๋ฐ์์ ๋ฉ์๋๋ฅผ ์ ๋ฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์๋ค.
- ๋ฉ์๋๋ฅผ ๊ฐ์ผ๋ก ์ทจ๊ธํ ์ ์๋ ๊ธฐ๋ฅ์, ์คํธ๋ฆผ ๊ฐ์ ๋ค๋ฅธ ์๋ฐ 8๊ธฐ๋ฅ์ ํ ๋๋ฅผ ์ ๊ณตํ๋ค.
- 8๋ฒ์ ์์ ๋ฉ์๋๊ฐ 2๊ธ๊ฐ์ด ์๋ 1๊ธ ๊ฐ์ด ๋์๋ค.
๊ทธ ๋ฐฉ๋ฒ๋ค์ ํ์ธํด๋ณด์.
๋ฉ์๋ ์ฐธ์กฐ ์์ ์ฝ๋
// 8 ๋ฒ์ ์ด์
// FileFilter๋ฅผ ๋ฐฉ๋ฒ์ด ์์ด, ์ธ์คํด์คํํ์๋ค.
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden();
}
});
// 8 ๋ฒ์
// ::์ ๋ฉ์๋ ์ฐธ์กฐ
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
- ์ฌ๊ธฐ์ ๋๊ฒจ์ง๋ isHidden์ ๋ฉ์๋๊ฐ ์๋ ํจ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- Predicate ์ฌ์ฉ์ผ๋ก ์ค๋ณต ์ฝ๋๊ฐ ์ฌ๋ผ์ง๋ ์์ .
// ์ด๋ก์ ์ฌ๊ณผ๋ฆฌ์คํธ๋ง ๊ฐ์ ธ์ฌ๋
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;
}
// ์๊ฐ์ด ๋ณต๋ถํ๋ ์ฝ๋๋ ๋ฒ๊ทธ๊ฐ ์๋ค๋ฉด ๋ชจ๋ ์ฝ๋ ์์ ์ด ํ์ํ๊ฒ ๋๋ค.
// ์๋์ ๊ฐ์ด ์งค๊ฒฝ์ฐ ์ถ๊ฐ๊ฐ ์ฉ์ดํ๋ค.
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;
}
// ์ฌ์ฉ ์ฝ๋
filterApples(inventory, Apple::isGreenApple);
filterApples(inventory, Apple::isHeavyApple);
- ํ๋๋ฒ๋ง ์ฌ์ฉํ ๋ฉ์๋๋ฅผ ๋งค๋ฒ ์ ์ํ๋ ๊ฒ์ ๊ท์ฐฎ์ ์ผ์ด๋ค.
- ๋๋ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๊ฐ๊ฒฐํด์ง๋ค.
- ๋ณต์กํ ์ํ์, ๋๋ค ์ฌ์ฉ๋ณด๋ค๋ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ๋ค.
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()) );
- ์คํธ๋ฆผ API๋ฅผ ์ฌ์ฉํ๋ฉด ์ปฌ๋ ์ API์๋ ์๋นํ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์คํธ๋ฆผ API์์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋๋ค. (internal iteration)
// ๋ฆฌ์คํธ์์ 1000 ์ด์ ๊ฑฐ๋๋ง ํํฐ๋งํ ๋ค์ ํตํ๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฃนํํ ๊ฒฝ์ฐ
// ๋ง์ boilerplate๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
Map<Currency, List<Transaction>> transactionsByCurrencies = new HashMap<>();
for (Transaction transaction : transactions) {
if(transaction.getPrice() > 1000){
Currency currency = transaction.getCurrency();
List<Transaction> transactionsForCurrency =
transactionsByCurrencies.get(currency);
if (transactionsForCurrency == null) {
transactionsForCurrency = new ArrayList<>();
transactionsByCurrencies.put(currency, transactionsForCurrency);
}
transactionsForCurrency.add(transaction);
}
}
// ํ์ง๋ง ์คํธ๋ฆผ api๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฝ๋๋์ ์ค์ผ ์ ์๋ค.
import static java.util.stream.Collectors.groupingBy;
Map<Currency, List<Transaction>> transactionsByCurrencies =
transactions.stream()
.filter((Transaction t) -> t.getPrice() > 1000)
.collect(groupingBy(Transaction::getCurrency));
- ๋ฉํฐ ์ค๋ ๋ฉ ํ๊ฒฝ์์ ๊ฐ๊ฐ์ ์ค๋ ๋๋ ๋์์ ๊ณต์ ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ ์ ์์๋ค. ์ด๋ก์จ ์ค๋ ๋๋ฅผ ์ ์ ์ดํ์ง ๋ชปํ๋ฉด ๋ฐ์ดํฐ ๊ฐ์ด ์ด์ํ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ ์ ์๋ ์ํฉ์ด ์๊ธด๋ค.
- ์คํธ๋ฆผAPI๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋ฐ๋ณต์ ์ธ ์ฝ๋๋ฌธ์ ์ ์ด๋ ค์ด ๋ฉํฐ์ฝ์ด ํ์ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๋ค.
- Forking Step - ๋ CPU๊ฐ ๊ฐ๊ฐ ์๋ค๋ฅผ ๋ถ๋ดํด ์ฒ๋ฆฌํ๋ค.
- ์ปฌ๋ ์ ์ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ๊ทผํ ์ง์ ์ค์ , ์คํธ๋ฆผ์ ๋ฐ์ดํฐ์ ์ด๋ค ๊ณ์ฐ์ ํ ๊ฒ์ธ์ง ๋ฌ์ฌํ๋๊ฒ์ ์ค์ ์ ๋๋ค.
- ์ปฌ๋ ์ ์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ - ์ปฌ๋ ์ ์์ ์คํธ๋ฆผ์ผ๋ก ๋ฐ๊พธ๊ณ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ๋ค์, ๋ฆฌ์คํธ๋ก ๋ค์ ๋ณต์ํ๋ค.
- 7์ฅ์์ ๋ณ๋ ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ฑ๋ฅ ์์ธํ ๋ค๋ฃฌ๋ค.
// ์์ฐจ์ฒ๋ฆฌ ๋ฐฉ์
import static java.util.stream.Collectors.toList;
List<Apple> heavyApples =
inventory.stream().filter((Apple a) -> a.getWeight() > 150)
.collect(toList());
// ๋ณ๋ ฌ์ฒ๋ฆฌ ๋ฐฉ์
import static java.util.stream.Collectors.toList;
List<Apple> heavyApples =
inventory.parallelStream().filter((Apple a) -> a.getWeight() > 150)
.collect(toList());
- ์ธ๋ถ์์ ๋ง๋ค์ด์ง ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง์ด ์์คํ ์ ๊ตฌ์ถํ๋ค.
- ์ธํฐํ์ด์ค ๋ณ๊ฒฝ์, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ํด๋์ค์ ๊ตฌํ์ ๋ฐ๊ฟ์ผ ํ๋ค. (๊ณ ํต์ค๋ฌ์ด ์์ )
- ์ด ๋ฌธ์ ๋ฅผ ๋ํดํธ ๋ฉ์๋๊ฐ ํด๊ฒฐํด์ค๋ค. (13์ฅ์์ ์์ธํ)
- ์๋ฐ 9์ ๋ชจ๋ ์์คํ
์ ๋ชจ๋์ ์ ์ํ๋ ๋ฌธ๋ฒ ์ ๊ณตํ๋ค.
- JAR ๊ฐ์ ์ปดํฌ๋ํธ์ ๊ตฌ์กฐ๋ฅผ ์ ์ฉ๊ฐ๋ฅ. (14์ฅ์์ ์์ธํ)
- ๋ฏธ๋์ ํ๋ก๊ทธ๋จ์ด ์ฝ๊ฒ ๋ณํํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค.
์ฌ๋ก๋ก, ์๋ ์ฝ๋๋ List๋ ์๋ฐ 8 ์ด์ ์ stream์ด๋ parallelStream ๋ฉ์๋๋ฅผ ์ง์ํ์ง ์์ ์ปดํ์ผ์ด ๋์ง ์๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, Collection์ ์ 2๊ฐ๋ฅผ default ๋ฉ์๋๋ก ์ถ๊ฐํ์๋ค.
List<Apple> heavyApples1 =
inventory.stream().filter((Apple a) -> a.getWeight() > 150)
.collect(toList());
List<Apple> heavyApples2 =
inventory.parallelStream().filter((Apple a) -> a.getWeight() > 150)
.collect(toList());
์๋ฐ 8์์ ๋ค์๊ณผ ๊ฐ์ด List ์ธํฐํ์ด์ค์ sort ๋ํดํธ ๋ฉ์๋๊ฐ ์ถ๊ฐ๋์๋ค.
// ์์ ์ฝ๋
default void sort(Comparator<? super E> c) {
Collections.sort(this, c);
}
์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์๋ ๋์ผํ ๋ค์ค ๋ํดํธ ๋ฉ์๋๊ฐ ์กด์ฌํ ์ ์๊ธฐ์, ์ด๊ฒ์ ๋ค์ค์์์ด ํ์ฉ๋๋ค๋ ์๊ธฐ์ธ๊ฐ? ์ด๋์ ๋ ๊ทธ๋ ๋ค. ์ด ์๊ธฐ๋ 9์ฅ์์ ๋ค์ด์๋ชฌ๋ ์์ ๋ฌธ์ ํผํ๋ ๋ฐฉ๋ฒ์์ ๋ค๋ฃฌ๋ค.
- ์ดํด๋ณธ ํจ์ํ ํต์ฌ์ 2๊ฐ์ง ํน์ง
- ๋ฉ์๋์ ๋๋ค๋ฅผ 1๊ธ๊ฐ์ผ๋ก ์ฌ์ฉ.
- ๊ฐ๋ณ ๊ณต์ ์ํ๊ฐ ์๋ ๋ณ๋ ฌ ์คํ์ ์ด์ฉํด ์์ ํ๊ฒ ํจ์๋ ๋ฉ์๋ ํธ์ถ ๊ฐ๋ฅ.
- ์๋ฅผ๋ค์ด, Stream API๋ ์ด 2๊ฐ์ง๋ฅผ ๋ค ํ์ฉํ๋ค.
- ํ์ค์ผ๊ณผ ๊ฐ์ ํจ์ํ ์ธ์ด๋ null์ ํํผํ๋ ๊ธฐ๋ฅ์ด ์๋ค.
- ๋์ฐธ์กฐ๋ฅผ ๋ฐ๋ช ํ๊ฒ์ ๋ผ์ํ ์ค์ (Tony Hoare)
- ์ด์ ๋์ํ๊ธฐ ์ํ, ์๋ฐ์ ์ ํ Optional (11์ฅ์์ ์์ธํ)
- null์ ๋์ํ๊ธฐ์ํ ๋ค๋ฅธ ๋ฐฉ๋ฒ ํจํด๋งค์นญ์ด ์๋๋ฐ, ์๋ฐ์์๋ ์์ง ๋ถ์์ (19์ฅ์์ ์์ธํ)
- ์๋ฐ 8์ ํต์ฌ์ ์ธ ์ถ๊ฐ๋ ํฅ๋ฏธ๋ก์ด ์๋ก์ด ์ปจ์ ๋ค๊ณผ ๊ธฐ๋ฅ์ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ์์ฑํ๊ฒ ํ๋ค.
- 8๋ฒ์ ์ด์ ์๋ ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์๋ ์ง์์ด ๋์ง ์์๋ค.
- ํจ์๋ ์ผ๊ธ ์๋ฏผ์ด๋ค; ๋ฉ์๋๊ฐ ์ด๋ป๊ฒ ํจ์ํ ๊ฐ์ผ๋ก ์ ๋ฌ์ด ๋์์๊ณ , ์ต๋ช ํจ์(๋๋ค)๊ฐ ์ด๋ป๊ฒ ์์ฑ๋์๋์ง ๊ธฐ์ตํ์.
- ์๋ฐ 8์์ ์คํธ๋ฆผ์ ์ปฌ๋ ์ ์ ๋ง์ ๋ฉด๋ชจ๋ฅผ ์ผ๋ฐํํ์๋ค. ์ผ๋ฐํํ์์ง๋ง, ์คํธ๋ฆผ์ ๋ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์ ๊ณตํ๊ณ ์คํธ๋ฆผ์ ์์๋ค์ด ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋๊ฒ ํด์ค๋ค.
- ์๋ฐ๋, ํฐ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋๋ฐ์ด๋ ๋ฐ์ ํ๋ ์์คํ ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๋ค๋ฃจ์ง ๋ชปํ์๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ์ ์๋ฐ9์์ ์์คํ ์ ๊ตฌ์กฐํํ๊ธฐ ์ํด ๋ชจ๋์ ๋ช ์ํ ์ ์๊ณ , ๋ชจ๋ ๊ตฌํ๋ถ ํด๋์ค๋ค์ ์์ ์์ด ์ธํฐํ์ด์ค๋ง ๋ํดํธ ๋ฉ์๋๋ฅผ ์ถ๊ฐํจ ์ผ๋ก์จ ์์ฝ๊ฒ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๊ฒ ๋์๋ค.
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๋ถํฐ ์จ ๊ฐ๋ ๋ค์ด ๋๊ณผ ํจํด๋งค์นญ์ ๋ค๋ฃฐ ์ ์๊ฒ ๋์์ฃผ์๋ค.