이세개발
article thumbnail
Published 2023. 4. 16. 21:58
이것이java다 4.2 반복문 legacy

반복문은 어떤 작업(코드들)이 반복적으로 실행되도록 할 때 사용되며, 반복문의 종류로는 for문, while문, do-while문이 있다. for문과 while문은 서로 변환이 가능하기 때문에 반복문을 작성할 때 어느 쪽을 선택해도 좋지만 for문은 반복 횟수를 알고 있을때 주로 사용하고, while문은 조건에 따라 반복할 때 주로 사용한다. while문과 do-while문의 차이점은 조건을 먼저 검사하느냐 나중에 검사하느냐일 뿐 동작 방식은 동일하다.

 

 

1. for문

 

프로그램을작성하다 보면 똑같은 실행문을 반복적으로 실행해야 할 경우가 많이 발생한다. 다음 코드를 살펴보자.

--------------------------------------------------------------------------------------------------------

int sum = 0;

sum = sum + 1;

sum = sum + 2;

sum = sum + 3;

sum = sum + 4;

sum = sum + 5;

sum = sum + 6;

System.out.println("1~5까지의 합:" + sum);

-----------------------------------------------------------------------------------------------------------

상기 코드는 1부터 5까지의 합을 구하는 것으로 5개의 실행문으로 해결했다. 하지만 1부터 100까지의 합을 구하는 코드를 같은 방법으로 작성한다면 코드 양이 엄청 늘어난다. 100개의 지루한 실행문이 필요하기 떄문이다. 이런 경우 for문을 사용하면 코드를 획기적으로 줄여준다.

 

100개의 실행문을 단 3라인으로 압축한 것이라고 볼 수 있는데, 반복문은 한 번 작성된 실행문을 여러번 반복 실행해 주기 떄문에 코드를 절감하고 간결하게 만들어 준다. 코드가 간결하면 개발 시간을 줄일 수 있고 오류가 날 확률도 줄어든다. for문은 주어진 횟수만큼 실행문을 반복 실행할 때 적합한 반복 제어문이다. 다음은 for문의 형식과 실행 흐름을 도식화한 것이다.

 

for문이 처음 실행될 때 (1) 초기화식이 제일 먼저 실행된다. 그런 다음 (2) 조건식을 평가해서 ture이면 (3)실행문을 실행시키고, false이면 for문 블록을 실행하지 않고 끝나게 된다. 블록 내부의 (3) 실행문들이 모두 실행되면 (4) 중검삭울 실행시키고 다시 (2) 조건식을 평가하게 된다. 평가결과가 ture이면 (3)->(4) -> (2) 로 다시 진행하고, false이면 for문이 끝나게 된다. 다음은 가장 기본적인 for문의 형태로 1부터 10까지 출력하는 코드이다.

 

------------------------------[ ForPrintFrom1ToExample.java ] 1부터 10까지 출력------------------------------------------------------------------

package sec03.exam01_for;

 

public class ForPrintFrom1To10Example {

public static void main(String[] args) {

for(int i=1; i<=10; i++) {

System.out.println(i);

}

}

}

----------------------------------------------------------------------------------------------------------------------------------------------------------------

Console

1

2

3

......~

10

----------------------------------------------------------------------------------------------------------------------------------------------------------------

초기화식의 역할은 조건식과 실행문 증감식에서 사용할 변수를 초기화하는 역할을 한다. 초기화식이 필요없을 경우에는 다음과 같이 초기화식을 생략할 수 있다.

------------------------------------------

int i = 1;

for (; i<=100; i++) { ~~~~ }

-------------------------------------------

어떤 경우에는 초기화식이 둘 이상이 있을 수도 있고, 증감식도 둘 이상이 있을 수 있다. 이런 경우에는 쉼표(,)로 구분해서 작성하면 된다.

---------------------------------------------------------------------------

for(int i = 0 , j = 100; i<=50 && j>=50; i++, j--) {~~~~}

          초기화식          조건식             증감식

---------------------------------------------------------------------------

초기화식에 선언된 변수는 for 문 블록 내부에서 사용되는 로컬 변수이다. 따라서 for문을 벗어나서는 사용할 수 없다. 다음 예제는 1부터 100까지의 합을 구하는 코드이다. 변수 sum을 for문이 시작하기 전에 선언한 이유는 for문을 끝내고 9라인에서 sum을 사용하기 때문이다.

 

