π 1. μ€νΈλ¦Όμ νΉμ§
λ€λμ λ°μ΄ν° μ²λ¦¬ μμ (μμ°¨μ μ΄λ λ³λ ¬μ μ΄λ )μ λκ³ μ μλ° 8μ μ€νΈλ¦Ό APIκ° μΆκ°λμλ€. μ€νΈλ¦Όμ νΉμ§μ μλμ κ°λ€.
- μ€νΈλ¦Ό μμ λ°μ΄ν° μμλ€μ κ°μ²΄ μ°Έμ‘°λ κΈ°λ³Έ νμ κ°(int, long, double)μ΄λ€.
- μ€νΈλ¦Ό νμ΄νλΌμΈμ μμ€ μ€νΈλ¦Όμμ μμν΄ μ’
λ¨ μ°μ°(terminal operation)μΌλ‘ λλλ©°, κ·Έ μ¬μ΄μ νλ μ΄μμ μ€κ° μ°μ°(intermediate operation)μ΄ μμ μ μλ€.
κ° μ€κ° μ°μ°μ μ€νΈλ¦Όμ μ΄λ ν λ°©μμΌλ‘ λ³νν μ μλ€. μλ₯Ό λ€μ΄, κ° μμμ ν¨μλ₯Ό μ μ©νκ±°λ νΉμ 쑰건μ λ§μ‘± λͺ»νλ μμλ₯Ό κ±Έλ¬λΌ μ μλ€. - μ€νΈλ¦Ό νμ΄νλΌμΈμ μ§μ° νκ°(lazy evaluation)λλ€.
νκ°λ μ’ λ¨ μ°μ°μ΄ νΈμΆλ λ μ΄λ€μ§λ©°, μ’ λ¨ μ°μ°μ μ°μ΄μ§ μλ λ°μ΄ν° μμλ κ³μ°μ μ°μ§μ΄ μλλ€. μ΄λ¬ν μ§μ° νκ°κ° 무ν μ€νΈλ¦Όμ λ€λ£° μ μκ² ν΄μ£Όλ μ΄μ λ€. - μ€νΈλ¦Ό APIλ λ©μλ μ°μλ₯Ό μ§μνλ ν루μΈνΈ API(fluent API)λ€.
νμ΄νλΌμΈ νλλ₯Ό ꡬμ±νλ λͺ¨λ νΈμΆμ μ°κ²°νμ¬ λ¨ νλμ ννμμΌλ‘ μμ±ν μ μλ€. - κΈ°λ³Έμ μΌλ‘ μ€νΈλ¦Ό νμ΄νλΌμΈμ μμ°¨μ μΌλ‘ μ§νλλ€.
μμμ μ΄ν΄λ³Έ κ²μ²λΌ μ€νΈλ¦Όμ λ§€μ° λ€μν κΈ°λ₯λ€μ μ 곡νλ€. μ€νΈλ¦Ό APIλ₯Ό μ¬μ©νμ¬ λͺ¨λ κ³μ°μ ν΄λΌ μ μλ€.
νμ§λ§, μ€νΈλ¦Όμ μλͺ» μ¬μ©νλ©΄ μ€νλ € μ½κΈ° μ΄λ ΅κ³ μ μ§λ³΄μλ νλ€μ΄μ§λ€. (μ΅μ§λ‘ μ€νΈλ¦Όμ μ¬μ©νλ μ½λκ° λ무 볡μ‘νμ¬ λ€μ λ°λ³΅λ¬ΈμΌλ‘ λ³κ²½νλ κΈ°μ΅μ΄ μλ€.)
μ΄λ² κΈμ ν΅ν΄ μ€νΈλ¦Όκ³Ό λ°λ³΅λ¬Έ μ€ μΈμ μ΄λ ν κ²μ μ¬μ©ν΄μΌ νλμ§ νλ² μ΄ν΄λ³΄λλ‘ νμ.
π 2. μ€νΈλ¦Όκ³Ό λ°λ³΅μ λν΄μ μ°Έκ³ ν λ§ν μ§μΉ¨
μ€νΈλ¦Ό νμ΄νλΌμΈμ λνμ΄λλ κ³μ°μ ν¨μ κ°μ²΄(μ£Όλ‘ λλ€λ λ©μλ μ°Έμ‘°)λ‘ νννλ€. λ°λ©΄ λ°λ³΅ μ½λμμλ μ½λ λΈλ‘μ μ¬μ©ν΄ νννλ€.
μ€νΈλ¦Όμμ λ°λ³΅λ¬ΈμΌλ‘, λ°λ³΅λ¬Έμμ μ€νΈλ¦ΌμΌλ‘ λ³κ²½ν μ μλ€. νμ§λ§, μλμ κ°μ΄ ν¨μ κ°μ²΄λ‘λ ν μ μμ§λ§ μ½λ λΈλ‘μΌλ‘λ ν μ μλ κ²λ€μ΄ μλ€.
- μ½λ λΈλ‘μμλ λ²μ μμ μ§μλ³μλ₯Ό μ½κ³ μμ ν μ μλ€. νμ§λ§ λλ€μμλ finalμ΄κ±°λ μ¬μ€μ finalμΈ λ³μλ§ μ½μ μ μκ³ , μ§μλ³μλ₯Ό μμ νλ 건 λΆκ°λ₯νλ€.
- μ½λ λΈλ‘μμλ return λ¬Έμ μ¬μ©ν΄ λ©μλμμ λΉ μ Έλκ°κ±°λ, breakλ continue λ¬ΈμΌλ‘ λΈλ‘ λ°κΉ₯μ λ°λ³΅λ¬Έμ μ’ λ£νκ±°λ λ°λ³΅μ ν λ² κ±΄λλΈ μ μλ€. γ λν, λ©μλ μ μΈμ λͺ μλ κ²μ¬ μμΈλ₯Ό λμ§ μ μλ€. νμ§λ§ λλ€λ‘λ μ΄ μ€ μ΄λ€ κ²λ ν μ μλ€.
λ°λ³΅λ¬Έλ³΄λ€ μ€νΈλ¦Όμ λμ± μλ§μ μν©μ λ€μκ³Ό κ°λ€.
- μμλ€μ μνμ€λ₯Ό μΌκ΄λκ² λ³ννλ€.
- μμλ€μ μνμ€λ₯Ό νν°λ§νλ€.
- μμλ€μ μνμ€λ₯Ό νλμ μ°μ°μ μ¬μ©ν΄ κ²°ν©νλ€. (λνκΈ°, μ°κ²°νκΈ°, μ΅μκ° κ΅¬νκΈ° λ±)
- μμλ€μ μνμ€λ₯Ό 컬λ ν°μ λͺ¨μλ€. (μλ§λ 곡ν΅λ μμ±μ κΈ°μ€μΌλ‘ λ¬Άμ΄κ°λ©°)
- μμλ€μ μνμ€μμ νΉμ 쑰건μ λ§μ‘±νλ μμλ₯Ό μ°Ύλλ€.
π 3. μ€νΈλ¦ΌμΌλ‘ μ²λ¦¬νκΈ° μ΄λ €μ΄ κ²½μ°
μ€νΈλ¦ΌμΌλ‘ μ²λ¦¬νκΈ° μ΄λ €μ΄ μν©κ³Ό κ·Έμ λν ν΄κ²°μ± μ λν΄μ μμ보μ.
λνμ μΈ μν©μΌλ‘λ, ν λ°μ΄ν°κ° νμ΄νλΌμΈμ μ¬λ¬ λ¨κ³(stage)λ₯Ό ν΅κ³Όν λ μ΄ λ°μ΄ν°μ κ° λ¨κ³μμμ κ°λ€μ λμμ μ κ·ΌνκΈ° μ΄λ €μ΄ κ²½μ°λ€. κ°λ¨νκ² λ§νλ©΄, μ΄λ―Έ μ§λμΉ λ¨κ³μ λν΄μ κ·Έ κ°μ μ κ·ΌνκΈ° μ΄λ ΅λ€λ κ²μ΄λ€.
ν΄κ²°μ± μΌλ‘λ μ λ¨κ³μ κ°μ΄ νμν λ 맀νμ κ±°κΎΈλ‘ μννλ λ°©λ²μ΄ μλ€. (μ€κ° κ°λ€μ μ μ₯νλ λ°©λ²μ΄ μκΈ΄ νμ§λ§ 그리 μ μ ν λ°©λ²μ μλλ€.)
λ€μκ³Ό κ°μ΄ μ²μ 5κ°μ λ©λ₯΄μΌ μμ(Mersenne prime)λ₯Ό μΆλ ₯νλ€κ³ ν΄λ³΄μ. λ©λ₯΄μΌ μλ 2^p - 1μ ννμ μλ€. λ©λ₯΄μΌ μμλ pκ° μμμ΄λ©΄ ν΄λΉ λ©λ₯΄μΌ μλ μμμΌ μ μλ€λ κ²μ΄λ€.
private static final int COUNT = 5;
public static void main(String[] args) {
primes().map(p -> TWO.pow(p.intValueExact()).subtract(ONE))
.filter(mersenne -> mersenne.isProbablePrime(50))
.limit(COUNT)
.forEach(System.out::println);
// κ²°κ³Όκ°
// 3
// 7
// 31
// 127
// 8191
}
static Stream<BigInteger> primes() {
return Stream.iterate(TWO, BigInteger::nextProbablePrime);
}
λ§μ½, λ©λ₯΄μΌ μμκ° μλλΌ μ§μ(p)λ₯Ό μΆλ ₯νλ €λ©΄ μ΄λ»κ² ν΄μΌ ν κΉ? μλμ κ°μ΄ μ€κ° μ°μ°μμ μνν 맀νμ κ±°κΎΈλ‘ μνν΄ λ©λ₯΄μΌ μμ μ§μ(p)λ₯Ό μ½κ² κ³μ°ν μ μλ€.
private static final int COUNT = 5;
public static void main(String[] args) {
primes().map(p -> TWO.pow(p.intValueExact()).subtract(ONE))
.filter(mersenne -> mersenne.isProbablePrime(50))
.limit(COUNT)
.forEach(mp -> System.out.println(mp.bitLength() + ": " + mp));
// κ²°κ³Όκ°
// 2: 3
// 3: 7
// 5: 31
// 7: 127
// 13: 8191
}
static Stream<BigInteger> primes() {
return Stream.iterate(TWO, BigInteger::nextProbablePrime);
}
('isProbablePrime(50)'μ μλ 맀μ§λλ² 50μ μμμ± κ²μ¬μ μ νλλ₯Ό λμ¬μ£Όλ κ°μ΄λ€. 맀μ§λλ² 10μ λ£μ΄λ μμμΌ νλ₯ μ΄ 99%κ° λμ§λ§, λ λμ μ νλλ₯Ό μνμ¬ 50μ λ£μ΄μ£Όμλ€.)
π 4. μ€νΈλ¦Όκ³Ό λ°λ³΅ μ€ μ νμ΄ μ΄λ €μ΄ κ²½μ°
μ§κΈκΉμ§ μ€νΈλ¦Όκ³Ό λ°λ³΅μ½λλ₯Ό μΈμ μ¬μ©νλ κ² λ λμμ§ μμ보μλ€.
νμ§λ§, μ€νΈλ¦Όκ³Ό λ°λ³΅ μ€ μ΄λ μͺ½μ μ¨μΌ ν μ§ λ°λ‘ μκΈ° μ΄λ €μ΄ μμ λ λ§λ€. λ°μΉ΄λ₯΄νΈ κ³±μ μ΄μ©νμ¬ μΉ΄λμ λͺ¨λ μ‘°ν©μ κ³μ°νλ μμ μ μκ°ν΄ 보μ. μΉ΄λλ μ«μ(rank)μ 무λ¬(suit)λ₯Ό λ¬Άμ λΆλ³ κ° ν΄λμ€μ΄κ³ , μ«μμ 무λ¬λ λͺ¨λ μ΄κ±°νμ μ΄λΌκ³ νμ.
// λ°λ³΅λ¬Έμ μ¬μ©νλ κ²½μ°
public static void main(String[] args) {
private static List<Card> newDeck() {
List<Card> result = new ArrayList<>();
for(Suit suit : Suit.values())
for(Rank rank : Rank.values())
result.add(new Card(suit, rank));
return result;
}
}
// μ€νΈλ¦Όμ μ¬μ©νλ κ²½μ°
public static void main(String[] args) {
private static List<Card> newDeck() {
return Stream.of(Suit.values())
.flatMap(suit ->
Stream.of(Rank.values())
.map(rank -> new Card(suit, rank)))
.collect(toList());
}
}
μ΄λ μͺ½μ΄ λ λμ κ²μΌκΉ? κ²°κ΅μ κ°μΈ μ·¨ν₯κ³Ό νλ‘κ·Έλλ° νκ²½μ λ¬Έμ λ€. μ²μ λ°©μμ λ λ¨μνκ³ λ μμ°μ€λ¬μ λ³΄μΌ κ²μ΄λ€. νμ§λ§, μ€νΈλ¦Ό λ°©μμ΄ μ΅μνλ€λ©΄ λ λ²μ§Έ λ°©μλ νΈνκ² μκ°νλ νλ‘κ·Έλλ¨Έκ° μμ κ²μ΄λ€.
μ΄λ μͺ½μ μ ννλ νκ³ λΆλν κ·μΉμ μμ§λ§ μ΄μ μ μ΄ν΄λ³Έ κ²μ²λΌ μ°Έκ³ ν λ§ν μ§μΉ¨ μ λλ μ‘΄μ¬νλ€. μ€νΈλ¦Όκ³Ό λ°λ³΅ μ€ μ΄λ μͺ½μ΄ λμμ§ νμ νκΈ° μ΄λ ΅λ€λ©΄ λ λ€ ν΄λ³΄κ³ λ λμ μͺ½μ μ ννλλ‘ νμ.
ν΄λΉ κΈμ Joshua Bloch λμ 'Effective Java 3/E'λ₯Ό μ°Έκ³ νμμ΅λλ€.