[자바 무료 강의] 자판기를 만들어보자 3 - 코드라떼
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의자판기를 만들어보자 3최종수정일 2021-11-20
아이콘약 4분

자판기를 만드는 마지막 강의로, 순서도와 이용하여 코드 구현체를 만드는 강의입니다. 지금까지의 강의를 자기것으로 만들었다면 충분히 코드 구현체를 만들 수 있습니다. 마지막까지 힘내봅시다!

추가 노트

우리가 배웠던 기본 문법만을 이용하여 자판기 코드를 만들었습니다.

코드는 실습도구를 참고하세요.

순서도와 코드를 비교하시면서 천천히 확인해보시는 것을 권장드립니다.


자판기의 순서도

자판기 코드를 짜는 것에 집중하지 말고 자판기를 만들 수 있도록 머리속에 흐름을 정리하세요. 그리고 자판기에 대해서 생각하세요. 그게 프로그래밍의 시작입니다. 프로그래밍은 생각하는 것이 90%입니다.

순서도

도전자 질문
아이콘iambo(2023-05-01 21:53 작성됨)
안녕하세요 코드라떼님! 좋은 강의 감사드립니다 :)

음료 구매 후 잔액이 0원이 되면 "돈을 투입해 주세요" 
스테이지부터 시작하고 싶어서 아래처럼 변경해보았습니다.
기존 if문>while문 이후 코드를 else if 안에 복사/붙여넣기만 한 것이라
중복을 피하고 싶어 더 좋은 방법을 찾고 있는데 어렵네요ㅠ
혹시 힌트라도 주실 수 있으실까요?


-변경 전-
if (beverageCost[selectedBeverage] > money) {
    System.out.println("금액이 부족합니다");
}


-변경 후-
if (beverageCost[selectedBeverage] > money) {
    System.out.println("금액이 부족합니다");
} else if (beverageCost[selectedBeverage] == money) {
    money = money - beverageCost[selectedBeverage];
    beverageStock[selectedBeverage] = beverageStock[selectedBeverage] - 1;
    System.out.printf("%s 음료를 구매했습니다.\n", beveragesNames[selectedBeverage]);
    System.out.printf("남은 금액은 %d 입니다.", money);
}
아이콘코드라떼(2023-05-04 18:56 작성됨)
안녕하세요. 코드라떼입니다 :)

코드를 작성하기에 앞서 순서도로 생각을 정리해보시는 것이 좋을 것 같습니다.
생각이 정리되어 순서도로 표현이 되면 단순하게 코드만 작성하면 됩니다 :)

올려주신 '변경 후' 코드를 보면 로직보다 생각 정리가 필요한 것으로 보입니다.
else if (beverageCost[selectedBeverage] == money)
해당 코드 이후에 money = money - beverageCost[selectedBeverage]; 코드가 작성되어 있는 것을 봤을 때, 코드 문제가 아니라고 판단되기 때문입니다.

먼저 생각을 정리해 보시고, 순서도를 작성해 보세요.

감사합니다 :)
아이콘왕초보(2023-03-22 18:00 작성됨)
음료를 선택할 때 0,1,2가 아닌 다른 수를 입력할 때 음료가 존재하지 않습니다.를 출력하고 다시 음료를 선택하는 반복문으로 돌아가려면 어떻게 해야하나요?
아이콘코드라떼(2023-04-08 15:17 작성됨)
안녕하세요. 코드라떼입니다 :)

여러 가지 방법이 있을 수 있으나, 간단한 방법 중 하나는
0, 1, 2가 아닌 다른 수를 입력 했을 경우는 정상적인 수가 아니므로 음료를 선택하라는 문구와 다시 입력받는 부분이 반복되어야 합니다.
어디서부터 어디까지 반복되어야할 지 범위가 확인된다면 아래와 같이 코드를 작성할 수 있습니다.
반복되어야 하는 부분을 반복문으로 감싼 후, 특정조건이 되면 break 키워드를 호출하여 반복문을 벗어나는 방법을 택할 수 있습니다.

-변경 전-
do {
    System.out.println("음료를 선택해주세요.");
    selectedBeverage = scanner.nextInt();
    if (beverageStock[selectedBeverage] <= 0) {
        System.out.printf("%s 음료가 존재하지 않습니다. 다른 음료를 선택해주세요.\n",
        beverageNames[selectedBeverage]);
    }
} while (beverageStock[selectedBeverage] <= 0);