------------------------------[ ForSumFrom1to100Example.java ] 1부터 100까지의 합을 출력--------------------------------------------------------------

package sec03.exam01_for;

public class ForSumFrom1To100Example {

public static void main(String[] args) {

/*

int sum = 0; 

 

for(int i=1; i<=100; i++) {

sum += i;

}

 

System.out.println("1~100 합 : " + sum);

*/

 

int sum = 0; 

 

int i = 0;

for(i=1; i<=100; i++) {

sum += i;

}

 

System.out.println("1~" + (i-1) + " 합 : " + sum);

}

}

-----------------------------------------------------------------------------------------------------------------------------------------

Console

1~100 합 : 5050

----------------------------------------------------------------------------------------------------------------------------------------

/*

int sum = 0; 

 

for(int i=1; i<=100; i++) {

sum += i;

}

 

System.out.println("1~" + (i-1) + " 합 : " + sum);

*/

-------------------------------------------------------------------------------------------------------------------------

이 부분을 컴파일한다면 에러가 발생하게 된다. 그 이유는  System.out.println("1~" + (i-1) + " 합 : " + sum);   이부분에서 i 는 for문을 벗어나서는 사용할 수 없기 때문이다.

 

for문을 작성할 때 주의할 점은 초기화식에서 루프 카운트 변수를 선언할 때 부동소수점 타입을 사용하지 말아야 한다. 다음 예를 보자. 이론적으로 3라인의 for문은 10번 반복해야 한다.

 

-------------------------[ ForFloatCountExample.java ] float타입 카운터 변수---------------------------------------------------------

package sec03.exam01_for;

public class ForFloatCounterExample {

public static void main(String[] args) {

for(float x=0.1f; x<=1.0f; x+=0.1f) {

System.out.println(x);

}

}

}

------------------------------------------------------------------------------------------------------------------------------------------

Console

0.1

0.2

0.3

0.4

0.5

0.6

0.70000005

0.8000001

0.9000001

-----------------------------------------------------------------------------------------------------------------------------------------------

하지만, 0.1 은 float타입으로 정확하게 표현할 수 없기 때문에 x에 더해지는 실제값은 0.1보다 약간 크다. 결국 루프는 9번만 실행된다.

for문은 또 다른 for문을 내포할 수 있는데, 이것을 중첩된 for 문이라고 한다. 이 경우 바깥쪽 for문이 한 번 실행할 때마다 중첩된 for문은 지정된 횟수만큼 반복해서 돌다가 다시 바깥쪽 for 문으로 돌아간다. 다음 예제는 구구단을 출력하는 코드이다.

------------------------------------[ forMultiplicationTableExample.java ] 구구단 출력하기 ------------------------------------------------------------

package sec03.exam01_for;

public class ForMultiplicationTableExample {

public static void main(String[] args) {

for (int m=2; m<=9; m++) {

System.out.println("*** " + m + "단 ***");

for (int n=1; n<=9; n++) {

System.out.println(m + " x " + n + " = " + (m*n));

}

}

}

}

------------------------------------------------------------------------------------------------------------------------------------------------------------------

Console

*** 2단 ***

2 x 1 = 2

2 x 2 = 4

2 x 3 = 6

2 x 4 = 8

2 x 5 = 10

2 x 6 = 12

~~~~

9 x 9 = 91

----------------------------------------------------------------------------------------------------------------------------------------------------------------

3라인 바깥쪽 for문은 m 이 2에서 9 까지 변하면서 8번 반복 실행되는데, 바깥쪽 for문이 한번 실행할 떄마다 5라인의 중첩for문은 n이1에서9까지 변하면서 9 번 반복 실행한다. 즉 m=2일 때 n은 1~9까지 변하면서 2 x n = 2*n 을 출력하게 된다.

 

 

 

 

 

2. while문

 

for문이 정해진 횟수만큼 반복한다면, while문은 조건식이 ture일 경우에 계속해서 반복한다. 조건식에는 비교 또는 논리 연산식이 주로 오는데, 조건식이 false가 되면 반복 행위를 멈추고 while문을 종료한다. 다음은 while문을 작성하는 형식과 실행 흐름을 보여준다.

