본문 바로가기
후기

우아한테크코스 4기 프리코스 3주차 후기 (자판기)

by clean_h 2021. 12. 29.
728x90

우아한테크코스 4기 프리코스 3주차 후기 (자판기)

https://github.com/woowacourse/java-vendingmachine-precourse

 

GitHub - woowacourse/java-vendingmachine-precourse

Contribute to woowacourse/java-vendingmachine-precourse development by creating an account on GitHub.

github.com

4기 프리코스 3주차 자판기 미션이다.

자판기 미션 IntelliJ 실행화면

 


진행방식은 세 가지 요구사항인 기능 요구사항, 프로그래밍 요구사항, 과제 진행 요구사항을 만족하기 위해 노력하면서 구현하는 것이다.

미션에 대한 요구사항은 https://github.com/woowacourse/java-vendingmachine-precourse README.md을 통해 확인할 수 있다.

 

기능 요구사항

반환되는 동전이 최소한이 되는 자판기를 구현한다.

  • 자판기가 보유하고 있는 금액으로 동전을 무작위로 생성한다.
    • 투입 금액으로는 동전을 생성하지 않는다.
  • 잔돈을 돌려줄 때 현재 보유한 최소 개수의 동전으로 잔돈을 돌려준다.
  • 지폐를 잔돈으로 반환하는 경우는 없다고 가정한다.
  • 상품명, 가격, 수량을 입력하여 상품을 추가할 수 있다.
    • 상품 가격은 100원부터 시작하며, 10원으로 나누어떨어져야 한다.
  • 사용자가 투입한 금액으로 상품을 구매할 수 있다.
  • 남은 금액이 상품의 최저 가격보다 적거나, 모든 상품이 소진된 경우 바로 잔돈을 돌려준다.
  • 잔돈을 반환할 수 없는 경우 잔돈으로 반환할 수 있는 금액만 반환한다.
    • 반환되지 않은 금액은 자판기에 남는다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 해당 부분부터 다시 입력을 받는다.
  • 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.

 

프로그래밍 요구사항

  • JDK 8 버전에서 실행 가능해야 한다.
  • 자바 코드 컨벤션을 지키면서 프로그래밍한다.
  • indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용(예 -while문 안에 if 문이 있으면 들여쓰기는 2)j
  • 3항 연산자를 쓰지 않는다.
  • 함수가 한 가지 일만 하도록 최대한 작게 만들어라.
  • camp.nextstep.edu.missionutils에서 제공하는 Randoms, Console API를 활용해 구현해야 한다.
    • Random 값 추출은 camp.nextstep.edu.missionutils.Randoms의 pickNumberInRange()를 활용
    • 사용자가 입력하는 값은 camp.nextstep.edu.missionutils.Console의 readLine()을 활용
  • 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.
  • else 예약어를 쓰지 않는다. (switch/case도 허용하지 않는다.)
  • Coin 클래스를 활용해 구현해야 한다.

 

과제 진행 요구사항

  • 미션은 저장소를 Fork/Clone해 시작한다.
  • 기능을 구현하기 전에 구현할 기능 목록을 정리해 추가한다.
  • 커밋 컨벤션을 참고하여 commit log를 남긴다.

 


 

MVC패턴

MVC 패턴

MVC 패턴은 소프트웨어 디자인 패턴이다. MVC 패턴은 각 부분들을 독립적으로 개발하기가 수월하고 효과적으로 재사용을 할 수 있다. 

  • Model : 소프트웨어가 무엇을 할지 정한다. (데이터)
  • View :  사용자에게 보이는 화면 부분을 제어한다. (화면)
  • Controller : model과 view를 연결하는 역할을 한다. 흐름을 제어한다. (제어)

 

이번 3주차에서는 처음으로 MVC패턴으로 나눠 구현할 수 있었다. 패키지를 생성하여 각 부분들의 역할을 생각하면서 구현하였다. 


String 비교

String을 비교할 때는 equals, ==를 사용하여 비교할 수 있다.

equals() VS '=='

JAVA에서 문자열을 비교할 때는 '=='연산자를 사용하지 않고 equals를 사용한다. 

equals는 String 자체의 문자열 데이터만을 비교하고 '=='연산자는 주소 값을 비교하기 때문에 차이가 존재한다. 따라서 String을 비교할 때는 무조건 equals를 사용하도록 한다.

나는 C++ 언어를 주로 사용해왔기 때문에 '==' 기호를 사용하여 비교를 많이 했지만, 자바에서는 '=='으로 String을 비교할 수 없다. 이 문제로 최종 테스트 때 많이 시간을 날렸었다..

 


