✏️ 과제1 계산기 과제 해설 세션 후 개인 회고를 작성합니다.
분명 혼자 볼 때는 보이지 않던 부분도 다른 사람의 시각으로 보면 보이는 것처럼 해설 강의를 듣고 코드를 다시 보니 이상하게 짠 부분이 많다.
요구 사항 중 사소한 부분이라도 놓친 게 없는지 변수의 명명도 타인이 봤을 때 이해가 잘 되는지 생각해 봐야 할 부분인 것 같다.
Scanner로 입력받은 문자열은 null 이 될 수 없다.NullPointerException이 발생할 수 있으니 null 이 절대로 될 수 없는 쪽을 주체로 쓰자 (Secure Coding)"exit".equals(sc.nextLine()); // "exit"는 절대 null 이 될 수 없다.
ArrayList의 toString() 생략
ArrayList의 참조변수를 직접 System.out.println() 에 출력해도 리스트의 전체 요소를 출력한다 → toString()으로 재정의하지 않아도 참조값을 출력하지 않는다.
이는 ArrayList 가 상속받은 AbstractCollection에 오버라이딩 되어있다.

이 컬렉션의 문자열 표현을 반환합니다. 문자열 표현은 컬렉션의 요소들이 반복자에 의해 반환되는 순서대로 나열된 목록으로 구성되며, 이는 대괄호("[]")로 둘러싸여 있습니다. 인접한 요소들은 문자 ", "(콤마 및 공백)로 구분됩니다. 요소들은 String.valueOf(객체)에 의해 문자열로 변환됩니다.
Generic 타입 이레이저
컴파일 이전 코드에서는 <?> Generic이 존재하지만 컴파일 이후 런타임 소스에서는 <?> 을 없앤다. → Raw Type
: 제네릭은 자바 1.5에 도입되어 제네릭이 없는 기존 코드도 제대로 컴파일이 되어야하고 제네릭을 넣은 신규 코드도 컴파일이 되어야한다. 이를 고려하여 자바에서 런타임에 코드에서 Generic을 없애버린다.
→ 타입 이레이저를 극복하고 제네릭 클래스 사용하기
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArithmeticCalculator<BigDecimal> calculator = new ArithmeticCalculator<>(BigDecimal.class);
// ...
}
public class ArithmeticCalculator<T extends Number> {
private final List<T> resultList = new ArrayList<>();
private final Class<T> type;
public ArithmeticCalculator(Class<T> type) {
this.type = type;
}
public T calculate(T firstNumber, T secondNumber, Operator operator) {
T result = operator.apply(firstNumber, secondNumber, type);
addResult(result);
return result;
}
}
➕) Collection 인스턴스는 바로 stream을 탈 준비가 되어 있다.
collect.stream()
.filter(e -> e.doubleValue() > 0.0)
.toList(); // toList(): 결과는 list로 반환받는다.
하지만, 배열의 경우 바로 stream을 탈 수 없다.
Arrays.stream(arr)
.filter(a -> a.doubleValue() > 0.0)
.toList();
- 값도 입력 받을 수 있다. 놓친 요구사항은 Lv1, Lv2를 구현하면서 챙기지 못한 부분이라 해설 강의를 들으며 아차 싶었다. 고난이도 도전과제의 완성도를 챙기는 것도 좋지만 기본 과제에도 충실했으면 더 좋았을 것 같다.
과제 제출은 끝났지만 공부는 끝나지 않았다
코드 리뷰 후 개선점 ✨