π 1. μ΅λͺ ν΄λμ€μ λλ€μ
μλ°μμ ν¨μ νμ μ ννν λ μΆμ λ©μλλ₯Ό νλλ§ λ΄μ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ€. μ΄λ° μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό ν¨μ κ°μ²΄(function object)λΌκ³ νλ©°, νΉμ ν¨μλ λμμ λνλ΄λ λ° μ¬μ©νμλ€.
JDK 1.1μ΄ λ±μ₯νλ©΄μ ν¨μ κ°μ²΄λ₯Ό λ§λλ μ£Όμ μλ¨μ μ΅λͺ ν΄λμ€κ° λμλ€.
Collections.sort(words, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
νμ§λ§, μμ μ½λμ κ°μ΄ μ΅λͺ ν΄λμ€ λ°©μμ μ½λκ° λ무 κΈΈκΈ° λλ¬Έμ μλ°λ ν¨μν νλ‘κ·Έλλ°μ μ ν©νμ§ μμλ€.
κ·Έλμ μλ° 8μ μμ μ§κΈμ ν¨μν μΈν°νμ΄μ€λΌ λΆλ₯΄λ μ΄ μΈν°νμ΄μ€λ€μ μΈμ€ν΄μ€λ₯Ό λλ€μμ μ¬μ©ν΄ λ§λ€ μ μκ² λμλ€.
Collections.sort(words,
(s1, s2) -> Integer.compare(s1.length(), s2.length()));
λλ€μ νμ μ '(Comparator<String>), λ§€κ° λ³μμ νμ μ String, λ°νκ°μ νμ μ intλ€. νμ§λ§, μ»΄νμΌλ¬κ° λ¬Έλ§₯μ μ΄ν΄ νμ μ μΆλ‘ ν μ μκΈ° λλ¬Έμ λ°λ‘ μΈκΈμ νμ§ μμ κ²μ΄λ€. λ¬Όλ‘ μ»΄νμΌλ¬κ° νμ μ κ²°μ νμ§ λͺ»ν λλ νλ‘κ·Έλλ¨Έκ° μ§μ λͺ μν΄μΌ νλ€.
νμ μ λͺ μν΄μΌ μ½λκ° λ λͺ νν λλ§ μ μΈνκ³ λ, λλ€μ λͺ¨λ 맀κ°λ³μ νμ μ μλ΅νλλ‘ νμ.
λ¬Όλ‘ μλμ κ°μ΄ μΆκ°μ μΌλ‘ μ½λλ₯Ό λ κ°λ¨ν λ§λ€ μλ μλ€.
- λΉκ΅μ μμ± λ©μλ μ¬μ©
Collections.sort(words, Comparator.comparingInt(String::length));
- List μΈν°νμ΄μ€μ μΆκ°λ sort μ¬μ©
words.sort(Comparator.comparingInt(String::length));
π 2. λλ€μμ νμ©
λλ€λ₯Ό μΈμ΄ μ°¨μμμ μ§μνλ©΄μ κΈ°μ‘΄μλ μ ν©νμ§ μμλ κ³³μμλ ν¨μ κ°μ²΄λ₯Ό μ€μ©μ μΌλ‘ μ¬μ©ν μ μκ² λμλ€.
public enum Operation {
PLUS("+") {
public double apply(double x, double y) { return x + y; }
},
MINUS("-") {
public double apply(double x, double y) { return x - y; }
},
TIMES("*") {
public double apply(double x, double y) { return x * y; }
},
DIVIDE("/") {
public double apply(double x, double y) { return x / y; }
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
@Override
public String toString() {
return symbol;
}
public abstract double apply(double x, double y);
}
μμ μ½λμμ apply λ©μλμ λμμ΄ μμλ§λ€ λ¬λΌμΌ ν΄μ μμλ³ ν΄λμ€ λͺΈμ²΄λ₯Ό μ¬μ©ν΄ κ° μμμμ apply λ©μλλ₯Ό μ¬μ μνμλ€.(μμ΄ν 34)
μ¬κΈ°μ μλμ κ°μ΄ λλ€λ₯Ό μ΄μ©νλ©΄ μ΄κ±° νμ μ μΈμ€ν΄μ€ νλλ₯Ό μ΄μ©νλ λ°©μμΌλ‘ μμλ³λ‘ λ€λ₯΄κ² λμνλ μ½λλ₯Ό μ½κ² ꡬνν μ μλ€.
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);
};
}
λλ€ κΈ°λ° Operation μ΄κ±° νμ μ 보면 μμλ³ ν΄λμ€ λͺΈμ²΄λ λ μ΄μ μ¬μ©ν νμκ° μλ€κ³ μκ°ν μ μλ€.
νμ§λ§, κΌ κ·Έλ μ§λ μλ€. μλ 2κ°μ§ μν©μμλ μμλ³ ν΄λμ€ λͺΈμ²΄λ₯Ό μ¬μ©ν΄μΌ νλ€
π© 1. μ½λ μμ²΄λ‘ λμμ΄ λͺ νν μ€λͺ λμ§ μκ±°λ μ½λ μ€ μκ° λ§μμ§λ κ²½μ°
λλ€λ μ΄λ¦μ΄ μκ³ λ¬Έμνλ λͺ»νλ€. λ°λΌμ μ½λ μμ²΄λ‘ λμμ΄ λͺ νν μ€λͺ λμ§ μκ±°λ μ½λ μ€ μκ° λ§μμ§λ©΄ λλ€λ₯Ό μ°μ§ λ§μμΌ νλ€.
(λλ€λ ν μ€ μΌ λ κ°μ₯ μ’κ³ κΈΈμ΄μΌ μΈ μ€ μμ λλ΄μΌ νλ€.)
π© 2. μΈμ€ν΄μ€ νλλ λ©μλλ₯Ό μ¬μ©ν΄μΌλ§ νλ κ²½μ°
μ΄κ±° νμ μμ±μμ λ겨μ§λ μΈμλ€μ νμ μ μ»΄νμΌνμμ μΆλ‘ λλ€. λ°λ©΄μ, μΈμ€ν΄μ€λ λ°νμμ λ§λ€μ΄μ§λ€. κ·Έλμ μ΄κ±° νμ μμ±μ μμ λλ€λ μ΄κ±° νμ μ μΈμ€ν΄μ€ λ©€λ²μ μ κ·Όμ ν μ μλ€.
π 3. λ°λμ μ΅λͺ ν΄λμ€λ₯Ό μ¬μ©ν΄μΌ νλ κ²½μ°
λλ€λ₯Ό μ¬μ©νκΈ° μμνλ©΄μ μ΅λͺ ν΄λμ€μ μ¬μ©μ΄ μ€μ΄λ κ²μ μ¬μ€μ΄λ€. νμ§λ§, μλ 3κ°μ§ μν©κ³Ό κ°μ΄ λλ€λ‘ λ체ν μ μλ κ³³λ€μ΄ μλ€.
π© 1. ν¨μν μΈν°νμ΄μ€κ° μλ κ²½μ°
λλ€λ ν¨μν μΈν°νμ΄μ€μμλ§ μ°μ΄κΈ° λλ¬Έμ΄λ€. κ·Έλμ μΆμ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€ λ λλ€ λμ μ΅λͺ ν΄λμ€λ₯Ό μ¨μΌ νλ€.
π© 2. μΆμ λ©μλκ° μ¬λ¬ κ°μΈ μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό λ§λλ κ²½μ°
π© 3. ν¨μ κ°μ²΄κ° μμ μ μ°Έμ‘°ν΄μΌ νλ κ²½μ°
λλ€λ μμ μ μ°Έμ‘°ν μ μλ€. λλ€μμμ thisλ λ°κΉ₯ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
λ°λ©΄ μ΅λͺ ν΄λμ€μμμ thisλ μ΅λͺ ν΄λμ€μ μΈμ€ν΄μ€ μμ μ κ°λ¦¬ν¨λ€. κ·Έλμ ν¨μ κ°μ²΄κ° μμ μ μ°Έμ‘°ν΄μΌ νλ€λ©΄ λ°λμ μ΅λͺ ν΄λμ€λ₯Ό μ¨μΌ νλ€.
π 4. μ£Όμμ
λλ€λ μ΅λͺ ν΄λμ€μ²λΌ μ§λ ¬ν ννκ° κ΅¬νλ³λ‘(κ°λ Ή κ°μλ¨Έμ λ³λ‘) λ€λ₯Ό μ μμΌλ―λ‘ λλ€λ₯Ό μ§λ ¬ννλ μΌμ κ·Ήν μΌκ°μΌ νλ€.
ν΄λΉ κΈμ Joshua Bloch λμ 'Effective Java 3/E'λ₯Ό μ°Έκ³ νμμ΅λλ€.