객체에 메시지를 보내라

2주차 피드백에 '객체에 메시지를 보내라'라는 피드백이 있었다. 

상태 데이터를 가지는 객체에서 데이터를 꺼내려(get) 하지 말고 객체에 메시지를 보내라.

예를 들어 Car가 우승자인지를 판단하기 위해 최대 이동 거리 값을 가지는 Car인지 판단 기능은?

private boolean isMaxPosition(Car car) {
	return car.getPosition() == maxDistance;
}

위와 같이 구현하지 않고 다음과 같이 Car에게 메시지를 보내 구현한다. 

	car.isMaxPosition(maxDistance);

 

처음 이 피드백을 받았을 때는 무슨 의미인지 알 수 없었다. 당연하게 사용해왔던 get/set을 사용하지 못하게 되어서 매우 불편했다. 그래서 일단 get을 사용하고 구현한 후 어떻게 하면 메시지를 보내 구현할지 고민하였다. 여러 사람들의 코드를 읽어보고 구글링 해본 결과 어떻게 해야 할지 조금은 알 수 있었다. 보통 get은 controller에서 model의 데이터를 받아오는 방식으로 사용한다. 하지만 이를 controller에서 사용하지 않고 model로 메시지를 보내 구현하는 방식으로 구현하였다. 

 

그리고 View에서 사용자에게 보여주기 위해서 get을 사용했었는데, 이 부분에서도 어떻게 해야 get을 사용하지 않을까 고민했다. 비즈니스 로직에서 출력을 해야 하나 고민했지만 결국 답은 얻지 못헀다. 나중에 피드백을 다시 읽어보니 'View에서 사용할 데이터라면 getter 메서드를 통해 데이터를 전달한다.'라는 문장이 있었고 View에서는 getter를 사용하여 데이터를 전달할 수 있다는 것을 알게 되었다. 정확하게 이해한 것인지 모르겠지만, View에서 단순히 출력할 때는 getter을 사용해도 된다라는 의미로 받아들였다.

 

getter/setter를 아예 사용하지 말라는 것은 아니다. 단지 더 객체지향적인 방법으로 코드를 구현하기 위해 지양하라는 것이다. 객체의 상태를 getter로 불러와 사용하는 것이 객체지향이라고 할 수 없다. 그래서 객체에 메시지를 보내 객체 스스로가 일을 하도록 해야 한다. 


HashMap VS LikedHashMap

HashMap과 LikedHashMap은 key와 value쌍으로 이루어진 Map이다.

하지만 두 개의 차이점은 HashMapd은 순서대로 저장되지 않고, LikedMap은 순서대로 저장된다.

 Map<Coin, Integer> machineCoin = new LinkedHashMap<>();

Coin과 개수를 Map에 저장할 때 다음과 같이 LikedHashMap으로 선언하여 500, 100, 50, 10원 순으로 입력된 순서로 저장된다. LikedMap으로 저장하지 않고 HashMap으로 선언한다면 입력된 순서로 저장되지 않는다.

 

TreeMap도 존재한다. TreeMap으로 선언한다면 정렬된 순서를 얻을 수 있다. 자동으로 sort가 된다. 

 


 

고찰

아직 부족한 게 많다고 느낀다. 하면 할수록 공부할게 많고 생각해야 할 것들이 많다.

 

MVC 패턴을 사용하여 처음 구현해봤다. 학부생 때 MVC 패턴을 배우긴 했지만 이를 토대로 구현한 적은 없었다. 처음엔 설계도 하지 않고, 그냥 구현했다. 1주차 때 친구가 설계하는 데에 시간을 많이 쏟는다고 했지만, 나는 처음엔 그게 뭔데? 그냥 구현하면 되는 거 아냐? 라는 멍청한 소리를 했다 ㅎㅎㅎㅎ 확실히 설계를 하고 구현하는 것이 시간낭비를 안 한다. 왜 내가 코딩하는 것이 오래 걸릴까 했는데 문제가 여기 있었다. 

 

MVC 패턴을 사용하여 구현하니 어느 부분은 어디 들어가야 되나 라는 고민을 많이 했었고 이제 점점 감이 온다. 확실히 체계적이고 약간 다른 세상을 본 거 같다. 

 

그리고 다른 사람들의 코드를 읽어보고 구현하는 점이 나의 코딩 실력에 가장 좋은 부분이었다. 계속 코드를 고칠 수 있었고 더 효율적이게 코드를 구현할 수 있었다. 3주밖에 안 되는 짧은 시간이었지만 정말 많이 배우고 유익한 시간이었던 거 같다.

728x90

댓글