차례:
비디오: Java - 반복문 (1/5) : while 2024
Java 프로그램의 루프를 작성하고 이해하기 쉽게하려면 Java의 break 및 continue 문이 루프 반복에 미치는 영향을 알아야합니다.
자바의 break 문
아래 프로그램을 보시라. 이 프로그램은 1에서 10까지 임의의 숫자를 임의로 생성하고 반복적으로 사용자에게 해당 숫자를 추측하도록 요청합니다.
목록 1
import static java. 랭. 체계. 아웃; import java. util. 스캐너; import java. util. 무작위; 공용 클래스 GuessAgain {public static void main (String args []) {스캐너 키보드 = 새로운 Scanner (System. in); int numGuesses = 0; int randomNumber = new 임의 (). nextInt (10) + 1; 아웃. println ("************"); 아웃. println ("추측 게임에 오신 것을 환영합니다"); 아웃. println ("************"); 아웃. println (); 아웃. print ("1에서 10까지의 int를 입력하십시오:"); int inputNumber = 키보드. nextInt (); numGuesses ++; while (inputNumber! = randomNumber) { out. println (); 아웃. println ("다시 시도하십시오 …"); 아웃. print ("1에서 10까지의 int를 입력하십시오:"); inputNumber = 키보드. nextInt (); numGuesses ++; } 인쇄 ("당신이이긴"); 아웃. println (numGuesses + "추측."); 건반. close ();}}
아래 그림은 코드 실행을 보여줍니다. 사용자는 5 가지 추측을합니다. 매번 컴퓨터는 추측이 맞는지 확인합니다. 잘못된 추측은 다시 시도하라는 요청을 생성합니다. 올바른 추측을 위해 사용자는 자신이 추측 한 수의 집계와 함께 당신이 승리하는 것을 얻습니다. 컴퓨터는 매번 여러 번 반복하여 여러 번 반복하여 사용자의 추측이 무작위로 생성 된 숫자와 같은지 확인합니다. 사용자가 추측 할 때마다 컴퓨터는 추측의 집계에 1을 더합니다. 사용자가 정확한 추측을하면 컴퓨터는 해당 계산을 표시합니다.
이 프로그램에 대해 어색한 점이 있습니까? 글쎄, 몇 가지 진술이 프로그램에서 두 번 이상 나타납니다. 일반적으로 프로그램의 한 부분에서 다른 부분으로 복사되는 문장은 걱정할 필요가 없습니다. 그러나 전반적인 전략은 의심스러워 보입니다. 이 프로그램은 루프 앞에서 사용자로부터 번호를 얻고 루프 내부에서 (다시) 번호를 가져옵니다.
print ("1에서 10까지의 int를 입력하십시오:"); int inputNumber = 키보드. nextInt (); numGuesses ++; while (inputNumber! = randomNumber) {out. println (); 아웃. println ("다시 시도하십시오 …"); . print ("1에서 10까지의 int를 입력하십시오:"); inputNumber = 키보드. nextInt (); numGuesses ++; }
이 코드는 루프를 만들기위한 표준 트릭을 사용합니다. 루프를 시작하는 것입니다. 패턴은 더 많은 입력 받기
} while 루프의 맨 처음에, 컴퓨터는 사용자의 입력과 관련된 조건을 검사합니다. 따라서 컴퓨터는 사용자가 입력을 줄 때까지 루프를 시작하지 않습니다. 그런 다음 컴퓨터가 루프 안에 있으면 컴퓨터는 루프의 다음 반복을 공급할 입력을 더 요청합니다. 트릭이 이상하게 보일지라도 작동합니다.while (true) {
out. print ("1에서 10까지의 int를 입력하십시오:"); inputNumber = 키보드. nextInt (); numGuesses ++;if (inputNumber == randomNumber) {
중단;
} println (); 아웃. println ("다시 시도하십시오 …"); } 인쇄 ("당신이이긴"); 아웃. println (numGuesses + "추측."); 건반. 사용자의 관점에서 보면 Listing 2의 코드는 Listing 1의 코드와 완전히 똑같다. 두 프로그램의 결과를 보려면 위의 그림을 참조한다. 차이점은 Listing 2는 키보드를 한 번 호출한다는 것입니다. nextInt. 이 호출은 루프 안에 있으므로 컴퓨터는 입력을 테스트하지 않고 루프에 들어가야합니다. -루프의 상태를 보면 어떻게 작동하는지 볼 수 있습니다. 루프의 조건은 항상 참입니다. 무슨 일이 일어나 든 루프의 상태는 항상 테스트를 통과합니다. 따라서 루프의 상태는 큰 사기입니다. 루프의 상태에서 테스트가 실패하면 루프에서 벗어날 수 없습니다. 대신 루프 내부에있는 break 문을 누를 때 점프합니다 (if (inputNumber == randomNumber)로드 블록을 지나갈 때 break 문을 치게됩니다). 모든 것이 매우 잘 작동합니다. - 컴퓨터가 루프에있는 break 문을 실행하면 컴퓨터가 루프 밖으로 나옵니다 (루프 뒤의 첫 번째 문으로 이동). break 문을 사용하면 컴퓨터는 단 하나의 루프에서 벗어납니다. 이 루프가 다른 루프 (외부 루프) 내부에있는 경우 컴퓨터는 외부 루프 외부로 점프하지 않습니다. (int i = 0; i <3; i ++) { for (int j = 0; j <100; j ++)에 대한 public static void main (String [] args) { public class BreakOutOfLoop) {
시스템. 아웃. print (j + ""); if (j> 9) {break;}}
시스템. 아웃. println ("나는 부서졌다!");}
}}
설명하기 위해 다음 그림에는 위 코드의 결과가 나와 있습니다.컴퓨터가 break 문에 도달하면 제어가 I broken out 문으로 이동합니다.내가 문을 부 That다는 것은 j 루프의 외부 이지만 i 루프의 안에있다. 프로그래머 관점에서 보면 Listing 2의 코드는 Listing 1의 코드보다 자연 스럽다. 결국 게임은 어떻게 진행될 것인가? 사용자는 추측하고 컴퓨터가 추측을 확인한 다음 추측이 정확하지 않으면 컴퓨터가 "다시 시도하십시오. "Listing 2에 설명 된 것과 같은 일련의 이벤트입니다. 그러나 Listing 1에서 루프 내의 코드는 역순으로 발생하는 이벤트를 설명하는 것처럼 보입니다."다시 시도하십시오 "라고 말한 다음 사용자가 숫자를 입력합니다. Listing 2는 Listing 1의 루프 프라이밍 기법 대신 좋은 대안을 제공한다. 그렇다면 프로그래머는 왜 자신의 루프를 프레이밍해야 하는가? break 문에는 숨겨진 단점이 있습니까? 답변은 당신의 관점에 달려 있습니다. 일부 프로그래머는 루프의 break 문이 혼란 스럽다고 생각합니다. 성명에서 성명서로 점프하는 것은 모두 어지럽게 만들고 1960 년대에 스파게티 코드
라고 불리는 것을 떠올리게합니다. (스파게티 코드는 goto 문을 사용하여 하나의 명령문에서 다른 명령문으로 건너 뜁니다.파스칼 바이 예제 저자 B Burd는 "goto로 프로그래밍하는 것은 하수도 시스템을 통해 파리를 돌아 다니며 파리를 여행하는 것과 같습니다. 짧은 컷이지만 그 중 어느 것도 가져갈 가치가 없습니다. ") 루프의 break 문은 규칙이 아니라 예외입니다. 원한다면 사용하십시오. 그러나 다른 사람들의 Java 코드에서 그 중 많은 것을 찾을 것으로 기대하지 마십시오. Java의 continue 문 Listing 3은 프로그램의 루프에 대한 더 많은 비밀 소스를 제공한다. 1에서 20까지 3 개의 숫자를 무작위로 생성하는 게임을 상상해보십시오. 사용자는 숫자를 추측하여 5 번 회전합니다. 사용자가 올바른 추측을 입력하면 프로그램이 사용자에게 축하를 보냅니다. ("좋은 추측"프로그램을 말합니다.) 사용자가 잘못된 추측을 입력하면 프로그램은 피드백을 제공하지 않습니다. Listing 3에는 모든 일을 처리 할 수있는 코드가 포함되어있다.
목록 3
import static java. 랭. 체계. 아웃; import java. util. 스캐너; import java. util. 무작위; 공용 클래스 GuessAgainAndAgain {public static void main (String args []) {스캐너 키보드 = 새 Scanner (System.in); int inputNumber; int randNum1 = 새로운 무작위 (). nextInt (20) +1; int randNum2 = 새로운 무작위 (). nextInt (20) +1; int randNum3 = 새로운 무작위 (). nextInt (20) +1; 아웃. println ("************"); 아웃. println ("추측 게임에 오신 것을 환영합니다"); 아웃. println ("************"); 아웃. println (); for (int i = 0; i <5; i ++) {out. print ("int를 입력하십시오:"); inputNumber = 키보드. nextInt (); if (inputNumber! = randNum1 && inputNumber! = randNum2 && inputNumber! = randNum3) { continue;
}
println ("좋은 추측!"); 아웃. println ();} 출력합니다. 인쇄 ("숫자는"); 아웃. print (randNum1 + ""); 아웃. 인쇄 (randNum2 + ""); 아웃. print (randNum3 + ""); 건반. close ();}}
이 그림은 그러한 프로그램의 실행을 보여줍니다.
Java의 continue 문은 컴퓨터가 루프 내부의 나머지 문을 뛰어 넘는다는 것을 알려줍니다.즉, 루프 내에서 나머지 명령문을 실행하는 대신 컴퓨터는 루프의 다음 반복 시작으로 이동합니다. 따라서 Listing 3에서 inputNumber가 프로그램의 무작위로 생성 된 숫자가 아닌 경우 컴퓨터는 "좋은 추측"코드를 뛰어 넘어 루프 카운터 (변수 i)를 증가시키고 사용자에게 다른 입력 값을 묻습니다. (물론 루프 카운터가 한계에 도달하면 컴퓨터는 다른 반복을 실행하지 않고 대신 컴퓨터가 루프에서 빠져 나와 루프 뒤의 모든 명령문을 실행합니다.)
Listing 3을 쉽게 다시 작성할 수 있습니다 그래서 코드에는 continue 문이 없습니다. if 문 안에 "좋은 추측"코드를 넣어야하지만 괜찮습니다. continue 문은 Listing 3 프로그램의 모양을 개선하는 데별로 도움이되지 않습니다. 그러나 if 문 안에 코드를 중첩하지 않으려면 continue 문이 유용합니다. 아마도 응용 프로그램에서 루프의 나머지 부분은 복잡한 명령문 시퀀스 일 것입니다. 이 시퀀스를 if 문 안에 넣어서 복잡하게 보이게하고 싶지는 않습니다. 또는 응용 프로그램에서 나머지 루프를 건너 뛰는 경우는 거의없고 if 문에 루프의 나머지 부분을 포함시키지 않으므로이 희귀성을 강조하려고합니다. 두 경우 모두 continue 문이 올바른 선택 일 수 있습니다.