νμ₯ν μ μλ μ΄κ±° νμ
μ΄ νμνλ©΄ μΈν°νμ΄μ€λ₯Ό μ¬μ©νλΌ.
μ΄κ±° νμ
μ λ¨μ μ€ νλλ νμ₯μ΄ λΆκ°λ₯νλ€λ κ²μ΄λ€. μ΄κ±° νμ
μ νμ₯νλ λ°©λ²μ μμ§λ§, μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ©΄ λΉμ·ν ν¨κ³Όλ₯Ό λΌ μ μλ€.
λλΆλΆμ μν©μμλ μ΄κ±° νμ
μ νμ₯νλ κ²μ΄ μ’μ§ μμ§λ§, νμ₯ν μ μλ μ΄κ±° νμ
μ΄ νμνλ€λ©΄ μΈν°νμ΄μ€λ₯Ό μ¬μ©νμ.
λνμ μΈ μλ‘ μ°μ° μ½λλ₯Ό λνλ΄λ μ΄κ±° νμ
μ΄ μλ€.
interface Operation {
double apply(double x, double y);
}
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;
}
}
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μ νμ₯νμ¬, μ΄ μΈν°νμ΄μ€λ₯Ό μ°μ°μ νμ
μΌλ‘ μ¬μ©ν μ΄κ±° νμ
BasicOperationμ μ μνλ€.
μ΄λ κ² νλ©΄ λ€μκ³Ό κ°μ μ΄μ μ μ»μ μ μλ€.
μλ μ½λλ μΈν°νμ΄μ€λ₯Ό νμ₯ν νμ₯λ μ°μ° μ½λλ₯Ό μ μ©ν μμμ΄λ€.
import java.util.Collections;
class Main {
public static void main(String[] args) {
double x = 2.0;
double y = 4.0;
test1(BasicOperation.class, x, y);
test1(ExtendedOperation.class, x, y);
test2(Arrays.asList(ExtendedOperation.values()), x, y);
}
/**
* @param opEnumType: class 리ν°λ΄μ λ겨 νμ₯λ μ΄κ±° νμ
μ Class κ°μ²΄λ₯Ό λ겨 νμ₯λ μ°μ°λ€μ μλ €μ€
* @param x
* @param y
* @param <T>: T extends Enum<T> & Operation -> Tλ μ΄κ±° νμ
μ΄λ©΄μ Operation μΈν°νμ΄μ€λ₯Ό ꡬνν νμ
*/
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));
}
}
/**
* @param opSet: νμ μ μμΌλ μΉ΄λ νμ
μ μ¬μ©νμ¬, νμ₯λ μ΄κ±° νμ
μ μΈμ€ν΄μ€ μ§ν©μ λ°μ
* @param x
* @param y
*/
private static void test2(Collections<? 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));
}
}
}