반응형
package rule34;
// 인터페이스
public interface Operation {
double apply(double x, double y);
}
package rule34;
// 4칙 연산에 대한 구현, Operation 인터페이스를 구현해야한다.
public enum BasicOperation implements Operation{
PLUS("+"){
@Override
public double apply(double x, double y) {
return x + y;
}
},
MINUX("-"){
@Override
public double apply(double x, double y) {
return x - y;
}
},
TIMES("*"){
@Override
public double apply(double x, double y) {
return x * y;
}
},
DIVIDE("/"){
@Override
public double apply(double x, double y) {
return x / y;
}
};
private final String symbol;
private BasicOperation(String symbol) {
this.symbol = symbol;
}
@Override
public String toString() {
return symbol;
}
}
package rule34;
// 4칙연산에 확장한 enum, 같은 Operation을 구현해야한다.
public enum ExtendedOperation implements Operation{
EXP("^"){
@Override
public double apply(double x, double y) {
return Math.pow(x, y);
}
},
REMAINDER("%"){
@Override
public double apply(double x, double y) {
return x % y;
}
};
private final String symbol;
private ExtendedOperation(String symbol) {
this.symbol = symbol;
}
@Override
public String toString() {
return symbol;
}
}
package rule34;
import java.util.Arrays;
import java.util.Collection;
public class Test {
public static void main(String[] args) {
double x = 3.15;
double y = 5.21;
test(ExtendedOperation.class,x,y);
test(BasicOperation.class,x,y);
test(Arrays.asList(ExtendedOperation.values()),x,y);
}
//Class 객체가 나타내는 자료형이 enum자료형인 동시에 Operation의 하위 자료형이 되도록 한다.
private static <T extends Enum<T> & Operation> void test(Class<T> opSet, double x, double y) {
for(Operation op : opSet.getEnumConstants()) {
System.out.println(x +" " + op + " " + y + " = " + op.apply(x,y));
}
}
// 여러 enum자료형에 정의한 연산들을 함께 전달할 수 있다.
// EnumSet, EnumMap을 사용할 수 없다.
private static void test(Collection<? extends Operation> opSet, double x, double y) {
for(Operation op : opSet) {
System.out.println(x +" " + op + " " + y + " = " + op.apply(x,y));
}
}
}
반응형
'IT > Programming' 카테고리의 다른 글
<Effective Java> RULE 32 비트필드 대신 EnumSet을 사용하라 (0) | 2023.04.27 |
---|---|
<Effective Java> RULE 33 ordinal을 배열첨자로 사용하는 대신 EnumMap을 이용하라 (0) | 2023.04.27 |
<Effective Java> RULE 35 작명 패턴 대신 어노테이션을 사용하라 (0) | 2023.04.27 |
<Effective Java> RULE 36 Override 어노테이션은 일관되게 사용하라 (0) | 2023.04.27 |
<Effective Java> RULE 37 자료형을 정의할 때 표식 인터페이스를 사용하라 (0) | 2023.04.27 |