1차 미션 - 자동 로또
- 로또 구입 금액을 입력하면 구입 금액에 해당하는 로또를 발급해야 한다.
- 로또 1장의 가격은 1000원이다.
- 실행 결과:
2차 미션 - 수동 로또
- 현재 로또 생성기는 자동 생성 기능만 제공한다. 사용자가 수동으로 추첨 번호를 입력할 수 있도록 해야 한다.
- 입력한 금액, 자동 생성 숫자, 수동 생성 번호를 입력하도록 해야 한다.
- 실행 결과:
로또 미션을 진행하면서 primitive type에 대한 포장을 처음 해보았다. 값을 포장하더라도 컬렉션의 연산이 올바르게 진행됨을 보장하기 위해 equals와 hashCode 역시 처음으로 override 해보았고 올바른 override를 위해 이펙티브 자바 item10, 11을 읽었다.
DTO역시 처음 사용해봤다. 리뷰어 한테 MVC에 대해 많은 피드백을 받아 이들을 수정하기 위해 많은 시간을 투자했고 결과적으로 좀 더 웹 MVC다운 구조를 갖게 되었다.
전략패턴과 정적팩토리메서드를 기존에도 알고는 있었지만 실제로 적용해 본것은 이번이 처음이다. 이번 미션에서 이들을 실제로 활용해 보면서 해당 패턴 내용에 대해 한번 더 돌아보는 계기가 되었다. 또 한, Integer 내부에서 값을 관리하는 방식을 찾아보라는 피드백을 받아 Integer내부를 봤더니 -128~127 까지는 캐싱을 해서 사용하고 있더라. Double, Float, Boolean을 제외한 나머지 primitive type의 래퍼클래스 역시 Integer 처럼 해당 범위의 값을 캐싱해 사용하고 있다. 다만, Integer는 캐싱하는 최댓값을 vm option을 통해 설정할 수 있어 다른 래퍼클래스가 수행하는 캐싱 로직에 비해 좀 더 복잡하다.
enum에 대해서도 공부를 했다. 기존에 사용하던 C++같은 언어에서도 enum이 존재하긴 했지만 단순히 상수를 정의하는 정도의 역할만 했었다. 하지만 자바의 enum은 그 자체가 객체고 java.lang.Enum<E> 클래스를 상속하기 때문에 enum 값과 관련된 여려 연산을 진행할 수 있다.
마지막으로 스트림의 forEach의 올바른 사용에 대해서도 알게 되었다. 스트림은 본질적으로 함수형 프로그래밍을 위해 도입되었기 때문에 순수 함수를 사용해야 한다. 따라서 forEach는 단순히 값을 출력하는 용도로 사용해야지 외부의 값을 변경하는 용도로 사용하면 안된다.
결과적으로 참 많은 것을 돌아보고 또 새로 배운 미션이였다. 두 번째 미션도 이리 배울게 많은데 나중에 가면 체화 시켜야 될 지식이 많아져서 체하진 않을까 걱정된다...
DTO:
https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/
equals:
https://iskull-dev.tistory.com/260
hashCode:
https://iskull-dev.tistory.com/264
forEach:
https://iskull-dev.tistory.com/263
enum:
https://iskull-dev.tistory.com/259
정적 팩토리 메서드:
https://iskull-dev.tistory.com/222?category=904213