while문이 처음 실행될 때 (1)조건식을 평가한다. 평가 결과가 ture이면 (2) 실행문을 실행한다. (2) 실행문이 모두 실행되면 다시 조건식으로 되돌아가서 (1) 조건식을 다시 평가한다. 만약 조건식이 ture 라면 (2)->(1)로 다시 진행하고, false라면 while 문을 종료한다. 다음 예제는 가장 간단한 형태의 while 문으로 1부터 10까지 출력한다. while문은 한 번 실행할 때 i 값을 출력하고 i 를 1 증가시킨다. 조건문이 i가 10이하일 떄까지 ture가 되므로 while문은 총 10번 반복 실행한다.

 

---------------------------------------[ WhilePrintFrom1To10Example.java ] 1 부터 10까지 출력-----------------------------------------------------------

package sec03.exam02_while;

public class WhilePrintFrom1To10Example {

public static void main(String[] args) {

int i = 1;

while (i<=10) {

System.out.println(i);

i++;

}

}

}

--------------------------------------------------------------------------------------------------------------------------------------------

Console

1

2

3

4

5

6

7

8

9

10

---------------------------------------------------------------------------------------------------------------------------------------------

 

이번에는 1~100까지의 합을 구하기위해 for문 대신 while문을 사용해 보자. while 문 내에서 계속 누적되는 값을 갖는 변수는 while문 시작 전에 미리 선언해 놓아야 한다.

 

--------------------------------[ WhileSumFrom1To100Example.java ] 1부터 100까지 합을 출력---------------------------------------------------

package sec03.exam02_while;

public class WhileSumForm1To100Example {

public static void main(String[] args) {

int sum = 0; 

int i = 1;

 

while(i<=100) {

sum += i;

i++;

}

 

System.out.println("1~" + (i-1) + " 합 : " + sum);

}

}

------------------------------------------------------------------------------------------------------------------------------------------------------

Console

1~100 합 : 5050

-------------------------------------------------------------------------------------------------------------------------------------------------------

 

조건식에는 boolean 변수나 ture/false값을 산출하는 어떠한 연산식이든 올 수 있다. 만약 조건식에 ture를 사용하면 while(ture) {~} 가 되어서 무한 루프를 돌게 된다. 무한 루프는 무한히 반복하여 실행하기 때문에 언젠가는 while문을 빠져나가기 위한 코드가 필요하다. 다음예제는 키보드에서 1,2 를 입력했을 때 속도를 증속 감속시키고, 3을 입력하면 프로그램을 종료시킨다. 먼저 키보드에서 입력된 키가 어떤 키인지 확인하는 방법부터 알아보자. 다음 코드는 키보드로부터 입력된 키 코드를 리턴한다.

--------------------------------------

int keyCode = System.in.read();

---------------------------------------

1은 49번, 2는 50번, 3은 51번이고, Enter키는 13번과 10번에 해당하는등, 이제 소스를 보면 while문의 조건식에 run 이라는 boolean타입의 변수를 사용했다. 변수 run의 초기값은 ture이므로 while문은 무한 루프를 돌게 된다. 그래서 while 문을 종료시키기 위해(빠져 나가기 위해) 키보드로 3번을 입력하여 변수 run의 값을 false로 만들었다. 2라인의 main()메소드 끝에 throwsException이 붙어 있는데 이것은 System.in.read() 메소드에 대한 예외 처리 코드이다. 지금은 이해하려고 하지 말고 무조건 붙여주도록 하자.

 

-----------------------------------------[ WhileKeyControlExample.java ] 키보드로 while문 제어--------------------------------------------

package sec03.exam02_while;

public class  WhileKeyControlExample {

public static void main(String[] args) throws Exception {

boolean run = true;

int speed = 0;

int keyCode = 0;

 

while(run) {

if(keyCode!=13 && keyCode!=10) {

System.out.println("-----------------------------");

System.out.println("1.증속 | 2.감속 | 3.중지");

System.out.println("-----------------------------");

System.out.print("선택: ");

}

 

keyCode = System.in.read();

 

if (keyCode == 49) { //1

speed++;

System.out.println("현재 속도=" + speed);

} else if (keyCode == 50) { //2

speed--;

System.out.println("현재 속도=" + speed);

} else if (keyCode == 51) { //3

run = false;

}

}

 

System.out.println("프로그램 종료");

}

}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

Console

1 , 2 , 3 순차 입력

-----------------------------

1.증속 | 2.감속 | 3.중지

-----------------------------

선택: 1

현재 속도=1

-----------------------------

1.증속 | 2.감속 | 3.중지

