이번주차에는 새로 공부한 내용을 적용시키며 진행해 나가는 방식을 택했다.
첫번째는 일급컬랙션이다.
public record LottoNumber(int lottoNumber) {
private static final int MIN_LOTTO_NUMBER = 1;
private static final int MAX_LOTTO_NUMBER = 45;
public LottoNumber {
validateLottoNumber(lottoNumber);
}
private void validateLottoNumber(int lottoNumber) {
if (lottoNumber < MIN_LOTTO_NUMBER || lottoNumber > MAX_LOTTO_NUMBER) {
throw new LottoException(OUT_OF_RANGE_LOTTONUMBER);
}
}
}
record로 한 이유는 객체를 구분하기위해 equals와 hashcode를 넣고 객체를 비교하며 넣는 식으로 진행했지만 코드의 더러움과 record 타입을 알고 record로 적용하였다. 확실히 일급컬랙션을 적용하니 책임 분리가 확실히 나누어진 것 같아서 너무 좋앗다. (돈도 똑같이 Money로 나누어 진행했다.)
또 2번째는 일급컬랙션을 공부하다가 나온 건데 unmodifiableList에 대한 내용었다.
public class Lottos {
private List<Lotto> lottos;
public Lottos(List<Lotto> lottos) {
this.lottos = lottos;
}
public List<Lotto> getLottos() {
return Collections.unmodifiableList(lottos);
}
}
예시로 아래와 같은 코드 시[LottoNumber{lottoNumber=1}, LottoNumber{lottoNumber=2}]
가 나오게 된다.
@Test
public void lotto_변화_테스트() {
List<LottoNumber> lottoNumbers = new ArrayList<>();
lottoNumbers.add(new LottoNumber(1));
Lotto lotto = new Lotto(lottoNumbers);
lotto.getLotto().add(new LottoNumber(2));
}
고로 위와 같은 상태를 방지하고자 불변으로 만들기 위해선 unmodifiableList를 적용하면 된다.
세번째는 새로 안 사실이지만 적용하지는 않은 캐시에 대한 내용이다. 아래 글에서 똑같이 LottoNumberd을 캐싱하여 위처럼 불변 객체를 하고자 HashMap으로 캐싱을 한 예시를 처음 보고 '이렇게도 가능하구나!'라는 생각과 Integer에서도 캐시를 사용하고 있던 사실을 처음 알게 되었다. 하지만 나는 로또 넘버에서 캐싱을 사용하기에는 객체의 책임과 의미를 생각할때 무리가 있는 것 같아서 record로 적용시켰다.
https://tecoble.techcourse.co.kr/post/2020-06-24-caching-instance/
네번째는 상속보단 조합!
https://tecoble.techcourse.co.kr/post/2020-05-18-inheritance-vs-composition/
글을 찾아보다가 tecoble 사이트에서 너무 많은 도움을 받았다! 좋은 내용들도 너무 많고 특히 지금 진행하고 있는 과제랑 연결해서 설명을 해주시니 이해가 너무 잘되었다.
그래서 원래는 상속을 생각하고 있다가 조합을 하게 된 클래스는
public class WinningLotto {
private final Lotto winningLotto;
private final LottoNumber bonusNumber;
}
요 녀석이다. 처음에는 상속을 받아서 진행하려고 햇으나 확장성과 확실한 is - a 관계인지 생각했을때 아니라고 생각해서 나도 똑같이 조합으로 설계하게 되었다. 이 글을 읽으면서 든 생각은 예외처리같은 부분은 확실한 is - a 라고 생각해 난 예외처리는 상속관계로 구현하기로 마음을 다짐햇다. 예외처리는 추상클래스로 만들면서 그 내부에 다양한 예외처리가 가능하게 BaseExceptionType으로 인터페이스를 설계하였고 그 아래에 로또, 돈, 형식 예외를 두어 그 내부에서 처리 가능하게 설계하엿다.
public abstract class BaseException extends IllegalArgumentException {
public BaseException(String message) {
super(message);
}
public abstract BaseExceptionType exceptionType();
}
public interface BaseExceptionType {
String errorMessage();
}
이런식으로 좋은 글들을 읽고 설계를 하니 전과 달라진 것은 단순 분리가 아닌 한 객체에 필요한 책임을 부여하여 중복되는 예외처리, 코드의 직관성, 확장성이 좀 더 늘어난 것 같다. 2주차까지는 tecoble 사이트를 몰랐어서 내가 혼자 끙끙 생각하며 진행했는데 참고하며 진행하니 내 실력도 훨씬 좋아지고 코드의 다양한 설계이유를 알게 되어 너무 좋았다. 또 git 컨벤션도 최대한 지키려고 노력했고 한 커밋에 한 기능만 넣는 식으로 하려고 노력했다. 그리고 진행하다보니 왜 우테코에서 매번 같은 문제를 프리코스에서 진행하는지도 조금은 알 것 같았다. 단순히 혼자 노력하며 짜는 것 보다 다른 사람들의 코드, 생각, 설계를 알고 생각을 확장시키며 내 것으로 만들어가는 것이 의도라고 생각했다. 똑같은 문제를 다른사람들은 어떻게 생각하는지 그리고 그걸 바탕으로 나에게 맞는 코드를 작성해나가는게 목적인 것 같다. 뭔가 이제서야 좀 알은 것 같고 덕분에 진짜 성장한 것 같아서 기분이 너무 좋은 한 주 였다.
https://github.com/woowacourse-precourse/java-lotto-7/pull/402/files
'etc' 카테고리의 다른 글
[우아한테크코스] 프리코스 2주차 (0) | 2024.11.04 |
---|---|
[우아한테크코스] 프리코스 1주차 (4) | 2024.10.22 |
[투자] 금리인하 후 주가 변동성 (0) | 2024.10.04 |
예비창업패키지 - 창업중심대학 후기 (1) | 2024.03.27 |