forDevLife
[정규식] 문자열 계산기 본문
주요 부분
< 정규 표현식 >
private static final String OPERATION_REGULAR = "^[+\\-*/\\d]*$";
// private static final String OPERATION_REGULAR = "^[+\\-*/[0-9]]*$";
private static final String OPER_REGULAR = "[+\\-*/]";
private static final String NUMBER_REGULAR = "^[0-9]*$";
public static final Pattern validOperationPattern = Pattern.compile(OPERATION_REGULAR);
- Operation_regular 하나로 사칙 연산자(+, -, /, *) 및 숫자[0~9] (== \\d)를 검증할 수 있다.
- Pattern.compile을 통해 규칙을 등록해놓으면, validOperationPattern을 통해 검증할 수 있다.
< 정규 표현식 검증 메서드 >
boolean validateBlank() {
boolean b = false;
for (String s : splitedValues) {
Matcher matcher = Validator.validOperationPattern.matcher(s);
b = matcher.find();
if (!b) break;
}
return b;
}
- 앞서 정의한 메서드이름.matcher(String s)를 통해 Matcher를 반환받을 수 있다.
- Matcher.find를 통해 전달된 String이 규칙에 맞는 내용인지 검증한다. 아니라면 false를 반환한다.
- 조건을 통해 false라면 식 전체가 쓸모 없어지므로 break를 걸어 false를 반환한다.
< Enum 타입을 이용한 Operation 작성 >
public class Operation {
enum Operator {
PLUS("+", (n1, n2) -> n1 + n2),
MINUS("-", (n1, n2) -> n1 - n2),
MULT("*", (n1, n2) -> n1 * n2),
DIVIDE("/", (n1, n2) -> n1 / n2);
private String operator;
private BiFunction<Double, Double, Double> expression;
Operator(String operator, BiFunction<Double, Double, Double> expression) {
this.operator = operator;
this.expression = expression;
}
public double calculate(double num1, double num2) {
return this.expression.apply(num1, num2);
}
}
private Map<String, Operator> operators = new HashMap<>();
public Operation() {
for (Operator value : Operator.values()) {
operators.put(value.operator, value);
}
}
public double run(String operator, double num1, double num2) {
return operators.get(operator).calculate(num1, num2);
}
}
- enum 타입으로 연산자 및 그에 해당하는 BiFunction을 만들었다.
- enum의 메서드로 BiFunction을 실행하는 calculate를 정의한다.
- 위의 타입을 클래스 생성 시 Map에 저장하는 생성자를 생성한다.
- 클래스의 run 메서드를 통해 operator와 일치하는 enum을 찾아, enum의 메서드를 실행한다.
'Java' 카테고리의 다른 글
[Java] Call back(Listener) (0) | 2021.11.18 |
---|---|
[Java] Recursive Type Bound (0) | 2021.11.14 |
[java] import, static import 문 (0) | 2021.06.09 |
[java] hashCode(), toString(), equals() (0) | 2021.06.02 |
[java] 익명 클래스(anonymous class) (0) | 2021.05.28 |
Comments