for, while, do 문과 같은 반복문에서 continue, break 와 같은 문장을 사용 반복문의 수행을 제어할 수 있다. 앞서 switch 문을 다룰 때 switch 문을 빠져 나가는 데 break 문이 사용된다고 언급하였다. 반복문에서도 break 문은 반복구간을 빠져 나가는 데 사용된다. break 문이 반복구간 내부에서 사용되면 반복구간 내 break 이하의 코드들은 무시하고 반복구간을 빠져나가 반복구간 이하의 코드들을 수행하도록 한다. 따라서 조건식이 만족되어도 반복구간을 빠져나가고 싶다면 반복구간 내의 적당한 위치에 break 문을 위치시키면 된다. 반면 continue 문이 반복구간 내에서 사용되면 continue 이하의 코드들은 수행하지 않고 조건식으로 분기 참/거짓 결과에 따라 반복구간 수행 여부를 결정한다. 다음 순서도는 for, while, do 문에서 break, continue 문이 사용됐을 경우의 흐름을 보여주고 있다.

for문의 경우 반복구간 내부에서 break를 만나면 즉시 수행을 멈추고 반복구간을 빠져 나간다. 그어나 continue를 만나면 증감식을 수행하고 조건식의 결과에 따라 반복구간을 수행여부를 판단한다.

사용자 삽입 이미지

for 문에서의 break, continue의 제어흐름


반면 while과 do 반복문의 반복구간에서는 break의 경우 for 문에서와 같이 즉시 반복구간을 빠져 나가지만 continue의 경우 조건식으로 분기 조건식의 결과에 따라 반복구간 수행 여부를 결정한다.

사용자 삽입 이미지

while 문에서의 break, continue의 제어흐름

사용자 삽입 이미지

do 문에서의 break, continue의 제어흐름


다음 프로그램 "for-cb.jsp"는 for 반복문에서 break와 continue를 사용한 예이다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
int i;

for (i = -2; i <= 100; i ++) {
    if (i == 0) continue;
    if (i > 2) break;
    out.println( 100 / i );
}

out.println(i);
%>
</body>
</html>


사용자 삽입 이미지

for-cb.jsp 실행결과


우선 초기식, 조건식, 증감식을 고려했을 때 반복구간은 변수 "i"의 값이 -2에서 100까지 1씩 증가하며 총 103회 수행하도록 작성되었다. 그러나 변수 "i"의 값이 0이 되는 순간 continue를 수행하게 되므로 이하의 코드

if (i > 2) break;
out.println( 100 / i );

는 무시하고 증감식에 의해 "i" 가 1이 되고 계속 반복구간을 수행한다. 그리고 "i"가 3이 되면 break를 수행 반복구간을 빠져나간다.

다음 프로그램 "while-err-cb.jsp"를 살펴보자.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
int i;

i = -2;
while (i <= 10) {
    if (i == 0) continue;
    if (i > 2) break;
    out.println( 100 / i );
    i ++;
}

out.println(i);
%>
</body>
</html>


이 프로그램의 실행 결과는 무한루프에 빠지게 되는 오류를 가지고 있다. 그 원인은

if (i == 0) continue;

부분에서 비롯된다. 이 프로그램에서는 변수 "i"가 10 이하인 경우 반복구간을 수행한다. 그러나 "i"가 0이 됐을 경우를 살펴보자. "i"가 0이 되면 continue를 수행하게 된다. 따라서 continue에 의해 이하의 코드

if (i > 2) break;
out.println( 100 / i );
i ++;

은 실행되지 않고 조건식을 검사하게 되는데 이 때 여전히 "i"의 값은 0이므로 무한히 continue를 실행하게 되므로 무한루프에 빠지게 되는 것이다. 따라서 이 경우

if (i == 0) continue;

부분을 다음과 같이 수정하면 무한루프에 빠지는 오류를 수정할 수 있다.

if (i == 0) {
    i ++;
    continue;
}

이 경우 continue를 수행하기 전 "i ++"에 의해 "i" 값이 0에서 1로 변하므로 continue는 더 이상 실행하지 않게된다. 다음 프로그램 "while-cb.jsp"는 "while-err-cb.jsp" 프로그램을 올바르게 수정 실행한 것이다.


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
int i;

i = -2;
while (i <= 10) {
    if (i == 0) {
        i ++;
        continue;
    }
    if (i > 2) break;
    out.println( 100 / i );
    i ++;
}

out.println(i);
%>
</body>
</html>


사용자 삽입 이미지

while-cb.jsp 실행결과


다음 프로그램 "do-cb.jsp" 역시 do 문에서 break와 continue를 사용한 예다. 이 프로그램에서도 break와 continue의 제어흐름은 while 문과 같다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
int i;

i = -2;
do {
    if (i == 0) {
        i ++;
        continue;
    }
    if (i > 2) break;
    out.println( 100 / i );
    i ++;
} while (i <= 10) ;

out.println(i);
%>
</body>
</html>


사용자 삽입 이미지

do-cb.jsp 실행결과

'프로그래밍 > JSP' 카테고리의 다른 글

세션  (0) 2009.03.17
쿠키  (0) 2009.03.17
while, do 문  (0) 2009.03.09
for 문  (0) 2009.03.09
switch 문  (1) 2009.03.09
AND