๐จ๐ปโ๐ป ์ดํํฐ๋ธ ์๋ฐ - ๋๋ค์ ์คํธ๋ฆผ
7์ฅ - ๋๋ค์ ์คํธ๋ฆผ
๐ก ์ต๋ช
ํด๋์ค๋ณด๋ค๋ ๋๋ค๋ฅผ ์ฌ์ฉํ๋ผ
โ์ต๋ช
ํด๋์ค๋ (ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ์๋) ํ์
์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋๋ง ์ฌ์ฉํ๋ผโ
1. ์ต๋ช
ํด๋์ค
- ์๋ฐ8 ์ด์ ์๋ ํจ์ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์ฃผ์ ์๋จ์ผ๋ก ์ต๋ช
ํด๋์ค๋ฅผ ์ฌ์ฉํ์์
- ์ต๋ช
ํด๋์ค ๋ฐฉ์์ ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ๋ค..
// ์ต๋ช
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ํจ์ ๊ฐ์ฒด๋ก ์ฌ์ฉ - ๋ก์ ๊ธฐ๋ฒ์ด๋ค!
Collections.sort(words, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
System.out.println(words);
Collections.shuffle(words);
2. ๋๋ค
- ์๋ฐ8์ ์์ ํจ์ํ ์ธํฐํ์ด์ค์ ์ธ์คํด์ค๋ฅผ ๋๋ค์์ ์ด์ฉํด ์งง๊ฒ ๋ง๋ค ์ ์๊ฒ ๋จ.
- ์๋ ์ฝ๋์ ๋๋ค์์ ์ดํด๋ณด๋ฉด ๋งค๊ฐ๋ณ์, ๋ฐํ๊ฐ์ ํ์
์ด ๋ช
์๋์ด ์์ง ์์.
- ์ปดํ์ผ๋ฌ๊ฐ ํ์
์ ์์์ ์ถ๋ก ํด ์ค.
- ์ปดํ์ผ๋ฌ์ ํ์
์ถ๋ก ๊ท์น์ ๋งค์ฐ ๋ณต์กํ๋ฏ๋ก ์ ์์ง ๋ชปํด๋ ์๊ด ์์
- ํ์
์ ๋ช
์ํด์ผ ์ฝ๋๊ฐ ๋ ๋ช
ํํ ๋๋ฅผ ์ ์ธํ๊ณ ๋, ์๋ ์ฝ๋์ฒ๋ผ ๋ชจ๋ ๋งค๊ฐ๋ณ์ ํ์
์ ์๋ตํ์.
// ์ฝ๋ 42-2 ๋๋ค์์ ํจ์ ๊ฐ์ฒด๋ก ์ฌ์ฉ - ์ต๋ช
ํด๋์ค ๋์ฒด
Collections.sort(words,
(s1, s2) -> Integer.compare(s1.length(), s2.length()));
System.out.println(words);
Collections.shuffle(words);
- ๋๋ค๋ฅผ ์ฌ์ฉํด ์์๋ณ ๋์์ ๊ตฌํํ ์ด๊ฑฐ ํ์
์์
- ์ด๊ฑฐ ํ์
์์์ ๋์์ ํํํ ๋๋ค๋ฅผ
DoubleBinaryOperator
์ธํฐํ์ด์ค ๋ณ์์ ํ ๋นํจ.
DoubleBinaryOperator
์ธํฐํ์ด์ค๋ double
ํ์
์ธ์ 2๊ฐ๋ฅผ ๋ฐ์ double
ํ์
๊ฒฐ๊ณผ๋ฅผ ๋ฐํํจ.
// ํจ์ ๊ฐ์ฒด(๋๋ค)๋ฅผ ์ธ์คํด์ค ํ๋์ ์ ์ฅํด ์์๋ณ ๋์์ ๊ตฌํํ ์ด๊ฑฐ ํ์
public enum Operation {
PLUS ("+", (x, y) -> x + y),
MINUS ("-", (x, y) -> x - y),
TIMES ("*", (x, y) -> x * y),
DIVIDE("/", (x, y) -> x / y);
private final String symbol;
private final DoubleBinaryOperator op;
Operation(String symbol, DoubleBinaryOperator op) {
this.symbol = symbol;
this.op = op;
}
@Override public String toString() { return symbol; }
public double apply(double x, double y) {
return op.applyAsDouble(x, y);
}
}
- ๋๋ค๋ฅผ ์ฌ์ฉํ์ง ๋ง์์ผ ํ ๊ฒฝ์ฐ
- ์ฝ๋ ์์ฒด๋ก ๋์์ด ๋ช
ํํ ์ค๋ช
๋์ง ์๊ฑฐ๋ ์ฝ๋ ์ค ์๊ฐ ๋ง์์ง ๋.
- ๋๋ค๋ ์ด๋ฆ์ด ์๊ณ ๋ฌธ์ํ๋ ๋ชป ํ๊ธฐ ๋๋ฌธ.
- ๋๋ค๋ ํ ์ค์ผ ๋ ๊ฐ์ฅ ์ข๊ณ , ๊ธธ์ด์ผ ์ธ ์ค ์์ ๋๋ด๋ ๊ฒ ์ข์
- ์์ ์ ์ฐธ์กฐํด์ผํ ๊ฒฝ์ฐ
- ๋๋ค๋ ์์ ์ ์ฐธ์กฐํ ์ ์์.
- ๋๋ค์์
this
ํค์๋๋ ๋ฐ๊นฅ ์ธ์คํด์ค, ์ต๋ช
ํด๋์ค์์์ this
๋ ์์
๐ก ๋๋ค๋ณด๋ค๋ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ผ
โ๋ฉ์๋ ์ฐธ์กฐ ์ชฝ์ด ์งง๊ณ ๋ช
ํํ๋ค๋ฉด ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฐ๊ณ , ๊ทธ๋ ์ง ์์ ๋๋ง ๋๋ค๋ฅผ ์ฌ์ฉํ๋ผโ
1. ๋๋ค๋ฅผ ๋ฉ์๋ ์ฐธ์กฐ๋ก
- ๋ฉ์๋ ์ฐธ์กฐ(method reference) : ๋๋ค ํํ์์ด ๋จ ํ๋์ ๋ฉ์๋๋ง์ ํธ์ถํ๋ ๊ฒฝ์ฐ์ ํด๋น ๋๋ค ํํ์์์ ๋ถํ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ฑฐํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค
- ํจ์ ๊ฐ์ฒด๋ฅผ ๋๋ค๋ณด๋ค ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋๋ ์์
// map.merge๋ฅผ ์ด์ฉํด ๊ตฌํํ ๋น๋ํ - ๋๋ค ๋ฐฉ์๊ณผ ๋ฉ์๋ ์ฐธ์กฐ ๋ฐฉ์์ ๋น๊ตํด๋ณด์.
public class Freq {
public static void main(String[] args) {
Map<String, Integer> frequencyTable = new TreeMap<>();
for (String s : args)
frequencyTable.merge(s, 1, (count, incr) -> count + incr); // ๋๋ค
System.out.println(frequencyTable);
frequencyTable.clear();
for (String s : args)
frequencyTable.merge(s, 1, Integer::sum); // ๋ฉ์๋ ์ฐธ์กฐ
System.out.println(frequencyTable);
}
}
- ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ํธ์ด ๋ณดํต์ ๋ ์งง๊ณ ๊ฐ๊ฒฐํจ
- ๋๋ก๋ ๋๋ค์์ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ ์์ฒด๊ฐ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ข์ ๊ฐ์ด๋๊ฐ ๋๊ธฐ๋ ํจ.
2. 5๊ฐ์ง ๋ฉ์๋ ์ฐธ์กฐ ์ ํ
โ์ต๋ช ํด๋์ค๋ (ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ์๋) ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋๋ง ์ฌ์ฉํ๋ผโ
- ์ต๋ช ํด๋์ค ๋ฐฉ์์ ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ๋ค..
// ์ต๋ช
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ํจ์ ๊ฐ์ฒด๋ก ์ฌ์ฉ - ๋ก์ ๊ธฐ๋ฒ์ด๋ค!
Collections.sort(words, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
System.out.println(words);
Collections.shuffle(words);
- ์๋ ์ฝ๋์ ๋๋ค์์ ์ดํด๋ณด๋ฉด ๋งค๊ฐ๋ณ์, ๋ฐํ๊ฐ์ ํ์
์ด ๋ช
์๋์ด ์์ง ์์.
- ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์์์ ์ถ๋ก ํด ์ค.
- ์ปดํ์ผ๋ฌ์ ํ์ ์ถ๋ก ๊ท์น์ ๋งค์ฐ ๋ณต์กํ๋ฏ๋ก ์ ์์ง ๋ชปํด๋ ์๊ด ์์
- ํ์ ์ ๋ช ์ํด์ผ ์ฝ๋๊ฐ ๋ ๋ช ํํ ๋๋ฅผ ์ ์ธํ๊ณ ๋, ์๋ ์ฝ๋์ฒ๋ผ ๋ชจ๋ ๋งค๊ฐ๋ณ์ ํ์ ์ ์๋ตํ์.
// ์ฝ๋ 42-2 ๋๋ค์์ ํจ์ ๊ฐ์ฒด๋ก ์ฌ์ฉ - ์ต๋ช
ํด๋์ค ๋์ฒด
Collections.sort(words,
(s1, s2) -> Integer.compare(s1.length(), s2.length()));
System.out.println(words);
Collections.shuffle(words);
- ์ด๊ฑฐ ํ์
์์์ ๋์์ ํํํ ๋๋ค๋ฅผ
DoubleBinaryOperator
์ธํฐํ์ด์ค ๋ณ์์ ํ ๋นํจ. DoubleBinaryOperator
์ธํฐํ์ด์ค๋double
ํ์ ์ธ์ 2๊ฐ๋ฅผ ๋ฐ์double
ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํจ.
// ํจ์ ๊ฐ์ฒด(๋๋ค)๋ฅผ ์ธ์คํด์ค ํ๋์ ์ ์ฅํด ์์๋ณ ๋์์ ๊ตฌํํ ์ด๊ฑฐ ํ์
public enum Operation {
PLUS ("+", (x, y) -> x + y),
MINUS ("-", (x, y) -> x - y),
TIMES ("*", (x, y) -> x * y),
DIVIDE("/", (x, y) -> x / y);
private final String symbol;
private final DoubleBinaryOperator op;
Operation(String symbol, DoubleBinaryOperator op) {
this.symbol = symbol;
this.op = op;
}
@Override public String toString() { return symbol; }
public double apply(double x, double y) {
return op.applyAsDouble(x, y);
}
}
- ์ฝ๋ ์์ฒด๋ก ๋์์ด ๋ช
ํํ ์ค๋ช
๋์ง ์๊ฑฐ๋ ์ฝ๋ ์ค ์๊ฐ ๋ง์์ง ๋.
- ๋๋ค๋ ์ด๋ฆ์ด ์๊ณ ๋ฌธ์ํ๋ ๋ชป ํ๊ธฐ ๋๋ฌธ.
- ๋๋ค๋ ํ ์ค์ผ ๋ ๊ฐ์ฅ ์ข๊ณ , ๊ธธ์ด์ผ ์ธ ์ค ์์ ๋๋ด๋ ๊ฒ ์ข์
- ์์ ์ ์ฐธ์กฐํด์ผํ ๊ฒฝ์ฐ
- ๋๋ค๋ ์์ ์ ์ฐธ์กฐํ ์ ์์.
- ๋๋ค์์
this
ํค์๋๋ ๋ฐ๊นฅ ์ธ์คํด์ค, ์ต๋ช ํด๋์ค์์์this
๋ ์์
โ๋ฉ์๋ ์ฐธ์กฐ ์ชฝ์ด ์งง๊ณ ๋ช ํํ๋ค๋ฉด ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฐ๊ณ , ๊ทธ๋ ์ง ์์ ๋๋ง ๋๋ค๋ฅผ ์ฌ์ฉํ๋ผโ
// map.merge๋ฅผ ์ด์ฉํด ๊ตฌํํ ๋น๋ํ - ๋๋ค ๋ฐฉ์๊ณผ ๋ฉ์๋ ์ฐธ์กฐ ๋ฐฉ์์ ๋น๊ตํด๋ณด์.
public class Freq {
public static void main(String[] args) {
Map<String, Integer> frequencyTable = new TreeMap<>();
for (String s : args)
frequencyTable.merge(s, 1, (count, incr) -> count + incr); // ๋๋ค
System.out.println(frequencyTable);
frequencyTable.clear();
for (String s : args)
frequencyTable.merge(s, 1, Integer::sum); // ๋ฉ์๋ ์ฐธ์กฐ
System.out.println(frequencyTable);
}
}
๋ฉ์๋ ์ฐธ์กฐ ์ ํ | ์์ | ๋๋ค ํํ |
---|---|---|
์ ์ | Integer::parseInt | str โ Integer.parseInt(str) |
ํ์ ์ (์ธ์คํด์ค) | Instant.now()::isAfter | Instant then = Instant.now(); |
t โ then.isAfter(t) | ||
๋นํ์ ์ (์ธ์คํด์ค) | String::toLowerCase | str โ str.toLowerCase() |
ํด๋์ค ์์ฑ์ | TreeMap<K, V>::new | () โ new TreeMap<K, V>() |
๋ฐฐ์ด ์์ฑ์ | int[]::new | len โ new int[len] |
๐ก ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ผ
โ๋ณดํต์
java.util.function
ํจํค์ง์ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ์ ํโ
1. ํ์ค ํจ์ํ ์ธํฐํ์ด์ค
java.util.function
ํจํค์ง๋ฅผ ๋ณด๋ฉด ๋ค์ํ ์ฉ๋์ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ๋ด๊ฒจ ์์.- ํ์ํ ์ฉ๋์ ๋ง๋ ๊ฒ ์๋ค๋ฉด, ์ง์ ๊ตฌํํ์ง ๋ง๊ณ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์
- ๊ธฐ๋ณธ ์ธํฐํ์ด์ค 6๊ฐ
์ธํฐํ์ด์ค | ํจ์ ์๊ทธ๋์ฒ | ์ | ์ค๋ช |
---|---|---|---|
UnaryOperator | T apply(T t) | String::toLowerCase | ๋ฐํ๊ฐ๊ณผ ์ธ์์ ํ์ ์ด ๊ฐ์ ํจ์(์ธ์ 1๊ฐ) |
BinaryOperator | T apply(T t1, T t2) | BigInteger::add | ๋ฐํ๊ฐ๊ณผ ์ธ์์ ํ์ ์ด ๊ฐ์ ํจ์(์ธ์ 2๊ฐ) |
Predicate | boolean test(T t) | Collection::isEmpty | ์ธ์ ํ๋๋ฅผ ๋ฐ์ boolean์ ๋ฐํํ๋ ํจ์ |
Function<T, R> | R apply(T t) | Arrays::asList | ์ธ์์ ๋ฐํ ํ์ ์ด ๋ค๋ฅธ ํจ์ |
Supplier | T get() | Instance::now | ์ธ์๋ฅผ ๋ฐ์ง ์๊ณ ๊ฐ์ ๋ฐํ(ํน์ ์ ๊ณต)ํ๋ ํจ์ |
Consumer | void accept(T t) | System.out::println | ์ธ์๋ฅผ ํ๋ ๋ฐ๊ณ ๋ฐํ๊ฐ์ ์๋(ํนํ ์ธ์๋ฅผ ์๋นํ๋ ) ํจ์ |
2. ์ ์ฉ ํจ์ํ ์ธํฐํ์ด์ค
- ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์ ์ฉ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผํ๋ ๋๋ ์ธ์ ์ผ๊น?
- ์๋ ์ธ ๊ฐ์ง ์กฐ๊ฑด ์ค ํ๋์ด์์ ๋ง์กฑํ ๋.
- ์์ฃผ ์ฐ์ด๋ฉฐ, ์ด๋ฆ ์์ฒด๊ฐ ์ฉ๋๋ฅผ ๋ช ํํ ์ค๋ช ํด์ค๋ค.
- ๋ฐ๋์ ๋ฐ๋ผ์ผ ํ๋ ๊ท์ฝ์ด ์๋ค.
- ์ ์ฉํ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ๊ณตํ ์ ์๋ค.
- ์๋ ์ธ ๊ฐ์ง ์กฐ๊ฑด ์ค ํ๋์ด์์ ๋ง์กฑํ ๋.
- ex)
Compartor<T>
์ธํฐํ์ด์ค- ์ด ์ธํฐํ์ด์ค๋ ๊ตฌ์กฐ์ ์ผ๋ก
ToIntBiFunction<T, U>
์ ๋์ผํจ. - ์ด ์ธํฐํ์ด์ค๊ฐ ๋
์์ ์ผ๋ก ์ด์๋จ์ ์ด์
- ์ธ๊ฐ์ง ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํจ.
- API์์ ๊ต์ฅํ ์์ฃผ ์ฐ์ด๋ฉฐ ์ด๋ฆ์ด ์ฉ๋๋ฅผ ๋ช ํํ ์ค๋ช ํจ
- ๊ตฌํํ๋ ์ชฝ์์ ๋ฐ๋์ ์ง์ผ์ผ ํ ๊ท์ฝ์ ๋ด๊ณ ์์.
- ๋น๊ต์๋ค์ ๋ณํํ๊ณ ์กฐํฉํด์ฃผ๋ ์ ์ฉํ ๋ํดํธ ๋ฉ์๋๋ค์ ๋ด๊ณ ์์.
- ์ด ์ธํฐํ์ด์ค๋ ๊ตฌ์กฐ์ ์ผ๋ก
- ์ ์ฉ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ ๋
- ์์ ์ด ์์ฑํ๋ ๊ฒ โ์ธํฐํ์ด์คโ์์ ๋ช ์ฌํด์ผ ํจ.(์ฃผ์ํด์ ์ค๊ณํด์ผ ํจ)
- ํญ์
@FunctionalInterface
์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ผ.
@FunctionalInterface
์ด๋ ธํ ์ด์ ์ ๊ธฐ๋ฅ- ํด๋น ํด๋์ค์ ์ฝ๋๋ ์ค๋ช ๋ฌธ์๋ฅผ ์ฝ์ ์ด์๊ฒ ๊ทธ ์ธํฐํ์ด์ค๊ฐ ๋๋ค์ฉ์ผ๋ก ์ค๊ณ๋ ๊ฒ์์ ์๋ ค์ค
- ํด๋น ์ธํฐํ์ด์ค๊ฐ ์ถ์ ๋ฉ์๋๋ฅผ ์ค์ง ํ๋๋ง ๊ฐ์ง๊ณ ์์ด์ผ ์ปดํ์ผ๋๊ฒ ํด์ค
- ์ ์ง๋ณด์ ๊ณผ์ ์์ ๋๊ตฐ๊ฐ ์ค์๋ก ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ง ๋ชปํ๊ฒ ๋ง์์ค.
๐ก ์คํธ๋ฆผ์ ์ฃผ์ํด์ ์ฌ์ฉํ๋ผ
โ์คํธ๋ฆผ๊ณผ ๋ฐ๋ณต ์ค ์ด๋ ์ชฝ์ด ๋์์ง ํ์ ํ๊ธฐ ์ด๋ ต๋ค๋ฉด ๋ ๋ค ํด๋ณด๊ณ ๋ ๋์ ์ชฝ์ ํํ๋ผโ
1. ์คํธ๋ฆผ๊ณผ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ
- ์คํธ๋ฆผ(stream)์ด๋?
- ๋ฐ์ดํฐ ์์์ ์ ํ ํน์ ๋ฌดํ ์ํ์ค(sequence)
- ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ(stream pipeline)์ด๋?
- ์คํธ๋ฆผ์ ์์๋ค๋ก ์ํํ๋ ์ฐ์ฐ ๋จ๊ณ๋ฅผ ํํ
- ์์ค ์คํธ๋ฆผ์์ ์์ํด ์ข
๋จ ์ฐ์ฐ(terminal operation)์ผ๋ก ๋๋๋ฉฐ, ๊ทธ ์ฌ์ด์ ํ๋ ์ด์์ ์ค๊ฐ ์ฐ์ฐ(intermediate operation)์ด ์์ ์ ์์.
- ๊ฐ ์ค๊ฐ ์ฐ์ฐ์ ์คํธ๋ฆผ์ ์ด๋ ํ ๋ฐฉ์์ผ๋ก ๋ณํ(transform)ํจ
- ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์ง์ฐ ํ๊ฐ๋จ. ํ๊ฐ๋ ์ข
๋จ ์ฐ์ฐ์ด ํธ์ถ๋ ๋ ์ด๋ค์ง๋ฉฐ, ์ข
๋จ ์ฐ์ฐ์ ์ฐ์ด์ง ์๋ ๋ฐ์ดํฐ ์์๋ ๊ณ์ฐ์ ์ฐ์ด์ง ์์.
- 1๊ฐ ์ด์์ ์ค๊ฐ์ฐ์ฐ๋ค์ ๊ณ์ํฉ์ณ์ง ํ ์ข ๋จ์ฐ์ฐ ์ ์ํ๋๋ค๋ ๋ป.
- ๋ฌดํ ์คํธ๋ฆผ์ ๋ค๋ฃฐ ์ ์๊ฒ ํด์ฃผ๋ ์ด์
- ์ข ๋จ ์ฐ์ฐ์ด ์๋ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์๋ฌด ์ผ๋ ํ์ง ์๋ ๋ช ๋ น์ด์ธ no-op๊ณผ ๊ฐ์ผ๋, ์ข ๋จ ์ฐ์ฐ์ ๋นผ๋จน๋ ์ผ์ด ์ ๋ ์๋๋ก ํ์.
- ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์์ฐจ์ ์ผ๋ก ์ํ ๋จ.
- ์คํธ๋ฆผ API์ ํน์ง
- ์คํธ๋ฆผ API๋ ๋ฉ์๋ ์ฒด์ด๋์ ์ง์ํ๋ ํ๋ฃจ์ธํธ API(fluent API)์
- ์คํธ๋ฆผ API๋ ๋ค์ฌ๋ค๋ฅํ์ฌ ์ฌ์ค์ ์ด๋ ํ ๊ณ์ฐ์ด๋ผ๋ ํด๋ผ ์ ์์.
2. ์คํธ๋ฆผ์ ์ฌ์ฉ
- ์คํธ๋ฆผ์ ์ ์ ํ ํ์ฉํด ์๋๊ทธ๋จ ๊ทธ๋ฃน์ ์ถ๋ ฅํ๋ ์์
// ์คํธ๋ฆผ์ ์ ์ ํ ํ์ฉํ๋ฉด ๊น๋ํ๊ณ ๋ช
๋ฃํด์ง๋ค.
public class HybridAnagrams {
public static void main(String[] args) throws IOException {
Path dictionary = Paths.get(args[0]);
int minGroupSize = Integer.parseInt(args[1]);
try (Stream<String> words = Files.lines(dictionary)) {
words.collect(groupingBy(word -> alphabetize(word)))
.values().stream()
.filter(group -> group.size() >= minGroupSize)
.forEach(g -> System.out.println(g.size() + ": " + g));
}
}
private static String alphabetize(String s) {
char[] a = s.toCharArray();
Arrays.sort(a);
return new String(a);
}
}
- ์คํธ๋ฆผ์ ์ฌ์ฉํ๊ธฐ ์ ์ ํ ๊ฒฝ์ฐ
- ์์๋ค์ ์ํ์ค๋ฅผ ์ผ๊ด๋๊ฒ ๋ณํํ๋ค.
- ์์๋ค์ ์ํ์ค๋ฅผ ํํฐ๋งํ๋ค.
- ์์๋ค์ ์ํ์ค๋ฅผ ํ๋์ ์ฐ์ฐ์ ์ฌ์ฉํด ๊ฒฐํฉํ๋ค(๋ํ๊ธฐ, ์ฐ๊ฒฐํ๊ธฐ, ์ต์๊ฐ ๊ตฌํ๊ธฐ ๋ฑ)
- ์์๋ค์ ์ํ์ค๋ฅผ ์ปฌ๋ ์ ์ ๋ชจ์๋ค(์๋ง๋ ๊ณตํต๋ ์์ฑ์ ๊ธฐ์ค์ผ๋ก ๋ฌถ์ด๊ฐ๋ฉฐ)
- ์์๋ค์ ์ํ์ค์์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ฅผ ์ฐพ๋๋ค.
- ์คํธ๋ฆผ ์ฌ์ฉ ์ ์ฃผ์์
- ์คํธ๋ฆผ์ ๊ณผ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ฝ๊ฑฐ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์์ง๋ค.
- char ๊ฐ๋ค์ ์ฒ๋ฆฌํ ๋๋ ์คํธ๋ฆผ์ ์ผ๊ฐ๋ ํธ์ด ๋ซ๋ค.
- ์๋ฐ๊ฐ ๊ธฐ๋ณธ ํ์ ์ธ char์ฉ ์คํธ๋ฆผ์ ์ง์ํ์ง ์์.
CharSequence
์ธํฐํ์ด์ค์chars()
๋ฉ์๋๋ ๋ฐํ ๊ฐ์ดIntStream
์.
- ๋ฐ๋ณต๋ฌธ์ ์คํธ๋ฆผ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ ๊ฐ๋ฅํ ์ง๋ผ๋ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์ ์ธก๋ฉด์์๋ ์ํด๋ฅผ ๋ณผ ์๋ ์์
- ๊ถ์ฅ
- ์คํธ๋ฆผ๊ณผ ๋ฐ๋ณต๋ฌธ์ ์ ์ ํ ์กฐํฉํ์
- ํจ์ ๊ฐ์ฒด๋ก๋ ํ ์ ์์ง๋ง ๋ฐ๋ณต๋ฌธ(์ฝ๋ ๋ธ๋ก)์ผ๋ก๋ง ํ ์ ์๋ ์ผ๋ค๋ ์์
- ๋ฒ์ ์์ ์ง์ญ๋ณ์ ์ฝ๊ธฐ / ์์ . (๋๋ค์์๋
final
์ด๊ฑฐ๋ ์ฌ์ค์final
์ธ ๋ณ์๋ง ์ฝ์ ์ ์์) return
,break
,continue
๋ฌธ ์ฌ์ฉ. (๋๋ค์์๋ ๋ถ๊ฐ๋ฅ)- ๋ฉ์๋ ์ ์ธ์ ๋ช ์๋ ๊ฒ์ฌ ์์ธ ๋์ง๊ธฐ. (๋๋ค์์๋ ๋ถ๊ฐ๋ฅ)
- ๋ฒ์ ์์ ์ง์ญ๋ณ์ ์ฝ๊ธฐ / ์์ . (๋๋ค์์๋
- ํจ์ ๊ฐ์ฒด๋ก๋ ํ ์ ์์ง๋ง ๋ฐ๋ณต๋ฌธ(์ฝ๋ ๋ธ๋ก)์ผ๋ก๋ง ํ ์ ์๋ ์ผ๋ค๋ ์์
- ๊ธฐ์กด ์ฝ๋๋ ์คํธ๋ฆผ์ ์ฌ์ฉํ๋๋ก ๋ฆฌํฉํฐ๋งํ๋, ์ ์ฝ๋๊ฐ ๋ ๋์ ๋ณด์ผ ๋๋ง ๋ฐ์ํ์
- ์คํธ๋ฆผ์ ๋ฐํํ๋ ๋ฉ์๋ ์ด๋ฆ์ ์์์ ์ ์ฒด๋ฅผ ์๋ ค์ฃผ๋ ๋ณต์๋ช
์ฌ๋ก ์ฐ๊ธฐ๋ฅผ ๊ฐ๋ ฅํ ์ถ์ฒ
- ex)
static Stream<BigInteger> primes() { ... }
- ex)
- ์คํธ๋ฆผ๊ณผ ๋ฐ๋ณต๋ฌธ์ ์ ์ ํ ์กฐํฉํ์
๐ก ์คํธ๋ฆผ์์๋ ๋ถ์์ฉ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ผ
โ์คํธ๋ฆผ ์ฐ์ฐ์ ๊ฑด๋ค๋ ํจ์ ๊ฐ์ฒด๋ ๋ชจ๋ ๋ถ์์ฉ(side effect)์ด ์์ด์ผ ํ๋คโ
1. ์คํธ๋ฆผ ํจ๋ฌ๋ค์
- ์คํธ๋ฆผ ํจ๋ฌ๋ค์์ ํต์ฌ์ ๊ณ์ฐ์ ์ผ๋ จ์ ๋ณํ(transformation)์ผ๋ก ์ฌ๊ตฌ์ฑํ๋ ๋ถ๋ถ
- ๊ฐ ๋ณํ ๋จ๊ณ๋ ๊ฐ๋ฅํ ํ ์ด์ ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ์์ ํจ์์ฌ์ผ ํจ.
- ์์ ํจ์ : ๋ค๋ฅธ ๊ฐ๋ณ ์ํ๋ฅผ ์ฐธ์กฐํ๊ฑฐ๋ ํจ์ ์ค์ค๋ก ๋ค๋ฅธ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉฐ ์ค์ง ์ ๋ ฅ๋ง์ด ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ํจ์
- ์คํธ๋ฆผ ์ฐ์ฐ์ ๊ฑด๋ค๋ ํจ์ ๊ฐ์ฒด๋ ๋ชจ๋ ๋ถ์์ฉ(side effect)์ด ์์ด์ผ ํจ.
2. forEach ์ข ๋จ ์ฐ์ฐ
forEach
์ฐ์ฐ์ ์ข ๋จ ์ฐ์ฐ ์ค ๊ธฐ๋ฅ์ด ๊ฐ์ฅ ์ ๊ณ ๊ฐ์ฅ โ๋โ ์คํธ๋ฆผ๋ค์.- ๋๋๊ณ ๋ฐ๋ณต์ ์ด๋ผ์ ๋ณ๋ ฌํํ ์๋ ์์.
โ forEach
์ฐ์ฐ์ ์คํธ๋ฆผ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ ๋๋ง ์ฌ์ฉํ๊ณ , ๊ณ์ฐํ๋ ๋ฐ๋ ์ฐ์ง ๋ง์.
3. ์์ง๊ธฐ(collector)
- ์คํธ๋ฆผ์ ์ฌ๋ฐ๋ก ์ฌ์ฉํ๋ ค๋ฉด ์์ง๊ธฐ๋ฅผ ์ ์์๋ฌ์ผ ํจ.
- ๊ฐ๋
์ฑ์ ์ํด ์ผ๋ฐ์ ์ผ๋ก
java.util.stream.Collectors
์ ๋ฉค๋ฒ๋ฅผ ์ ์ ์ํฌํธํ์ฌ ์ฌ์ฉํจ. - ์์ง๊ธฐ๊ฐ ์์ฑํ๋ ๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ์ปฌ๋ ์ ์.
- ์ค์ํ 5๊ฐ์ง ์์ง๊ธฐ ํฉํฐ๋ฆฌ๋ฅผ ์์๋ณด์
toList()
: ๋ฆฌ์คํธ ๋ฐํ
// ๋น๋ํ์์ ๊ฐ์ฅ ํํ ๋จ์ด 10๊ฐ๋ฅผ ๋ฝ์๋ด๋ ํ์ดํ๋ผ์ธ
List<String> topTen = freq.keySet().stream()
.sorted(comparing(freq::get).reversed())
.limit(10)
.collect(toList());
toMap(keyMapper, valueMapper)
: ํค ๋งคํผ์ ๊ฐ ๋งคํผ๋ฅผ ๋ฐ์ ๋งต์ ๋ฐํ
Map<String, Operation> stringToEnum =
Stream.of(values()).collect(
toMap(Object::toString, e -> e));
toSet()
: ์งํฉ ๋ฐํ
Set<String> result = givenList.stream()
.collect(toSet());
joining()
: ์์๋ค์ ์ฐ๊ฒฐํ์ฌ ๋ฌธ์์ด ๋ฐํ
// ๋งค๊ฐ๋ณ์๊ฐ ์์ ๊ฒฝ์ฐ : "abbcccdd" ์ถ๋ ฅ
String result = givenList.stream()
.collect(joining());
// ๋งค๊ฐ๋ณ์๊ฐ ์์ ๊ฒฝ์ฐ(๊ตฌ๋ถ๋ฌธ์๋ฅผ ์ฐ๊ฒฐ๋ถ์์ ์ฝ์
ํด ์ค) : "a bb ccc dd" ์ถ๋ ฅ
String result = givenList.stream()
.collect(joining(" "));
groupingBy(classifier)
: ๋ถ๋ฅ ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์์๋ค์ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ๋ชจ์ ๋์ ๋งต์ ๋ด์ ์์ง๊ธฐ ๋ฐํ.
// ๊ฐ๋จํ ์์ : ์ํ๋ฒณํํ ๋จ์ด๋ฅผ ์ํ๋ฒณํ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ ๋จ์ด๋ค์ ๋ฆฌ์คํธ๋ก ๋งคํํ๋ ๋งต ์์ฑ.
private static String alphabetize(String s) {
char[] a = s.toCharArray();
Arrays.sort(a);
return new String(a);
}
words.collect(groupingBy(word -> alphabetize(word)));
// ๋ถ๋ฅ ํจ์์ ๋ค์ด ์คํธ๋ฆผ์ ๋ฐ๋ ์์
/** ๋ค์ด์คํธ๋ฆผ ์์ง๊ธฐ๋ก counting()์ ๊ฑด๋ค์ ๊ฐ ์นดํ
๊ณ ๋ฆฌ(ํค)๋ฅผ (์์๋ฅผ ๋ด์ ์ปฌ๋ ์
์ด ์๋)
* ํด๋น ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋ ์์์ ๊ฐ์(๊ฐ)์ ๋งคํํ ๋งต์ ์ป์
*/
// ์คํธ๋ฆผ์ ์ ๋๋ก ํ์ฉํด ๋น๋ํ๋ฅผ ์ด๊ธฐํํ๋ค.
Map<String, Long> freq;
try (Stream<String> words = new Scanner(file).tokens()) {
freq = words
.collect(groupingBy(String::toLowerCase, counting()));
}
- [์ฐธ๊ณ ]
groupingBy
๋ช ์ธ
static <T,K> Collector<T,?,Map<K,List<T>>>
groupingBy(Function<? super T,? extends K> classifier)
static <T,K,A,D> Collector<T,?,Map<K,D>>
groupingBy(Function<? super T,? extends K> classifier,
Collector<? super T,A,D> downstream)
static <T,K,D,A,M extends Map<K,D>> Collector<T,?,M>
groupingBy(Function<? super T,? extends K> classifier,
Supplier<M> mapFactory, Collector<? super T,A,D> downstream)
๐ก ๋ฐํ ํ์ ์ผ๋ก๋ ์คํธ๋ฆผ๋ณด๋ค ์ปฌ๋ ์ ์ด ๋ซ๋ค
โ์์ ์ํ์ค๋ฅผ ๋ฐํํ๋ ๊ณต๊ฐ API์ ๋ฐํ ํ์ ์๋
Collection
์ด๋ ๊ทธ ํ์ ํ์ ์ ์ฐ๋ ๊ฒ ์ผ๋ฐ์ ์ผ๋ก ์ต์ โ
1. ์คํธ๋ฆผ ๋ฐํ์ ๋ฌธ์ ์
- ์คํธ๋ฆผ์ ๋ฐ๋ณต(iteration)์ ์ง์ํ์ง ์์
- API๋ฅผ ์คํธ๋ฆผ๋ง ๋ฐํํ๋๋ก ์ง๋์ผ๋ฉด ๋ฐํ๋ ์คํธ๋ฆผ์
for-each
๋ก ๋ฐ๋ณตํ๊ธธ ์ํ๋ ์ฌ์ฉ์๋ ๋ถ๋ง์ ํ ๋กํ ๊ฒ์. Stream<E>
๋ฅผIterable<E>
๋ก ์ค๊ฐํด์ฃผ๋ ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํธ๋ฆผ์for-each
๋ฌธ์ผ๋ก ๋ฐ๋ณตํ ์ ์์- ๊ทธ๋ฌ๋ ์ด๋ํฐ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์ด์์ ํ๊ฒ ๋ง๋ค๊ณ ๋๋ฆผ.
// ์คํธ๋ฆผ <-> ๋ฐ๋ณต์ ์ด๋ํฐ
public class Adapters {
// Stream<E>๋ฅผ Iterable<E>๋ก ์ค๊ฐํด์ฃผ๋ ์ด๋ํฐ
public static <E> Iterable<E> iterableOf(Stream<E> stream) {
return stream::iterator;
}
// Iterable<E>๋ฅผ Stream<E>๋ก ์ค๊ฐํด์ฃผ๋ ์ด๋ํฐ
public static <E> Stream<E> streamOf(Iterable<E> iterable) {
return StreamSupport.stream(iterable.spliterator(), false);
}
}
2. Collection ๋ฐํ
Collection
์ธํฐํ์ด์ค๋Iterable
์ ํ์ ํ์ ์ด๊ณstream
๋ฉ์๋๋ ์ ๊ณตํ๋ ๋ฐ๋ณต๊ณผ ์คํธ๋ฆผ์ ๋์์ ์ง์ํจ.
โ ์์ ์ํ์ค๋ฅผ ๋ฐํํ๋ ๊ณต๊ฐ API์ ๋ฐํ ํ์
์๋ Collection
์ด๋ ๊ทธ ํ์ ํ์
์ ์ฐ๋ ๊ฒ ์ผ๋ฐ์ ์ผ๋ก ์ต์ ์.
- ๋ฐํํ๋ ์ํ์ค์ ํฌ๊ธฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋ ์์ ํ ๋งํผ ์์ ๊ฒฝ์ฐ
โ ArrayList
๋ HashSet
๊ฐ์ ํ์ค ์ปฌ๋ ์
๊ตฌํ์ฒด๋ฅผ ๋ฐํํ์
- ๋ฐํํ๋ ์ํ์ค์ ํฌ๊ธฐ๊ฐ ๋ฉ์น๊ฐ ํฐ ๊ฒฝ์ฐ
โ ์ ์ฉ ์ปฌ๋ ์ ์ ๊ตฌํํ๋ ๋ฐฉ์์ ๊ฒํ ํด๋ณด์.
- ์ ์ฉ ์ปฌ๋ ์ ๊ตฌํ ์์
public class PowerSet {
// ์
๋ ฅ ์งํฉ์ ๋ฉฑ์งํฉ์ ์ ์ฉ ์ปฌ๋ ์
์ ๋ด์ ๋ฐํํ๋ค.
public static final <E> Collection<Set<E>> of(Set<E> s) {
List<E> src = new ArrayList<>(s);
if (src.size() > 30)
throw new IllegalArgumentException(
"์งํฉ์ ์์๊ฐ ๋๋ฌด ๋ง์ต๋๋ค(์ต๋ 30๊ฐ).: " + s);
return new AbstractList<Set<E>>() {
@Override public int size() {
// ๋ฉฑ์งํฉ์ ํฌ๊ธฐ๋ 2๋ฅผ ์๋ ์งํฉ์ ์์ ์๋งํผ ๊ฑฐ๋ญ์ ๊ณฑ ๊ฒ๊ณผ ๊ฐ๋ค.
return 1 << src.size();
}
@Override public boolean contains(Object o) {
return o instanceof Set && src.containsAll((Set)o);
}
@Override public Set<E> get(int index) {
Set<E> result = new HashSet<>();
for (int i = 0; index != 0; i++, index >>= 1)
if ((index & 1) == 1)
result.add(src.get(i));
return result;
}
};
}
public static void main(String[] args) {
Set s = new HashSet(Arrays.asList(args));
System.out.println(PowerSet.of(s));
}
}
- (๋ฐ๋ณต์ด ์์๋๊ธฐ ์ ์๋ ์ํ์ค์ ๋ด์ฉ์ ํ์ ํ ์ ์๋ ๋ฑ์ ์ฌ์ ๋ก)
contains
์size
๋ฅผ ๊ตฌํํ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ ๋(์ฆ, ์ปฌ๋ ์ ์ ๋ฐํํ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ ๋)๋ ์ปฌ๋ ์ ๋ณด๋ค๋ ์คํธ๋ฆผ์ด๋Iterable
์ ๋ฐํํ๋ ํธ์ด ๋ซ๋ค.
๐ก ์คํธ๋ฆผ ๋ณ๋ ฌํ๋ ์ฃผ์ํด์ ์ ์ฉํ๋ผ
โ๊ณ์ฐ๋ ์ฌ๋ฐ๋ก ์ํํ๊ณ ์ฑ๋ฅ๋ ๋นจ๋ผ์ง ๊ฑฐ๋ผ๋ ํ์ ์์ด๋ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ ๋ณ๋ ฌํ๋ ์๋์กฐ์ฐจ ํ์ง ๋ง๋ผโ
1. ์คํธ๋ฆผ ๋ณ๋ ฌํ์ ๋ฌธ์ ์
// ๋ณ๋ ฌ ์คํธ๋ฆผ์ ์ฌ์ฉํด ์ฒ์ 20๊ฐ์ ๋ฉ๋ฅด์ผ ์์๋ฅผ ์์ฑํ๋ ํ๋ก๊ทธ๋จ
// ์ฃผ์: ๋ณ๋ ฌํ์ ์ํฅ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃํ์ง ์๋๋ค.
public class ParallelMersennePrimes {
public static void main(String[] args) {
primes().map(p -> TWO.pow(p.intValueExact()).subtract(ONE))
.parallel() // ์คํธ๋ฆผ ๋ณ๋ ฌํ
.filter(mersenne -> mersenne.isProbablePrime(50))
.limit(20)
.forEach(System.out::println);
}
static Stream<BigInteger> primes() {
return Stream.iterate(TWO, BigInteger::nextProbablePrime);
}
}
- ์ด ํ๋ก๊ทธ๋จ์ ์๋ฌด๊ฒ๋ ์ถ๋ ฅํ์ง ๋ชปํ๋ฉด์ CPU๋ 90%๋ ์ก์๋จน๋ ์ํ๊ฐ ์ง์๋จ(์๋ต ๋ถ๊ฐ; liveness failure)
- ๋ฌด์จ ์ผ์ด ๋ฒ์ด์ง ๊ฑธ๊น?
โ ์คํธ๋ฆผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด ํ์ดํ๋ผ์ธ์ ๋ณ๋ ฌํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ด์ง ๋ชปํ๊ธฐ ๋๋ฌธ.
- ๋ฐ์ดํฐ ์์ค๊ฐ
Stream.iterate
๊ฑฐ๋ ์ค๊ฐ ์ฐ์ฐ์ผ๋กlimit
๋ฅผ ์ฐ๋ฉด ํ์ดํ๋ผ์ธ ๋ณ๋ ฌํ๋ก๋ ์ฑ๋ฅ ๊ฐ์ ์ ๊ธฐ๋ํ ์ ์์.
โ ์ ์ฝ๋๋ ๋ ๋ฌธ์ ๋ฅผ ๋ชจ๋ ์ง๋๊ณ ์์..
- ๊ตํ : ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ๋ง๊ตฌ์ก์ด๋ก ๋ณ๋ ฌํํ๋ฉด ์ ๋จ. ์คํ๋ ค ๋์ฐํ ์ฑ๋ฅ์ ํ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์.
- ์คํธ๋ฆผ์ ์๋ชป ๋ณ๋ ฌํํ๋ฉด (์๋ต ๋ถ๊ฐ๋ฅผ ํฌํจํด) ์ฑ๋ฅ์ด ๋๋น ์ง ๋ฟ๋ง ์๋๋ผ ๊ฒฐ๊ณผ ์์ฒด๊ฐ ์๋ชป๋๊ฑฐ๋ ์์ ๋ชปํ ๋์์ด ๋ฐ์ํ ์ ์์.
โ ์คํธ๋ฆผ ๋ณ๋ ฌํ๋ ์ค์ง ์ฑ๋ฅ ์ต์ ํ ์๋จ์์ ๊ธฐ์ตํ์. ๋ฐ๋์ ๋ณ๊ฒฝ ์ ํ๋ก ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์งํํ์ฌ ๋ณ๋ ฌํ๋ฅผ ์ฌ์ฉํ ๊ฐ์น๊ฐ ์๋์ง ๋ฐ์ ธ๋ณด์.
2. ์คํธ๋ฆผ ๋ณ๋ ฌํ๊ฐ ์ ํฉํ ๊ฒฝ์ฐ
- ์คํธ๋ฆผ์ ์์ค๊ฐ
ArrayList
,HashMap
,HashSet
,ConcurrentHashMap
์ ์ธ์คํด์ค๊ฑฐ๋ ๋ฐฐ์ด, int ๋ฒ์, long ๋ฒ์์ผ ๋ ์ ํฉ. - ์ ์๋ฃ๊ตฌ์กฐ๋ค์ ํน์ง
- ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ํฌ๊ธฐ๋ก ์ ํํ๊ณ ์์ฝ๊ฒ ๋๋ ์ ์์ด์ ์ผ์ ๋ค์์ ์ค๋ ๋์ ๋ถ๋ฐฐํ๊ธฐ์ ์ข์
- ์ฐธ์กฐ ์ง์ญ์ฑ(locality of reference)์ด ๋ฐ์ด๋จ
- ์ด์ํ ์์์ ์ฐธ์กฐ๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ํด์ ์ ์ฅ๋์ด ์๋ค๋ ๋ป
- ์ฐธ์กฐ ์ง์ญ์ฑ์ ๋ค๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฒํฌ ์ฐ์ฐ์ ๋ณ๋ ฌํํ ๋ ์์ฃผ ์ค์ํ ์์
- ์ข
๋จ ์ฐ์ฐ ์ค์๋ ์ถ์(reduction)๊ฐ ๋ณ๋ ฌํ์ ๊ฐ์ฅ ์ ํฉ.
- ์ถ์ : ํ์ดํ๋ผ์ธ์์ ๋ง๋ค์ด์ง ์์๋ฅผ ํ๋๋ก ํฉ์น๋ ์์
- ex)
Stream
์reduce
๋ฉ์๋ ์ค ํ๋, ํน์min
,max
,count
,sum
๋ฑ
- ์กฐ๊ฑด์ ๋ง์ผ๋ฉด ๋ฐ๋ก ๋ฐํ๋๋ ๋ฉ์๋๋ ๋ณ๋ ฌํ์ ์ ํฉ
- ex)
anyMatch
,allMatch
,noneMatch
๋ฑ
- ex)
- ์คํธ๋ฆผ ๋ณ๋ ฌํ์ ์ ํฉํ ์์
public class ParallelPrimeCounting {
// ์์ ๊ณ์ฐ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ - ๋ณ๋ ฌํ ๋ฒ์
static long pi(long n) {
return LongStream.rangeClosed(2, n)
.parallel()
.mapToObj(BigInteger::valueOf)
.filter(i -> i.isProbablePrime(50))
.count();
}
public static void main(String[] args) {
System.out.println(pi(10_000_000));
}
}
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐จ๐ปโ๐ป ์ดํํฐ๋ธ ์๋ฐ - ๋๋ค์ ์คํธ๋ฆผ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@cekim/์ดํํฐ๋ธ-์๋ฐ-๋๋ค์-์คํธ๋ฆผ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค