코딩하는 해달이

[Java/Kotlin] Lv2. 스파르타 자판기 본문

개인 공부/Java

[Java/Kotlin] Lv2. 스파르타 자판기

코딩하는 해달 2024. 8. 7. 16:59

스파르타 자판기 

자바/코틀린 코드를 이용해 자판기를 만들어 봅시다.

  1. 사용자가 볼 수 있게 메뉴를 표시합니다.
    • 다음과 같은 음료를 실행창에 표시합니다.
      • 사이다 1,700원
      • 콜라 1,900원
      • 식혜 2,500원
      • 솔의눈 3,000원
  2. 사용자는 음료를 선택할 수 있습니다.
    • 사용자에게 어떤 음료를 살 것인지를 입력받습니다.
      • ex) 사이다
      • 목록에 없는 음료일 경우 실행이 종료됩니다.
  3. 사용자는 지불할 금액을 입력할 수 있습니다.
    • 사용자에게 얼마를 넣을지 입력받습니다.
      • ex) 2000
      • 지불하는 금액이 선택한 음료의 비용보다 작다면 “돈이 부족합니다.” 를 출력합니다
  4. 사용자는 음료를 구매하고 남은 잔액을 확인할 수 있습니다.
    • 잔액을 화면에 표시합니다.
      • ex) 입력한 돈 2000원, 사이다 1700원 일때 300원을 잔액으로 보여줍니다.

코드

import java.io.BufferedReader
import java.io.InputStreamReader
import java.text.DecimalFormat

val MENU: Map<String, Int> = mapOf(
    "사이다" to 1700,
    "콜라" to 1900,
    "식혜" to 2500,
    "솔의눈" to 3000
)

var CHANGE: Int = 0

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    while (true) {
        displayMenu()

        val select = readlnOrNull()
        println("${select}를 선택하셨습니다.")
        try {
            MENU[select] as Int // 목록에 있는지 없는지 체크

            print("얼마를 투입하시겠습니까? : ")
            CHANGE += readlnOrNull()?.toInt() ?: 0

            if (MENU[select] as Int > CHANGE) {
                println("돈이 부족합니다.")
            } else {
                CHANGE -= MENU[select] as Int
                println("사이다를 구매하셨습니다.")
            }
        } catch (e: Exception) {
            println("목록에 없는 음료입니다.")
            break
        }
    }
}

fun displayMenu() {
    // 메뉴 표시
    val df = DecimalFormat("#,###")

    var menu = "*********메뉴**********\n"
    for (o in MENU.entries.toSet()) {
        menu += "${o.key} ${o.value} \n"
    }
    menu += "**********************\n" +
            "\$ 잔액 : ${df.format(CHANGE)}"

    println(menu)
}

과제 수행 중 공부한 내용

Kotlin으로 코드를 짰는데 필요한 내용들을 정리해보겠다.

1. Buffered Reader

Buffer란?
데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역
ex) 컴퓨터에서 프린터기로 문서를 전송할 때, 프린터기가 한 문서를 인쇄할 동안 다른 문서들은 버퍼에서 대기함

특징
1. 키보드의 입력이 있을 때마다 한 문자씩 버퍼로 전송, 버퍼가 가득 차거나, 개행문자가 나타나면 버퍼에 쌓인 내용을 한번에 전송
2. 데이터 타입 String으로 고정
3. Scanner에 비해 입출력 시간이 짧음

사용법
val br = BufferedReader(InputStreamReader(System.`in`)) // 입력 스트림 생성
br.readLine() // 한 줄 읽는 메서드(개행문자까지)

br.close() // 입력 스트림 종료

Stringtokenizer
BufferedReader를 사용할 때 함께 자주 사용되는 클래스이다.
문자열이 한 종류의 구분자로 연결되어있는 경우, 구분자를 기준으로 문자를 쉽게 분리할 수 있다.
보통 알고리즘 문제에서 BufferedReader가 개행문자를 기준으로 나눈 문자열을 공백 기준으로 나누어야 할 경우 많이 사용한다.

2. Decimal Format

 DecimalFormat
숫자를 원하는 모양으로 처리하는 클래스이다.

사용법
val df = DecimalFormat("원하는 패턴")
println(df.format(패턴을 적용할 숫자))

// 예를 들어 1000의 자리마다 ,를 넣고싶다면
// 원하는 패턴에 #,###를 넣고,
// 적용할 숫자에 1234를 넣으면 결과는 1,234로 나타난다.​

3. Map

객체 쌍(키, 값)을 보유하고 각 키에 해당하는 값을 효율적으로 검색하는 것을 지원하는 Collection 이다.
특징
1. Map의 키는 중복될 수 없다.
2. 각 키에대해 하나의 값만 보유한다.
3. MutableCollection이 아니기 때문에 읽기만 가능하다는 특징이 있다.
반응형

'개인 공부 > Java' 카테고리의 다른 글

[Java] String과 StringBuilder(+StringBuffer)  (0) 2024.09.04
[Java] Java 톺아보기  (0) 2024.08.06
[Java] 소켓 통신 구현하기  (0) 2023.02.28
Comments