-변경 후-
do {
    while (true) {
        System.out.println("음료를 선택해주세요.");
        selectedBeverage = scanner.nextInt();
        if (selectedBeverage < 2) {
            break;
        }
        System.out.println("존재하지 않는 음료입니다.");
     }
     if (beverageStock[selectedBeverage] <= 0) {
         System.out.printf("%s 음료가 존재하지 않습니다. 다른 음료를 선택해주세요.\n",
         beverageNames[selectedBeverage]);
     }
} while (beverageStock[selectedBeverage] <= 0);


감사합니다 :)
아이콘감자도리야(2021-12-16 17:13 작성됨)
실습도구 9번라인에서 beverageStock을 final로 선언했는데
40번라인에서 값변경이 어떻게 가능한건가요?

final은 값 변경이 불가능하게 하는거 아니였나요?
아이콘코드라떼(2021-12-17 21:09 작성됨)
안녕하세요. 코드라떼입니다 :)

final int[] beverageStock = {4, 3, 2}; 해당 코드를 말씀하신 것으로 보입니다.
final로 선언된 변수는 변수의 값이 지정되면 그 이후에 값 변경이 불가능한 것이 맞습니다.
다만 여기서 헷갈리지 말아야 할 부분은 int[]에 저장되는 값은 배열의 값이 아니라 '배열의 값을 저장하고 있는 공간'의 참조값입니다.
그러므로 '배열 공간에 저장되는 값'과 '배열 공간의 위치값'을 저장하는 변수와 분리해서 생각해야 합니다.

ps. 참조값에 대한 부분은 '[심화] 배열과 메모리'에서 확인하실 수 있습니다.

감사합니다.
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io
사업자등록번호 : 824-06-01921
통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호
파일
파일파일
Root
파일

Code Run을 통해 코드를 실행해보세요. root$에 입력을 하여 자판기에게 명령을 내려보세요.

Output
root$
Lesson List button
코스자바로 배우는 프로그래밍
hamburger button
강의자판기를 만들어보자 3최종수정일 2021-11-20
아이콘약 4분

자판기를 만드는 마지막 강의로, 순서도와 이용하여 코드 구현체를 만드는 강의입니다. 지금까지의 강의를 자기것으로 만들었다면 충분히 코드 구현체를 만들 수 있습니다. 마지막까지 힘내봅시다!

추가 노트

우리가 배웠던 기본 문법만을 이용하여 자판기 코드를 만들었습니다.

코드는 실습도구를 참고하세요.

순서도와 코드를 비교하시면서 천천히 확인해보시는 것을 권장드립니다.


자판기의 순서도

자판기 코드를 짜는 것에 집중하지 말고 자판기를 만들 수 있도록 머리속에 흐름을 정리하세요. 그리고 자판기에 대해서 생각하세요. 그게 프로그래밍의 시작입니다. 프로그래밍은 생각하는 것이 90%입니다.

순서도

도전자 질문
아이콘iambo(2023-05-01 21:53 작성됨)
안녕하세요 코드라떼님! 좋은 강의 감사드립니다 :)

음료 구매 후 잔액이 0원이 되면 "돈을 투입해 주세요" 
스테이지부터 시작하고 싶어서 아래처럼 변경해보았습니다.
기존 if문>while문 이후 코드를 else if 안에 복사/붙여넣기만 한 것이라
중복을 피하고 싶어 더 좋은 방법을 찾고 있는데 어렵네요ㅠ
혹시 힌트라도 주실 수 있으실까요?


-변경 전-
if (beverageCost[selectedBeverage] > money) {
    System.out.println("금액이 부족합니다");
}


-변경 후-
if (beverageCost[selectedBeverage] > money) {
    System.out.println("금액이 부족합니다");
} else if (beverageCost[selectedBeverage] == money) {
    money = money - beverageCost[selectedBeverage];
    beverageStock[selectedBeverage] = beverageStock[selectedBeverage] - 1;
    System.out.printf("%s 음료를 구매했습니다.\n", beveragesNames[selectedBeverage]);
    System.out.printf("남은 금액은 %d 입니다.", money);
}
아이콘코드라떼(2023-05-04 18:56 작성됨)
안녕하세요. 코드라떼입니다 :)

