인간은 반복적인 작업을 잘하지 못한다. 실수하고, 지루해한다. 컴퓨터는 이런 반복적인 작업을 대행하기 위해서 만들어진 기계다. 인간이 하기 싫어하는 바로 그 일을 컴퓨터가 대신하도록 하는 것이 반복문(loop, iteration)이다.
조건분기와 반복 中
앞서 포스팅에서 반복문을 잠깐 다뤄봤지만, while문에 대해서 자세히 다뤄보지 않았다. 이번 포스팅에서는 자세히 다뤄보도록 하자.
반복문의 문법은 몇 가지가 있다.
각각의 구문은 서로 대체 가능하기 때문에 상황과 취향에 따라서 선택해서 사용하면 된다.
while(조건) { //언제까지 반복할 것이냐
반복 실행 영역
}
아래 예제를 보자
❗️주의
다음 예제는 무한 반복을 발생시킨다. 웬만하면 사용 금지!
public class WhileDemo {
public static void main(String[] args) {
while(true) {
System.out.println("Coding EveryBody");
}
}
}
이번에는 true를 false로 바꾼 아래의 예제를 실행해보자. 아래 코드는 아예 컴파일조차 되지 않을 것이다. 반복 조건이 false이기 때문에 반복문이 한 번도 실행되지 않을 것이기 때문에 컴파일러가 오류를 발생시키는 것이다. (실행)
while(false) { // 컴파일 X
System.out.println("Coding EveryBody") ;
}
✔️ while문
- 반복조건이 true면 중괄호 구간을 반복적으로 실행한다.
- 조건이 false면 반복문이 실행되지 않는다.
여기서 true와 false는 반복의 종료조건이 되는데, 반복문에서 종료조건을 잘못 지정하면 무한 반복이 되거나, 반복문이 실행되지 않는다.
int i = 0;
while(i < 10) {
System.out.println("Coding EveryBody" + i);
i++;
}
위의 반복문은 i의 값을 1씩 순차적으로 증가시킴으로써 반복의 지속 여부를 결정하고 있다.
while(i < 10)
i의 값이 10보다 작다면 true, 크다면 false가 된다.
현재int i = 0;
이기 때문에 이 반복문은 실행된다.
i++
i의 값에 1을 더한다.
반복문의 중괄호의 마지막 라인에 도달하면 반복문은 반복문을 재호출한다.
이때,i < 10
의 값을 검사하게 된다.
변수 i는 관습적으로 반복의 조건으로 사용하는 임의의 변수다.
변수 이름으로 다른 것을 사용해도 무방하다.
while문을 보면 반복의 횟수를 지정하기 위해서 while문 외부에 변수 i의 값을 초기화하고, while문 안에서 i의 값을 증가시키고 있다.
이것은 코드를 산만하게 할 수 있다.
반복문에서 자주 사용하는 이러한 패턴을 문법적인 형태로 만든 것이 for문이다.
for문은 특정한 횟수만큼 반복 실행을 하는 경우에 자주 사용된다.
하지만 for문이나 while문이나 서로 대체 가능하다. 취향에 따라서 선택하면 된다.
while과 for의 관계는 조건문으로 비유해서 생각해 볼 수도 있을 것 같다.
조건문의 핵심은 if이지만 연관된 로직들의 응집성을 높이기 위해서 else if, else 등이 도입된 것과 비슷한 관점으로 볼 수 있겠다. 이러한 방향성을 자신의 코드에도 적용 할 수 있도록 노력하자.
for(초기화; 종료조건; 반복샐행) {
반복적으로 실행될 구문
}
public class ForDemo {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("Coding Everybody " + i);
}
}
}
for문의 괄호 안에는 반복의 종료 조건이 들어온다.
종료 조건은 크게 3개의 부품으로 구성되는데 아래와 같다.
- 초기화 : 반복문이 실행될 때 1회 실행된다.
- 종료조건 : 초기화가 실행된 후에 종료조건이 실행된다. 종료조건의 값이 false일 때까지 반복문의 중괄호 구간의 코드가 반복 실행된다.
- 중괄호 구간의 실행이 끝나면 반복 실행이 실행된다. 일반적으로 이 곳에 i++와 같이 변수를 증가시키는 로직이 위치하고, 이것이 실행된 후에 종료조건이 실행된다. 종료조건이 false가 될 때까지 이 과정이 반복된다.
반복작업을 중간에 중단시키고 싶다면 어떻게 해야 할까?
break를 사용하면 된다.
public class BreakDemo {
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
if(i == 5) {
break;
}
System.out.println("Coding Everybody" + i);
}
}
}
[결과값]
coding everybody 0
coding everybody 1
coding everybody 2
coding everybody 3
coding everybody 4
종료조건에 따르면 10행이 출력돼야 하는데 5행만 출력되었다.
2행의 if(i == 5) 에 의해서 i의 값이 5일 때 break 문이 실행되면서 반복문이 완전히 종료된 것이다.
반복문 안에서 break가 실행되면 반복문을 즉시 종료시킨다.
그럼 실행을 즉시 중단하면서 반복은 지속해가게 하려면 어떻게 해야 할까?
public class ContinueDemo {
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
if(i == 5) {
continue;
}
System.out.println("Coding Everbody" + i);
}
}
}
[결과값]
Coding Everybody 0
Coding Everybody 1
Coding Everybody 2
Coding Everybody 3
Coding Everybody 4
Coding Everybody 6
Coding Everybody 7
Coding Everybody 8
Coding Everybody 9
숫자 5가 보이지 않는다. 왜 그럴까?
i의 값이 5가 되었을 때 실행이 중단됐기 때문이다.
continue 구문은 이 명령이 나타나는 이후의 로직을 실행하지 않도록 한다.
하지만 반복문 자체를 중단하는 것이 아니고 다시 반복문이 실행된다.
(해당 구문 건너뛰고 다시 실행)
반복문 안에는 다시 반복문이 나타날 수 있다.
public class LoopDepthDemo {
public static void main(Stirng[] args) {
for(int i = 0; i < 10; i++) {
for(int j = 0; j < 10; j++) {
System.out.println(i + "" + j);
}
}
}
}