-----------------------------

선택: 2

현재 속도=0

-----------------------------

1.증속 | 2.감속 | 3.중지

-----------------------------

선택: -----------------------------

1.증속 | 2.감속 | 3.중지

-----------------------------

선택: 3

프로그램 종료

----------------------------------------------------------------------------------------------------------------------------------------------------------------

1이나 2일때는  계속 반복되고 3을 입력되었을 때는 변수 run이 false가 되어 while문이 종료되고 프로그램이 종료되는 반복문을 만들어 보았다.

 

무한루프는 무한히 반복해서 실행하기 때문에 언젠가는 while 문을 빠져나가기 위한 코드가 필요하다. while 문을 빠져나가기 위한 또 다른 방법으로 break문을 이용하는 방법도 있다. break문은 조금 후에 설명이 나온다. 이번 예제에서는 System.out.println() 메소드는 매개값을 출력하고 다음 행으로 이동하지만 System.out.print() 메소드는 매개값을 출력만하고 다음행으로 이동하지 않는다. 이렇게 해야 "선택 : " 바로뒤에 숫자를 쓸 수 있게 만들수 있다. 그렇지않는다면 " 선택 : "

                                      1          이런식으로 쓰게 될것이다.

 

3. do-while 문

 

do-while문은 조건식에 의해 반복 실행한다는 점에서는 while 문과 동일하다. while 문은 시작할 떄부터 조건식을 검사하여 블록 내부를 실행할 지 결정하지만 경우에 따라서는 블록 내부의 실행문을 우선 실행시키고 실행결과에 따라서 반복 실행을 계속 할지 결정하는 경우도 발생한다. 이때 do-while 문을 사용할 수 있다. 예를 들어 키보드로 입력받은 내용을 조사하여 계속 루프를 돌 것인지를 판단하는 프로그램이 있다고 가정하자. 조건식은 키보드로 입력받은 이후에 평가되어야 하므로, 우선적으로 키보드로부터 입력된 내용을 받아야 한다.

다음은 do-while문의 작성 형식과 실행 흐름을 보여준다. 작성 시 주의할 점은 while() 뒤에 반드시 세미콜론(;) 을 붙여야 한다. do-while문이 처음 실행될 때 (1) 실행문을 우선 실행한다. (1) 실행문이 모두 실행되면 (2)조건식을 평가하는데, 그 결과가 ture이면 (1)->(2)와 같이 반복 실행을 하고,조건식의 결과가 false이면 do-while 문을 종료한다.

이번 예제는 키보드로부터 문자열을 입력받고 출력 시킨다. 먼저 콘솔에서 입력한 문자열을 읽는 방법에 대해 알아보자. System.in.read()메소드는 하나의 키 코드만 읽기 때문에 콘솔에 입력된 문자열을 한 번에 읽을 수 없다. 대신 다음과 같이 Scanner 객체를 생성하고 nextLine() 메소드를 호출하면 콘솔에 입력된 문자열을 한 번에 읽을 수 있다. nextLine() 메소드로 읽은 문자열을 저장하기 위해서는 String 변수가 필요한데 아래 코드에서는 inputString 변수에 저장했다.

--------------------------------------------------------------------------------------------------------

Scanner scanner = new Scanner(System.in);             //Scanner 객체 생성

String inputString = scanner.nextLine();                  //nextLine() 메소드 호출

------------------------------------------------------------------------------------------------------

이제 예제 소스를 보자. Scanner를 사용하려면 1라인에 있는 import문이 필요하다. 이것에 대한 설명은 6장에서 설명되니 그냥 넘어간다. 8라인에서 Scanner를 생성했고, 13라인에서 nextLine() 메소드로 문자열을 읽는다. 읽은 문자열은 14라인에서 다시 콘솔에 출력된다. 11~15라인이 do-while문인데, 처음 실행 한 번 후 15라인의 조건식이 ture일 경우 반복 실행한다. 15라인의 조건식을 분석해보자.

-------------------------------------------------------------------------------------------

! inputString.equals("q")

-------------------------------------------------------------------------------------------

!은 논리 부정 연산자로 inputString.equals("q") 가 리턴한 boolean 값을 반대로 바꾼다. equals() 메소드는 문자열이 서로 같은지 비교하는 역할을 한다. 즉 inputString 변수의 문자열과 "q" 가 같으면 ture를 리턴하고, 그렇지 않으면 false 를 리턴한다. 결국 전체 조건식은 inputString에 "q" 가 저장되어 있으면 false가 산출되어 do-while문을 종료한다.

