{"id":27422134,"url":"https://github.com/hanull/practice-vendingmachine-for-final","last_synced_at":"2026-07-03T18:01:19.896Z","repository":{"id":181278931,"uuid":"438468105","full_name":"hanull/practice-vendingmachine-for-final","owner":"hanull","description":null,"archived":false,"fork":false,"pushed_at":"2021-12-15T11:59:53.000Z","size":78,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-12T03:44:38.814Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hanull.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-12-15T02:24:52.000Z","updated_at":"2021-12-15T02:27:37.000Z","dependencies_parsed_at":"2023-07-15T03:30:13.987Z","dependency_job_id":null,"html_url":"https://github.com/hanull/practice-vendingmachine-for-final","commit_stats":null,"previous_names":["hanull/practice-vendingmachine-for-final"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hanull/practice-vendingmachine-for-final","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanull%2Fpractice-vendingmachine-for-final","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanull%2Fpractice-vendingmachine-for-final/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanull%2Fpractice-vendingmachine-for-final/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanull%2Fpractice-vendingmachine-for-final/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hanull","download_url":"https://codeload.github.com/hanull/practice-vendingmachine-for-final/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hanull%2Fpractice-vendingmachine-for-final/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35096012,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-03T02:00:05.635Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-14T10:19:24.063Z","updated_at":"2026-07-03T18:01:19.835Z","avatar_url":"https://github.com/hanull.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 미션 - 자판기\n\n## 🔍 진행방식\n\n- 미션은 **기능 요구사항, 프로그래밍 요구사항, 과제 진행 요구사항** 세 가지로 구성되어 있다.\n- 세 개의 요구사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다.\n- 기능 요구사항에 기재되지 않은 내용은 스스로 판단하여 구현한다.\n\n## ✉️ 미션 제출 방법\n\n- 미션 구현을 완료한 후 GitHub을 통해 제출해야 한다.\n   - GitHub을 활용한 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고해 제출한다.\n- GitHub에 미션을 제출한 후 [우아한테크코스 지원 플랫폼](https://apply.techcourse.co.kr) 에 접속하여 프리코스 과제를 제출한다.\n   - 자세한 방법은 [링크](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse#제출-가이드) 를 참고한다.\n   - **Pull Request만 보내고, 지원 플랫폼에서 과제를 제출하지 않으면 최종 제출하지 않은 것으로 처리되니 주의한다.**\n\n## ✔️ 과제 제출 전 체크리스트 - 0점 방지\n\n- 터미널에서 `java -version`을 실행해 자바 8인지 확인한다. 또는 Eclipse, IntelliJ IDEA와 같은 IDE의 자바 8로 실행하는지 확인한다.\n- 터미널에서 맥 또는 리눅스 사용자의 경우 `./gradlew clean test`, 윈도우 사용자의 경우 `gradlew.bat clean test` 명령을 실행했을 때 모든 테스트가 아래와 같이 통과하는지 확인한다.\n\n```\nBUILD SUCCESSFUL in 0s\n```\n\n---\n\n## 🚀 기능 요구사항\n\n반환되는 동전이 최소한이 되는 자판기를 구현한다.\n\n- 자판기가 보유하고 있는 금액으로 동전을 무작위로 생성한다.\n   - 투입 금액으로는 동전을 생성하지 않는다.\n- 잔돈을 돌려줄 때 현재 보유한 최소 개수의 동전으로 잔돈을 돌려준다.\n- 지폐를 잔돈으로 반환하는 경우는 없다고 가정한다.\n- 상품명, 가격, 수량을 입력하여 상품을 추가할 수 있다.\n   - 상품 가격은 100원부터 시작하며, 10원으로 나누어떨어져야 한다.\n- 사용자가 투입한 금액으로 상품을 구매할 수 있다.\n- 남은 금액이 상품의 최저 가격보다 적거나, 모든 상품이 소진된 경우 바로 잔돈을 돌려준다.\n- 잔돈을 반환할 수 없는 경우 잔돈으로 반환할 수 있는 금액만 반환한다.\n   - 반환되지 않은 금액은 자판기에 남는다.\n- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, \"[ERROR]\"로 시작하는 에러 메시지를 출력 후 해당 부분부터 다시 입력을 받는다.\n- 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.\n\n### ✍🏻 입출력 요구사항\n\n#### ⌨️ 입력\n\n- 상품명, 가격, 수량은 쉼표로, 개별 상품은 대괄호([])로 묶어 세미콜론(;)으로 구분한다.\n\n```\n[콜라,1500,20];[사이다,1000,10]\n```\n\n#### 🖥 출력\n\n- 자판기가 보유한 동전\n\n```\n500원 - 0개\n100원 - 4개\n50원 - 1개\n10원 - 0개\n```\n\n- 잔돈은 반환된 동전만 출력한다.\n\n```\n100원 - 4개\n50원 - 1개\n```\n\n- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 [ERROR]로 시작해야 한다.\n\n```\n[ERROR] 금액은 숫자여야 합니다.\n```\n\n#### 💻 프로그래밍 실행 결과 예시\n\n```\n자판기가 보유하고 있는 금액을 입력해 주세요.\n450\n\n자판기가 보유한 동전\n500원 - 0개\n100원 - 4개\n50원 - 1개\n10원 - 0개\n\n상품명과 가격, 수량을 입력해 주세요.\n[콜라,1500,20];[사이다,1000,10]\n\n투입 금액을 입력해 주세요.\n3000\n\n투입 금액: 3000원\n구매할 상품명을 입력해 주세요.\n콜라\n\n투입 금액: 1500원\n구매할 상품명을 입력해 주세요.\n사이다\n\n투입 금액: 500원\n잔돈\n100원 - 4개\n50원 - 1개\n```\n\n---\n\n## 🎱 프로그래밍 요구사항\n\n- 프로그램을 실행하는 시작점은 `Application`의 `main()`이다.\n- JDK 8 버전에서 실행 가능해야 한다. **JDK 8에서 정상 동작하지 않을 경우 0점 처리**한다.\n- 자바 코드 컨벤션을 지키면서 프로그래밍한다.\n   - https://naver.github.io/hackday-conventions-java\n- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다.\n   - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.\n   - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다.\n- 3항 연산자를 쓰지 않는다.\n- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다.\n   - 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다.\n- else 예약어를 쓰지 않는다.\n   - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다.\n   - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다.\n- 프로그래밍 요구사항에서 별도로 변경 불가 안내가 없는 경우 파일 수정과 패키지 이동을 자유롭게 할 수 있다.\n\n### 프로그래밍 요구사항 - Coin\n\n- Coin 클래스를 활용해 구현해야 한다.\n- 필드(인스턴스 변수)인 `amount`의 접근 제어자 private을 변경할 수 없다.\n\n```java\npublic enum Coin {\n    COIN_500(500),\n    COIN_100(100),\n    COIN_50(50),\n    COIN_10(10);\n\n    private final int amount;\n\n    Coin(final int amount) {\n        this.amount = amount;\n    }\n\n    // 추가 기능 구현\n}\n```\n\n### 프로그래밍 요구사항 - Randoms, Console\n\n- JDK에서 기본 제공하는 Random, Scanner API 대신 `camp.nextstep.edu.missionutils`에서 제공하는 `Randoms`, `Console` API를 활용해 구현해야 한다.\n   - Random 값 추출은 `camp.nextstep.edu.missionutils.Randoms`의 `pickNumberInList()`를 활용한다.\n   - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다.\n- 프로그램 구현을 완료했을 때 `src/test/java` 디렉터리의 `ApplicationTest`에 있는 모든 테스트 케이스가 성공해야 한다. **테스트가 실패할 경우 0점 처리한다.**\n\n---\n\n## 📈 과제 진행 요구사항\n\n- 미션은 [java-vendingmachine-precourse](https://github.com/woowacourse/java-vendingmachine-precourse) 저장소를 Fork/Clone해 시작한다.\n- **기능을 구현하기 전에 java-vendingmachine-precourse/docs/README.md 파일에 구현할 기능 목록을 정리**해 추가한다.\n- **Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위**로 추가한다.\n   - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다.\n- 과제 진행 및 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고한다.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhanull%2Fpractice-vendingmachine-for-final","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhanull%2Fpractice-vendingmachine-for-final","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhanull%2Fpractice-vendingmachine-for-final/lists"}