item 38 junghyunlyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
μ΄κ±° νμ νμ₯μ μ§μνμ
μ΄κ±° νμ μ κ±°μ λͺ¨λ μν©μμ νμ μμ μ΄κ±° ν¨ν΄λ³΄λ€ μ°μνλ€. λ¨, μμΈκ° μλ€.
νμ μμ μ΄κ±° ν¨ν΄μ νμ₯ν μ μμ§λ§ μ΄κ±° νμ μ κ·Έλ΄ μ μλ€.
λ¬λ¦¬ λ§νλ©΄, νμ μμ μ΄κ±° ν¨ν΄μ μ΄κ±°ν κ°λ€μ κ·Έλλ‘ κ°μ Έμ¨ λ€μ
κ°μ λ μΆκ°νμ¬ λ€λ₯Έ λͺ©μ μΌλ‘ μΈ μ μμ§λ§ μ΄κ±° νμ μ κ·Έλ΄ μ μλ€.
μ€μλ‘ μ΄λ κ² λ§λ€μ΄μ§ κ²μ μλλ€!
μ¬μ€ μ¬λ§νλ©΄ μ΄κ±° νμ μ νμ₯μ μ§μν΄μΌ νλ€.
νμ₯ν νμ μ μμλ₯Ό κΈ°λ° νμ μ μμλ‘ μ·¨κΈνλ€λ©΄ κ·Έ λ°λλ μ±λ¦½ν΄μΌ νλλ°, μ΄κ±° νμ μ κ·Έλ μ§ μλ€.
λ°λΌμ κΈ°λ° νμ κ³Ό νμ₯λ νμ λ€μ μμ λͺ¨λλ₯Ό μνν λ°©λ²λ λ§λ μΉ μλ€.
νμ§λ§ νΉλ³ν μν©μμ μ΄κ±° νμ μ νμ₯νμ
κ·Έλ°λ° νμ₯ν μ μλ μ΄κ±° νμ μ΄ μ΄μΈλ¦¬λ μ°μμ΄ μ΅μν νλλ μλ€. λ°λ‘ μ°μ° μ½λλ€.
μ°μ° μ½λμ κ° μμλ νΉμ κΈ°κ³κ° μννλ μ°μ°μ λ»νλ€.(item 34)
μ΄κ±° νμ μΌλ‘ μ΄ ν¨κ³Όλ₯Ό λ΄λ λ°©λ²μ΄ μλ€.
μ΄κ±° νμ μ΄ μΈν°νμ΄μ€λ₯Ό ꡬνν μ μλ€λ μ¬μ€μ μ΄μ©νλ κ²μ΄λ€.
μ°μ° μ½λμ© μΈν°νμ΄μ€λ₯Ό μ μνκ³ μ΄κ±° νμ μ΄ μ΄ μΈν°νμ΄μ€λ₯Ό ꡬννκ² νλ©΄ λλ€.
μ΄λ μ΄κ±° νμ μ΄ κ·Έ μΈν°νμ΄μ€μ νμ€ κ΅¬ν체 μν μ νλ€!
public interface Operation {
double apply(double x, double y);
}
public enum BasicOperation implements 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;
BasicOperation(String symbol) {
this.symbol = symbol;
}
@Override public String toString() {
return symbol;
}
}
μ΄κ±° νμ μΈ BasicOperationμ νμ₯ν μ μμ§λ§ μΈν°νμ΄μ€μΈ Operationμ νμ₯ν μ μλ€.
κ·Έλ¦¬κ³ μ΄ μΈν°νμ΄μ€λ₯Ό μ°μ°μ νμ μΌλ‘ μ¬μ©νλ©΄ λλ€.
μ΄λ κ² νλ©΄ Operationμ ꡬνν λ λ€λ₯Έ μ΄κ±° νμ μ μ μν΄μ κΈ°λ³Έ νμ μΈ BasicOperationμ λ체ν μ μλ€.
μλ₯Ό λ€μ΄ μ§μ μ°μ°(EXP)κ³Ό λλ¨Έμ§ μ°μ°μ μΆκ°ν΄ 보μ.
public enum ExtendedOperation implements Operation {
EXP("^") {
public double apply(double x, double y) {
return Math.pow(x, y);
}
},
REMAINDER("%") {
public double apply(double x, double y) {
return x % y;
}
};
private final String symbol;
ExtendedOperation(String symbol) {
this.symbol = symbol;
}
@Override public String toString() {
return symbol;
}
}
μλ‘ μμ±ν μ΄ μ°μ°μ κΈ°μ‘΄ μ°μ°μ μ°λ κ³³μ΄λ©΄ μ΄λλ μΈ μ μλ€.
Operation μΈν°νμ΄μ€λ₯Ό μ¬μ©νλλ‘ μμ±λμ΄ μκΈ°λ§ νλ©΄ λλ€.
applyκ° μΈν°νμ΄μ€μ μ μΈλμ΄ μμΌλ μ΄κ±° νμ μ λ°λ‘ μΆμ λ©μλλ‘ μ μΈνμ§ μμλ λλ€.
κ°λ³ μΈμ€ν΄μ€ μμ€μμλΏ μλλΌ νμ μμ€μμλ κΈ°λ³Έ μ΄κ±° νμ λμ νμ₯λ μ΄κ±° νμ μ λ겨μ
νμ₯λ μ΄κ±° νμ μ μμ λͺ¨λλ₯Ό μ¬μ©νκ² ν μλ μλ€. μλ μ½λλ₯Ό 보μ.
public static void main(String[] args) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
test(ExtendedOperation.class, x, y);
}
private static <T extends Enum<T> & Operation> void test(Class<T> opEnumType, double x, double y) {
for (Operation op : opEnumType.getEnumConstants())
System.out.printf("%f %s %f = %f%n",
x, op, y, op.apply(x, y));
}
main λ©μλλ test λ©μλμ ExtendedOperationμ class 리ν°λ΄μ λ겨μ νμ₯λ μ°μ°λ€μ΄ 무μμΈμ§ μλ €μ€λ€.
(μ¬κΈ°μ class 리ν°λ΄μ νμ μ νμ ν ν° item 33 μν μ νλ€)
private static <T extends Enum<T> & Operation> void test(Class<T> opEnumType, double x, double y)
μ 맀κ°λ³μ νμ μ class κ°μ²΄κ° μ΄κ±° νμ μΈ λμμ Operationμ νμ νμ μ΄μ΄μΌ νλ€λ λ»μ΄λ€.
μ΄κ±° νμ μ΄μ΄μΌ μμλ₯Ό μνν μ μκ³ Operationμ΄μ΄μΌ μμκ° λ»νλ μνν μ μκΈ° λλ¬Έμ΄λ€.
λ€λ₯Έ λ°©λ²μΌλ‘λ μΈν°νμ΄μ€λ₯Ό ꡬνν enumμ μ¬μ©ν μ μλ€.
λ°λ‘ class κ°μ²΄ λμ νμ μ μμΌλ μΉ΄λ νμ (item 31)μΈ Collection<? extends Operation>μ λκΈ°λ λ°©λ²μ΄λ€.
public static void main(String[] args) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
test(Arrays.asList(ExtendedOperation.values()), x, y);
}
private static void test(Collection<? extends Operation> opSet,
double x, double y) {
for (Operation op : opSet)
System.out.printf("%f %s %f = %f%n",
x, op, y, op.apply(x, y));
}
μ΄ μ½λλ μ‘°κΈ λ 볡μ‘νλ€. κ·Έλ¦¬κ³ test λ©μλκ° μ‘°κΈ λ μ μ°ν΄μ‘λ€.
μ¦, μ¬λ¬ ꡬν νμ μ μ°μ°μ μ‘°ν©ν΄ νΈμΆν μ μκ² λμλ€.
λ°λ©΄ νΉμ μ°μ°μμλ EnumSet(item 36)κ³Ό EnumMap(item 37)μ μ¬μ©νμ§ λͺ»νλ€.
μΈν°νμ΄μ€λ₯Ό μ΄μ©ν νμ₯ enumμ λ¨μ
μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄ νμ₯ κ°λ₯ν μ΄κ±° νμ μ νλ΄ λ΄λ λ°©μμλ ν κ°μ§ μ¬μν λ¬Έμ κ° μλ€.
λ°λ‘ μ΄κ±° νμ λΌλ¦¬ ꡬνμ μμν μ μλ€λ μ μ΄λ€.
μ무 μνμλ μμ‘΄νμ§ μλ κ²½μ°μλ λν΄νΈ ꡬν(item 20)μ μ΄μ©ν΄ μΈν°νμ΄μ€μ μΆκ°νλ λ°©λ²μ΄ μλ€.
λ°λ©΄ μμ Operation μΈν°νμ΄μ€λ μ°μ° κΈ°νΈλ₯Ό μ μ₯νκ³ μ°Ύλ λ‘μ§μ΄ BasicOperationκ³Ό ExtendedOperation λͺ¨λμ λ€μ΄κ°μΌλ§ νλ€.
μ¬μ€ μ΄ κ²½μ°λ μ€λ³΅λλ μ½λκ° μ μ§λ§, λ§μ½ 곡μ νλ κΈ°λ₯μ΄ λ§λ€λ©΄
κ·Έ λΆλΆμ λ³λμ λμ°λ―Έ ν΄λμ€λ μ μ λμ°λ―Έ λ©μλλ‘ λΆλ¦¬νλ λ°©μμΌλ‘ μ½λ μ€λ³΅μ μμ μΌ νλ€.