• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

For반복문 예제

23.04.11 20:26 작성 조회수 216

0

안녕하세요, 선생님

블로그에 선생님 강의 내용에서 예제를 따라치면서 정리하는 과정에 궁금증이 생겨서 여쭤봅니다.

증감연산자의 위치가 여러 예제문에서 헷갈리는데요. (sold++;)

int max = 30;
int noShow = 15;
int sold = 0;


for (int i = 1; i <=50 ; i++) {
    System.out.println(i+"번 손님 나왔습니다");
    if(i==noShow){
        System.out.println(i+"번 노쇼로 넘어갑니다");
        continue;
    }
    sold++;
    if(sold==max){
        System.out.println("금일 영업종료");
        break;
    }

위의 코드에서 sold++위치를 아래와 같이 바꿀 경우에 for문 중괄호 안에는 들어가 있어서 가능할 거 같은데 결과는 32번 손님까지 이어지네요. 비슷한 예제로 while문에서는

증감연산자의 위치가 break뒤에 위치한 경우 결과값이 올바르게 나오는데 확실하게 증감연산자의 위치를 구별 할 수 있는 방법이 있을까요?

int max = 30;
int noShow = 15;
int sold = 0;


for (int i = 1; i <=50 ; i++) {
    System.out.println(i+"번 손님 나왔습니다");
    if(i==noShow){
        System.out.println(i+"번 노쇼로 넘어갑니다");
        continue;
    }
    sold++;
    if(sold==max){
        System.out.println("금일 영업종료");
        break;
    }
    sold++;

}

------------------------------------
  //while문 -break
        int index = 1; //손님 대기번호 , for와 달리 변수가 필요함(중요)
        while(index <= 50){
            System.out.println(index+"번 손님 주문하신 치킨 나왔습니다");
            if(index == 20){
                System.out.println("금일 재료가 모두 소진되었습니다");
                break;
            }
            index++;
        }

답변 1

답변을 작성해보세요.

0

안녕하세요?

반복문에서 선언(i = 0 또는 i = 1), 반복 조건(i < 50 또는 i <= 50), 증감 연산의 위치(sold++) 등은 매우 중요한 요소이며 하나만 실수해도 완전히 엉뚱한 결과가 나오게 될 수 있습니다. 한편으로는 값들의 변화를 한 눈에 파악하기 어렵기도 한데요. 이야기를 풀어나가는 것처럼 문장으로 만들어보면 조금 더 쉽게 이해할 수도 있을 것 같아요.

처음 for 문의 예시를 이야기로 바꿔볼까요?
각 문장 밑에 주석으로 달아보겠습니다.

System.out.println(i + "번 손님 나왔습니다");
// 몇 번 손님에게 치킨이 나왔다고 안내

if (i == noShow) {
// 만약 손님이 나타나지 않는다면

	System.out.println(i + "번 노쇼로 넘어갑니다");	
	// 노쇼임을 안내하고 나서

	continue;
	// 다음 분에게 기회를 부여 (다음 반복문 수행)

}

sold++;
// 손님이 나타났다면 판매되었으므로 판매 수량을 증가

if (sold == max) {
// 만약 최대 치킨 판매 수량을 채웠다면

	System.out.println("금일 영업종료");
	// 더 이상 판매할 치킨이 없으므로 영업종료

	break;
	// 치킨 판매 반복문 탈출
}

주석을 읽어보면 업무의 순서가 납득이 가네요.
그런데 만약 sold++ 의 위치를 if (sold == max) 뒤로 옮기면 어떻게 될까요?

System.out.println(i + "번 손님 나왔습니다");
// 몇 번 손님에게 치킨이 나왔다고 안내

if (i == noShow) {
// 만약 손님이 나타나지 않는다면

	System.out.println(i + "번 노쇼로 넘어갑니다");	
	// 노쇼임을 안내하고 나서

	continue;
	// 다음 분에게 기회를 부여 (다음 반복문 수행)

}

// 주의!! 판매를 했음에도 불구하고 판매 수량을 증가시키지 않음

if (sold == max) {
// 만약 최대 치킨 판매 수량을 채웠다면

	System.out.println("금일 영업종료");
	// 더 이상 판매할 치킨이 없으므로 영업종료

	break;
	// 치킨 판매 반복문 탈출

}

sold++;
// 손님이 나타났다면 판매되었으므로 판매 수량을 증가

제가 코드 중간에 // 주의!! 라고 적어둔 부분을 살펴봐주세요. 분명 치킨을 판매했음에도 불구하고 판매수량을 증가시키지 않았기 때문에 바로 밑에 있는 if 조건문은 진입할 수가 없게 됩니다. 가령 최대 치킨 판매 수량이 1 이라고 해볼까요? 치킨 한 마리만 팔면 바로 영업을 종료하는 것입니다. 그럼 처음 반복문을 수행할 때 sold 의 값은 0 인데 // 주의!! 부분에서 치킨을 판매하였음에도 불구하고 sold 값은 변화가 없으므로 if (sold == max) 에는 진입을 못 하게 되는 문제가 생깁니다. 수량을 채웠음에도 불구하고, 더 이상 판매할 치킨이 없음에도 불구하고 다음 손님에게도 치킨을 팔려는 문제가 발생하게 되는 것이죠.

이런 식으로 코드의 동작을 문장으로 풀어서 적어보면서 sold++ 의 위치가 어느 곳에 있어야 적절한지, 다른 위치로 가면 동작이 어떻게 달라지는지를 한 번 살펴보시면 좋겠습니다. 강의에서는 다루지 않았지만 디버깅을 통해 값 변화를 확인하시는 것도 도움될 수 있습니다. 조금 분량이 많지만 자세히 설명된 다음 블로그 링크를 참고해주세요.

👉 https://jojoldu.tistory.com/149

학습에 도움되길 바라겠습니다 😊
감사합니다.

아..역시 선생님 강의에서도 느껴졌지만 매번 저같은 초보도 이해하기 쉽게 알려주셔서 감사합니다. 이렇게 코드를 글로 풀어서 이해를 하니 훨씬 더 와닿는 것 같아요.

참고링크도 한번 살펴보면서 선생님의 자바 강의를 이번주에 2회독 완강하려고 합니다.

마지막까지 최선을 다해보겠습니다~ 바쁘신 와중에도 답변 감사드립니다 ! ^^