계산기 lv3 시도, 트러블 슈팅, Java강의
lv2에서 거의 바뀐 게 없어서 바꾼 부분만 코드로 올렸음
public Number calculate(long x, char oper, long y) {
// enum 적용
OperatorType operatorType = OperatorType.fromChar(oper);
return switch (operatorType) {
case PLUS -> x + y;
case MINUS -> x - y;
case MULTIPLY-> x * y;
case DIVISION -> {
if (y == 0) {
throw new ArithmeticException("0으로 나눌 수 없습니다. 다시 입력해주세요");
}
yield x / (double) y;
}
};
}
package com.example.calculator;
public enum OperatorType { // enum 적용
PLUS('+'), MINUS('-'), MULTIPLY('*'), DIVISION('/');
private final char oper;
OperatorType(char oper) {
this.oper = oper;
}
public static OperatorType fromChar(char oper) { // 문자를 비교하여 같으면 같은 문자의 객체 반환
for (OperatorType operatorType : values()) {
if (operatorType.oper==oper) {
return operatorType;
}
}
throw new IllegalArgumentException("연산기호가 잘못됐습니다. 다시 입력해주세요");
}
}
어제는 enum이 처음이라서 어떻게 해야 하는 지 막막했는데 오늘 계산기 해설 강의를 듣고 나서 한번 더 해보니 조금 이해되는 것 같아서 적용해보았다.
enum을 적용할 때 fromChar 메서드에 static을 안 붙이고 실행시켰다가 에러가 났다. 에러 내용은 this.operatorType is null이였다.
enum 클래스인 OperatorType을 다른 클래스에서 초기화할 때 OperatorType operatorType; 이렇게 객체 생성도 안 해놓고 참조 변수로 fromChar 메서드를 호출해서 그런 것 같다. 오류 줄이라도 떴으면 고쳤을 텐데 안 떠서 그냥 한 것 같다.
에러가 난 코드 줄을 유심히 보았고 봐도 뭐가 문젠지 잘 모르겠어서 튜터님에게 찾아가 물었더니 문법적으로 fromChar 메서드는 static을 붙여야 한다고 들었다. 그래서 일단 static을 붙이고 static 메서드로 호출을 다시 했더니 해결 됐다.
해결은 됐지만 이론적으로 이해하고 싶었다. 왜 static을 붙여야만 하는 지 서핑을 시작했고 enum 클래스는 불변 객체이며, 미리 정해진 값들만 사용하도록 제한하는 것이 핵심 개념이라서 생성자가 자동으로 private이 된다. 그래서 객체 생성이 불가하여 enum 클래스의 메서드를 외부에서 쓰려면 static을 필수적으로 붙여야 한다는 것을 알게 되었다.
서로 연관된 상수들을 하나의 타입으로 정의하는 클래스
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
각 각의 값은 아래 코드와 같은 의미이다.
public final static Day MONDAY = new Day();
name() // 열거 객체의 문자열 리턴
ordinal() // 열거 객체의 순번(0부터 시작)을 리턴
compareTo() // 열거 객체를 비교해서 순번 차이를 리턴
valueOf(String name) // 문자열을 입력받아서 일치하는 열거 객체 리턴
values() // 모든 열거 객체들을 배열로 리턴
나머지 이어서 작성
오늘은 2시에 과제를 제출할 때 어떤 것들을 제출하는 지 확인하고 어제 못 썼던 트러블슈팅이 들어있는 TIL을 쓰고 이것 저것 하느라 오전 시간이 빠르게 갔다. 그리고 2시에 계산기 해설을 해주시는데 lv3에 내가 하고 싶었던 부분이 딱 나와서 이해한 다음 적용시켜 보았고 제네릭과 람다 스트림은 시간이 나면 적용해봐야 겠다.