정말 오랜만에 포스팅을 하는 것 같다.
요 근래 정말정말 많은 일이 있었는데, 심기일전하고 다시 열심히 해봐야겠다!
아무튼 바쁜와중에 정말 운 좋게 우아한 테크 캠프 Pro 5기에 선발돼서 열심히 공부도 병행하는 중이다.
지금 이미 1주차에 들어섰지만 프리코스 때 배운 점들을 정리해보고자 뒤늦게나마 포스팅을 작성해본다.

과제를 낼때마다 요구사항을 함께 보내주는데, 굉장히 기본적이고 간단해 보이지만 생각보다 까다로웠다.
이번 과제에서 많은 걸 배우고 느꼈던 요구사항 몇 개를 알아보자!
else 예약어를 쓰지 않는다.
개발자라면 조건문의 중요성을 너무나 잘 알거라고 생각한다! 나 또한 조건문을 이용한 코딩을 많이 하는데
else 예약어를 자주 썼던 나로써는 굉장히 당황스러웠다.
그런데 밑에 작은 글씨로 이렇게 적혀있었다.
힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.
힌트를 듣고 나는 아래와 같이 코딩을 해봤다! List를 적절한 조건에 맞춰서 생성하여 리턴하는 메소드이다.
private List<Car> resetWinCars(List<Car> winCars, Car car) {
if (compareResult == MANY) {
winCars = new ArrayList<>();
winCars.add(car);
return winCars;
}
if (compareResult == SAME) {
winCars.add(car);
return winCars;
}
return winCars;
}
- if문으로 임의의 조건을 건다.
- 조건에 해당될 때 바로 리스트를 생성해서 리턴해준다.
- 즉, else문 없이 원하는 리스트를 받을 수 있다.
일급 콜렉션을 활용해 구현한다.
일급 콜렉션이란 무엇일까?
List, Map 같은 Collection을 Class로 포장하면서, 그 외 다른 멤버 변수가 없는 상태를 뜻한다.
일급 콜렉션에 대해서 잘 정리되어있는 내가 개인적으로 존경하는 개발자분의 포스팅 링크이다.
이번 포스팅은 개념적인 정리보다는 내가 사용하면서 느꼈던 점을 작성하는 회고이기 때문에 개념은 링크로 대체한다!
https://jojoldu.tistory.com/412
public class Lottos {
private List<Lotto> lottos;
public Lottos(List<Lotto> lottos) {
this.lottos = lottos;
}
public void generate(int generatorCount) {
for (int i = 0; i < generatorCount; i++) {
Lotto lotto = new Lotto();
lotto.generateRandomNumber();
lottos.add(lotto);
}
}
public LottoResult calculatorLotto(Lotto lastWeekLotto, LottoNumber bonusNumber) {
LottoResult lottoResult = new LottoResult();
for (Lotto lotto : lottos) {
int sameCount = lotto.sameNumberCount(lastWeekLotto);
boolean containBonus = lotto.containBonusNumber(bonusNumber);
lottoResult.addResult(sameCount, containBonus);
}
return lottoResult;
}
public void addedLotto(Lotto lotto) {
this.lottos.add(lotto);
}
public void addedLottos(Lottos lottos) {
this.lottos.addAll(lottos.lottos);
}
}
- 포장된 클래스의 이름만 보더라도 해당 Collection이 어떤 의미를 가지고 있는지 알 수 있다.
- Lottos 클래스가 항상 List<Lotto>의 상태를 유지하고 있기 때문에 행위의 구현에 대한 파라미터가 필요 없다.
- List<Lotto>에 대해서 무언가의 비즈니스 로직이 이뤄져야 할 때 메서드를 호출하며 파라미터로 넘기는 방식이 아닌 Lottos 객체 자체에 메소드를 구현하면 된다.
- Lottos가 List<Lotto>를 Wrapper 하여 가지고 있기 때문에 메서드에 불필요한 파라미터가 필요하지 않게 된다.
- List가 제공하는 public 메서드들을 비즈니스 설계에 따라서 제한할 수 있다.
- List<Lotto>에 대한 비즈니스 로직이 Lottos 클래스에 메서드로 구현되어 있기 때문에
- 메서드의 접근제어자에 따라서 외부에서 호출 제한을 아주 정확하게 컨트롤할 수 있다.
- 그렇게 되면 설계상 List<Lotto>에 가해져서는 안될 행위를 미연에 방지할 수 있다.
- List<Lotto>에 관련된 로직이 Lottos 클래스에 모두 모여있기 때문에 유지보수가 간편하다.
모든 원시 값과 문자열을 포장한다.
이 말은 int, long, String 같은 원시 타입, 문자열 변수를 객체로 포장해서 사용하라는 의미이다.
이렇게 사용하면서 어떤 이점이 있었는지 확인해보자.
public class LottoNumber implements Comparable<LottoNumber> {
private int number;
public LottoNumber(int number) {
this.number = number;
}
public LottoNumber(String number) {
try {
this.number = Integer.parseInt(number);
} catch (Exception e) {
throw new IllegalArgumentException(ONLY_NUMBER_PAST_LOTTO_INPUT);
}
if (this.number < 1 || this.number > 45) {
throw new IllegalArgumentException(ONLY_NUMBER_BETWEEN_1_TO_45);
}
}
public int value() {
return number;
}
@Override
public int compareTo(LottoNumber number) {
if (this.number > number.number) {
return 1;
}
if (this.number < number.number) {
return -1;
}
return 0;
}
}
- 일급 콜렉션과 비슷한 의미로 Wrapping 된 원시 값과 문자열의 의도를 클래스 명으로 바로 확인할 수 있다.
- LottoNumber i 와 int i 를 보면 (사실 변수명을 이렇게 지으면 안 되지만) 보자마자 바로 체감할 수 있다.
- Comparable 같은 인터페이스를 Override 하여 재정의 할 수 있다.
- 클래스의 도메인 설계에 따라서 필요한 인터페이스를 Overriding 하여 재정의 하면
- 필요할 때마다 비즈니스 로직을 구현할 필요 없이 바로 사용할 수 있으며
- LottoNumber 클래스 안에 종속되어 있기 때문에 유지보수가 간편하다.
- 생성자를 적극 활용해서 원시 값과 문자열을 정의할 수 있다.
- 생성하는 방식이 다를 때 필요한 곳에서 매번 개발을 하다 보면 중복 코드가 생기기 쉽고 소스가 여기저기 퍼지기 쉽다.
- 하지만 Class의 생성자를 활용하면 중복 코드도 없앨 수 있고 Class 내에 모든 로직을 개발할 수 있다.
여기까지 내가 우테캠 Pro 프리코스를 경험하며 느꼈던 많은 내용 중에 '크게 와닿았던' 부분이다!
이런 부분들을 공부하고 배우면서 실제 강의를 수강해보고 싶다는 생각을 하게 되었는데,
운 좋게도 프리코스에서 합격해서 실제 수강생이 돼서 1주 차를 수강하고 있다.
(이 메일을 받았을 때 얼마나 기뻤던지 모른다.)
자세하게는 설명할 수 없지만 현재 여러 가지 일이 겹쳐서 굉장히 바쁘고 정신없지만
좋은 기회로 우테캠 Pro의 수강생이 되어 수강을 하고 있으니 최선을 다해서 수료해보고자 한다!
이번 포스팅처럼 강의를 수강하고 과제를 해나가면서 느끼는 부분들을 자주 포스팅해봐야겠다.
파이팅!
'Programing > Java' 카테고리의 다른 글
Java Stream 모르고(?) 쓰면 일어나는 일들 (0) | 2022.09.16 |
---|---|
Concurrency Problem 올바른 대응방법 (1) - Lock (0) | 2022.09.09 |
하나의 결제건이 다중 결제가 된다면? - Concurrency Programming (0) | 2022.08.01 |
Java ThreadLocal 파헤치기 (0) | 2022.07.16 |