코드를 작성하기에 앞서 순서도로 생각을 정리해보시는 것이 좋을 것 같습니다.
생각이 정리되어 순서도로 표현이 되면 단순하게 코드만 작성하면 됩니다 :)

올려주신 '변경 후' 코드를 보면 로직보다 생각 정리가 필요한 것으로 보입니다.
else if (beverageCost[selectedBeverage] == money)
해당 코드 이후에 money = money - beverageCost[selectedBeverage]; 코드가 작성되어 있는 것을 봤을 때, 코드 문제가 아니라고 판단되기 때문입니다.

먼저 생각을 정리해 보시고, 순서도를 작성해 보세요.

감사합니다 :)
아이콘왕초보(2023-03-22 18:00 작성됨)
음료를 선택할 때 0,1,2가 아닌 다른 수를 입력할 때 음료가 존재하지 않습니다.를 출력하고 다시 음료를 선택하는 반복문으로 돌아가려면 어떻게 해야하나요?
아이콘코드라떼(2023-04-08 15:17 작성됨)
안녕하세요. 코드라떼입니다 :)

여러 가지 방법이 있을 수 있으나, 간단한 방법 중 하나는
0, 1, 2가 아닌 다른 수를 입력 했을 경우는 정상적인 수가 아니므로 음료를 선택하라는 문구와 다시 입력받는 부분이 반복되어야 합니다.
어디서부터 어디까지 반복되어야할 지 범위가 확인된다면 아래와 같이 코드를 작성할 수 있습니다.
반복되어야 하는 부분을 반복문으로 감싼 후, 특정조건이 되면 break 키워드를 호출하여 반복문을 벗어나는 방법을 택할 수 있습니다.

-변경 전-
do {
    System.out.println("음료를 선택해주세요.");
    selectedBeverage = scanner.nextInt();
    if (beverageStock[selectedBeverage] <= 0) {
        System.out.printf("%s 음료가 존재하지 않습니다. 다른 음료를 선택해주세요.\n",
        beverageNames[selectedBeverage]);
    }
} while (beverageStock[selectedBeverage] <= 0);

-변경 후-
do {
    while (true) {
        System.out.println("음료를 선택해주세요.");
        selectedBeverage = scanner.nextInt();
        if (selectedBeverage < 2) {
            break;
        }
        System.out.println("존재하지 않는 음료입니다.");
     }
     if (beverageStock[selectedBeverage] <= 0) {
         System.out.printf("%s 음료가 존재하지 않습니다. 다른 음료를 선택해주세요.\n",
         beverageNames[selectedBeverage]);
     }
} while (beverageStock[selectedBeverage] <= 0);


감사합니다 :)
아이콘감자도리야(2021-12-16 17:13 작성됨)
실습도구 9번라인에서 beverageStock을 final로 선언했는데
40번라인에서 값변경이 어떻게 가능한건가요?

final은 값 변경이 불가능하게 하는거 아니였나요?
아이콘코드라떼(2021-12-17 21:09 작성됨)
안녕하세요. 코드라떼입니다 :)

final int[] beverageStock = {4, 3, 2}; 해당 코드를 말씀하신 것으로 보입니다.
final로 선언된 변수는 변수의 값이 지정되면 그 이후에 값 변경이 불가능한 것이 맞습니다.
다만 여기서 헷갈리지 말아야 할 부분은 int[]에 저장되는 값은 배열의 값이 아니라 '배열의 값을 저장하고 있는 공간'의 참조값입니다.
그러므로 '배열 공간에 저장되는 값'과 '배열 공간의 위치값'을 저장하는 변수와 분리해서 생각해야 합니다.

ps. 참조값에 대한 부분은 '[심화] 배열과 메모리'에서 확인하실 수 있습니다.

감사합니다.
이용약관|개인정보취급방침
알유티씨클래스|대표, 개인정보보호책임자 : 이병록
이메일 : cs@codelatte.io|운영시간 09:00 - 18:00(평일)
사업자등록번호 : 824-06-01921|통신판매업신고 : 2021-성남분당C-0740
주소 : 경기도 성남시 분당구 대왕판교로645번길 12, 9층 24호(경기창조혁신센터)
파일
파일파일
Root
파일

Code Run을 통해 코드를 실행해보세요. root$에 입력을 하여 자판기에게 명령을 내려보세요.

Output
root$