etc

[우아한테크코스] 프리코스 3주차

육빔 2024. 11. 4. 19:58
728x90
반응형

이번주차에는 새로 공부한 내용을 적용시키며 진행해 나가는 방식을 택했다.

첫번째는 일급컬랙션이다.

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/

 

반복적으로 사용되는 인스턴스 캐싱하기

캐싱(Caching)이란 캐싱을 알아보기 전에 캐시의 사전적인 정의를 알아보자. 캐시(cache…

tecoble.techcourse.co.kr

 

네번째는 상속보단 조합!

https://tecoble.techcourse.co.kr/post/2020-05-18-inheritance-vs-composition/

 

상속보다는 조합(Composition)을 사용하자.

tecoble.techcourse.co.kr

 

글을 찾아보다가 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

 

[로또] 장영재 미션 제출합니다. by urinaner · Pull Request #402 · woowacourse-precourse/java-lotto-7

 

github.com

728x90
반응형