------------------------------------------[ DoWhileExample.java ] do-while문---------------------------------------------------------------------------- 

import java.util.Scanner;

 

public class  DoWhileExample {

public static void main(String[] args) {

System.out.println("메시지를 입력하세요");

System.out.println("프로그램을 종료하려면 q를 입력하세요.");

 

Scanner scanner = new Scanner(System.in);

String inputString;

 

do {

System.out.print(">");

inputString = scanner.nextLine();

System.out.println(inputString);

} while( ! inputString.equals("q") );

 

System.out.println();

System.out.println("프로그램 종료");

}

}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Console

메시지를 입력하세요

프로그램을 종료하려면 q를 입력하세요.

>das

das

>q

q

 

프로그램 종료

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

4. break문

 

break문은 반복문인 for문, while문, do-while문을 실행 중지할 때 사용된다. 또한 이전에 학습한 switch문에서도 break문을 사용하여 switch문을 종료한다. 다음은 반복문에서 break문을 사용할 때의 실행 흐름을 보여준다.

break문은 대개 if문과 같이 사용되어 if문의 조건식에 따라 for문과 while문을 종료할 때 사용한다. 다음 예제는 while문을 이용해서 주사위 번호 중 하나를 반복적으로 뽑되, 6이 나오면 while문을 종료시킨다.

--------------------------------------------------[ BreakExample.java ] break로 while문종료--------------------------------------------------------

package sec03.exam04_break;

 

public class  BreakExample {

public static void main(String[] args) throws Exception {

while(true) {

int num = (int)(Math.random()*6) + 1;

System.out.println(num);

if(num == 6) {

break;

}

}

System.out.println("프로그램 종료");

}

}

---------------------------------------------------------------------------------------------------------------------------------------------------------

Console

2

5

5

1

6

프로그램 종료

----------------------------------------------------------------------------------------------------------------------------------------------------------
만약 반복문이 중첩되어 있을 경우 break문은 가장 가까운 반복문만 종료하고 바깥쪽 반복문은 종료시키지 않는다. 중첩된 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 이름(라벨)을 붙이고, "break 이름:" 을 사용하면 된다.

 

다음 예제를 보면 바깥쪽 for문은 'A'~'Z' 까지 반복하고, 중첩된 for문은 'a'~'z' 까지 반복하는데, 중첩된 for문에서 lower변수가 'g' 를 갖게 되면 바깥쪽 for문까지 빠져나오도록 했다.

 

------------------------------------------[ BreakOutterExample.java ] 바깥쪽 반복문 종료-------------------------------------------------------------------

package sec03.exam04_break;

 

public class  BreakOutterExample {

public static void main(String[] args) throws Exception {

Outter: for(char upper='A'; upper<='Z'; upper++) {

for(char lower='a'; lower<='z'; lower++) {

System.out.println(upper + "-" + lower);

if(lower=='g') {

break Outter;

}

}

}

System.out.println("프로그램 실행 종료");

}

}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

Console

A-a

A-b

A-c

A-d

A-e

A-f

A-g

프로그램 실행 종료

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

5. continue문

 

continue문은 반복문인 for문, while문 do-while문에서만 사용되는데, 블록 내부에서 continue문이 실행되면 for문의 증감식 또는 while문, do-while문의 조건식으로 이동한다. 다음은 continue문의 실행 흐름을 보여준다.

countinue 문은 반복문을 종료하지 않고 계속 반복을 수행한다는점이 break문과 다르다. break문과 마찬가지로 continue문도 대개 if문과 같이 사용되는데, 특정 조건을 만족하는 경우에 continue문을 실행해서 그 이후의 문장을 실행하지 않고 다음 반복으로 넘어간다. 다음 예제는 1에서 10사이의 수 중에서 짝수만 출력하는 코드이다.

 

 

-------------------------------------[ ContinueExample.java ] continue를 사용한 for문-------------------------------------------------------------------------

package sec03.exam05_continue;

public class  ContinueExample {

public static void main(String[] args) throws Exception {

for(int i=1; i<=10; i++) {

if(i%2 != 0) {

continue;

}

System.out.println(i);

}

}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------

Console

2

4

6

8

10

-------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

profile

이세개발

@print(name)

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!