BLOG ARTICLE 이클립스 | 30 ARTICLE FOUND

  1. 2009.03.17 세션
  2. 2009.03.17 쿠키
  3. 2009.03.12 HTTP 접속
  4. 2009.03.09 continue, break 문 1
  5. 2009.03.09 while, do 문

세션

프로그래밍/JSP 2009. 3. 17. 15:10
세션은 서버가 저장 관리하는 웹프로그램의 실행에 필요한 정보로 쿠키와 같은 목적으로 사용되나 필요한 정보를 클라이언트가 아닌 서버가 가지고 있다는 점에서 차이가 있다. 세션은 다음과 같은 처리과정을 거친다.

우선 세션아이디라 불리는 연결과 관련된 고유값 생성하고 "JSESSIONID"라는 쿠키이름과 세션아이디를 쿠키값으로 가지는 쿠키의 생성과 동시에 서버에 세션아이디로 구분할 수 있는 저장공간 생성한 후 setAttribute 메소드에 의해 만들어진 세션정보를 생성된 공간에 저장한다. 그 후 해당 클라이언트로부터 접속이 이루어지면 해당 클라이언트는 "JSESSIONID"/"세션아이디"의 쌍으로 이루어진 쿠키 정보도 함께 전달한다. 그러면 서버는 이 쿠키정보로부터 전달된 세션아이디를 추출 이와 관련된 저장공간으로부터 세션정보를 읽는다.

JSP에서 세션은 session 객체에 의해 처리된다. seession 객체에서 사용되는 중요 메소드는 다음과 같다.

 Method

 설명

 String getId()

 현재 사용자의 고유한 세션id를 반환받음

 boolean isNew()

 사용자 컴퓨터에 세션 ID의 존재 여부를 반환 (만들어지지 않은 경우 true)

 void setMaxInactiveInterval(time)

 세션의 지속 시간을 초 단위로 결정

 Int getMaxInactiveInterval()

 현재 설정된 세션의 지속 시간을 초로 환산

 void setAttribute(string name, object value)

 현재 세션에 새로운 이름과 값의 속성을 저장

 Enumeration getAttributeNames()

 현재 세션에 저장된 모든 속성들의 이름을 Enumeration 형으로 반환

 void invalidate()

 현재 세션에 저장된 모든 속성을 삭제


세션 설정

세션의 설정은 session 객체의 setAttribute 메소드를 이용하며, 쿠키와 마찬가지로 "세션이름"/"세션값"의 쌍으로 생성된다.

다음 프로그램 "addSession.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>
<%
String id = "lovejsp";
String pass = "1234";
session.setAttribute("sid", id);
session.setAttribute("spass", pass);
%>
세션을 설정했습니다.
</body>
</html>

사용자 삽입 이미지

addSession.jsp 실행결과



위 프로그램에서는 session.setAttribute 메소드를 이용 "sid"와 "spass"라는 세션이름에 각각 세션값  "lovejsp"와 "1234"의 쌍을 이루어 지정하였다. 이 정보는 서버의 어딘가에 고유세션아이디와 관련된 영역을 만들어 저장된다.

세션 읽기

지정된 세션은 session 객체의 getAttribute 메소드를 이용 프로그램에서 활용할 수 있다. 이 메소드에서 필요한 파라메터는 세션지정시 설정된 세션이름으로 이름과 연관되어 저장된 값을 얻을 수 있다. 다음 프로그램 "getSession.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>
세션아이디 <%= session.getId() %>
<br />
<%
String myid = (String)session.getAttribute("sid");
String mypass = (String)session.getAttribute("spass");
%>
아이디는 <%=myid%> 이고, 비밀번호는 <%=mypass%> 입니다.
</body>
</html>

사용자 삽입 이미지

getSession.jsp 실행결과



위 프로그램은 세션이름 "sid"와 "spass"에 저장된 값을 읽어 출력하고 있다. 따라서 프로그램 "addSession.jsp"에 의해 각각 값이 "lovejsp", "1234"가 저장되었으므로 위 프로그램의 출력 역시

"아이디는 lovejsp 이고 비밀번호는 1234 입니다"

가 출력된다. 만약 브라우저가 실행된 후 "addSesseio.jsp"가 실행되지 않고 바로 "getSession.jsp"가 실행되었다면 세션이름 "sid"와 "spass"로 서버에 저장된 값이 없으로므 그 결과는 다음과 같이 해당 값이 null로 처리되어 출력된다.

여기서 "JSESSIONID" 이름의 쿠키와 현재 세션아이디를 반환하는 session 객체의 getId의 결과를 프로그램 "SessionID.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>
세션아이디 : <%= session.getId() %>
<br/><br/>
<table border="1">
<tr>
<td>쿠키이름</td>
<td>쿠키값</td>
<%
    Cookie [] cookie = request.getCookies();
   
    for(int i = 0; i < cookie.length; i++)
    {
%>
    <tr>
    <td><%=cookie[i].getName()%></td>
    <td><%=cookie[i].getValue()%></td>
    </tr>
<%
    }
%>
</table>
</body>
</html>

사용자 삽입 이미지

sessionID.jsp 실행결과


위 프로그램의 결과를 살펴보면 session.getId()에 의해 얻어진 값과 쿠키이름 "JSESSIONID"에 저장된 쿠키값이 일치함을 알 수 있다. 결과적으로 "JSESSIONID"에 저장된 쿠키값이 세션아이며 클라이언트에서 전달된 이 세션아이디를 통해 서버에 저장된 관련 세션정보를 찾게된다.

세션삭제

세션아이디는 기본적으로 한번 지정된 후 브라우저가 종료될 때까지 유지되었다가 브라우저 종료 후 새로 실행되면 새로운 세션아이디가 부여된다. 그러나 session.invalidate() 메소드를 이용하면 브라우저를 종료하지 않고 새로운 세션아이디를 부여할 수 있다. 다음 프로그램 "delSession.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>
<% session.invalidate(); %>
기존 세션아이디 <%= session.getId() %>를 삭제하고 새로운 세션아이디를 부여했습니다.
</body>
</html>

사용자 삽입 이미지

addSession.jsp 실행결과

사용자 삽입 이미지

getSession.jsp 실행결과

사용자 삽입 이미지

delSession.jsp 실행결과

사용자 삽입 이미지

delSession.jsp 실행 후 getSession.jsp 실행결과


위 프로그램은 session.invalidate() 메소드에 의해 새로운 세션아이디를 부여한다. 그러므로
"addSession.jsp", "getSession.jsp", "delSession.jsp", "getSession.jsp"을 순서대로 실행하면 맨 마지막 실행한 "getSession.jsp"의 세션아이디가 새롭게 부여되어 변경되었음을 확인할 수 있으며, 이에 따라 새로 부여된 세션아이디로 지정된 "sid"와 "spass"값은 없으므로 null로 출력된다.

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

쿼리스트링(Query String)  (2) 2009.03.18
쿠키 및 세션을 이용한 카운터  (0) 2009.03.17
쿠키  (0) 2009.03.17
continue, break 문  (1) 2009.03.09
while, do 문  (0) 2009.03.09
AND

쿠키

프로그래밍/JSP 2009. 3. 17. 12:28
앞서 여행사를 통한 항공편 예약에서 설명한 바와 같이 쿠키(Cookie)는 지속적으로 필요한 사용자의 정보를 저장하기위해 사용되는 기술로 다음과 같은 특징으로 설명할 수 있다.

    웹프로그램의 실행에 필요한 정보로 클라이언트-서버 사이에서 지속적으로 관리가 필요한 정보
    서버의 필요에 의해 서버가 주체가 되어 지정되는 정보
    클라이언트(브라우저)에서 보관되고 http 접속 시 자동으로 서버로 보내지는 작은 용량의 정보

JSP에서 쿠키는 Cookie 클래스 및 request 객체와 response 객체에 의해 만들어지고 이용된다. 다음은 request 객체와 response 객체에서 쿠키와 관련된 클래스 및 메소드를 정리한 것이다.

 Method

 설   명

 Cookie(String name, String value)

 이름과 값을 가지고 쿠키 객체를 생성한다

 setValue(String value)

 쿠키의 값을 설정한다

 setMaxAge(int expiry)

 쿠키의 유효시간을 설정한다.

 setPath(String dir)

 쿠키를 전송할 경로를 설정한다.

 setDomain(String addr)

 쿠키를 전송할 도메인을 설정한다.

 getName()

 브라우저에서 전송된 쿠키의 이름을 얻는다.

 getValue()

 브라우저에서 전송된 쿠키의 값을 얻는다.


 Method

 설   명

 response.addCookie(Cookie cookie)

 생성된 쿠키를 브라우저에 전송해 저장하도록 한다.

 request.getCookies()

 브라우저에서 전송된 쿠키 정보를 이용 쿠키객체를 생성한다.


쿠키 설정

쿠키는 서버에 의해 설정된다. 쿠키는 Cookie 클래스에 의해 생성되고 생성된 쿠키 객체는 response 객체의 addCookie 메소드에 의해 클라이언트(브라우저)에 전송되고 전송된 쿠키객체의 정보는 클라이언트에 저장되어 해당 서버에 http 접속 시 자동으로 쿠키 정보가 서버로 전달된다.

형식

Cookie cookie = new Cookie(cookie_name, cookie_value);
response.addCookie(cookie);

위 형식에서 쿠키객체는 Cookie 클래스의 생성자 Cookie에 의해 생성된다. 이 때 필요한 파라메터로 쿠키이름(cookie_name)과 쿠키값(cookie_value)이 요구된다. 두 파라메터 모두 클래스 String 형식이다. 생성된 쿠키 쿠키이름과 쿠키값의 쌍을 이루며 response.addCookie 메소드에 의해 클라이언트로 전달해야 한다. 이렇게 함으로써 다음 접속부터 클라이언트로부터 쿠키 정보를 받을 수 있다. 다음 프로그램 "addCookie.jsp"는 쿠키를 설정하는 예를 보여주고 있다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page import = "java.util.Date"%>
<!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>
<%
    String name = "time";
    Date date = new Date();
    String value = date.toString();

    Cookie cookie = new Cookie(name, value);
    response.addCookie(cookie);
%>
쿠키 설정을 했습니다.
</body>
</html>

사용자 삽입 이미지

addCookie.jsp 실행결과


위 프로그램에서 String 캑체 name과 Date 객체 date에 각각 "time"과 Date 객체가 생성된 당시의 날짜와 시각이 저장되어 있다. 그리고 String 객체 value에 date 객체의 날짜와 시각을 String 형으로 변환하여 저장하고 있다. 그런 다음 Cokkie 객체 cookie를 쿠키이름과 쿠키값의 쌍으로 생성하고 생성된 Cookie 객체 cookie를 response 객체의 addCookie 메소드를 이용 클라이언트에 전달 저장하도록 하고 있다. 참고로 프로그램에서 사용된 value 객체는 Cookie 생성 시 필요한 두 개의 파라메터(쿠키이름, 쿠키값)가 모두 String 형식이므로 date 객체를 직접 두 번째 파라메터로 지정할 수 없기 때문이다.

쿠키 읽기

지정된 쿠키는 서버로 접속할 때 클라이언트로부터 자동으로 전달된다고 했다. 그러면이 쿠키는 어떻게서버에서 처리할까? 이는Cookie객체의 getCookies 메소드를 이용 처리할 수 있다. 다음 프로그램 "getCookies.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>
<table border="1">
<tr>
<td>쿠키이름</td>
<td>쿠키값</td>
<%
    Cookie [] cookie = request.getCookies();
   
    for(int i = 0; i < cookie.length; i++)
    {
%>
    <tr>
    <td><%= cookie[i].getName() %></td>
    <td><%= cookie[i].getValue() %></td>
    </tr>
<%
    }
%>
</table>
</body>
</html>

사용자 삽입 이미지

getCookies.jsp 실행결과


위 프로그램에서 request.getCookies()는 클라이언트로부터 서버로 전달된 쿠키이름과 쿠키값의 쌍으로 이루어진 모든 쿠키정보를 읽는다. 그러므로 읽어온 쿠키정보를 프로그램에서 이용하려면 Cookie 클래스에 의해 생성된 객체에 저장해야 한다. 위 프로그램에서는 클라이언트로부터 전달된 모든 쿠키 정보를 저장하기 위해 Cookie 배열을 이용해 저장하고 있다. 쿠키정보는 이름과 값의 쌍을 이루고 있다고 했으므로 각 정보는 getName() 메소드와 getValue 메소드를 이용하면 얻을 수 있으며, 위 프로그램에서는 이 두 메소드를 이용 그 값을 출력하고 있다.

그러나 위 프로그램을 실행했을 때 다음과 같이 오류가 발생할 수 있다.

사용자 삽입 이미지

getCookies.jsp 실행오류


이런 오류가 발생하는 이유는 클라이언트에서 서버로 전달된 쿠키가 없기 때문으로 브라우저를 띄우고 처음으로 실행한 프로그램이 "getCookies.jsp" 일 때 발생한다. 따라서 클라이언트에서 전달된 쿠키를 읽기위한 메소드 getCookies는 반드시 이 메소드가 실행되기 전에 쿠키가 지정되어 있어야 한다.

쿠키 삭제

클라이언트에 저장된 쿠키는 기본적으로 브라우저가 서버로부터 쿠키 정보를 받은 후에 브라우저가 종료되기 전까지 저장되어 있다가 브라우저가 종료되면 삭제된다. 그러나 브라우저가 종료되기 전 필요에 의해 삭제하려면 어떻게 할까? 이것은 Cookie 클래스의  setMaxAge 메소드를 이용 크라이언트에 저장된 쿠키를 삭제할 수 있다. setMaxAge 메소드는 쿠키자 유지되는 시간을 지정하는 함수로 값을 0으로 설정하면 쿠키가 삭제된다.

다음 프로그램 "delCookies.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>
<%
Cookie [] cookie = request.getCookies();
for(int i = 0; i < cookie.length; i ++) {
    cookie[i].setMaxAge(0);
    response.addCookie(cookie[i]);
}
%>
설정된 모든 쿠키를 삭제했습니다.
</body>
</html>

사용자 삽입 이미지

delCookies.jsp 실행결과


위 프로그램은 request.getCookies() 메소드를 이용 클라이언트로부터 전달된 모든 쿠키를 읽은 후 각 쿠키의 지속시간을 setMacAge(0)에 의해 0으로 설정하고 클라이언트에 다시 지정함으로써 클라이언트가 쿠키정보를 삭제하도록 하고있다. "AddCookie.jsp"와 "delCookies.jsp"를 차례로 실행한 후 "getCookies.jsp"를 실행하면 다음과 같은 결과를 얻는다.

사용자 삽입 이미지

delCookie.jsp 실행 후 getCookies.jsp 결과


위 결과에서 살펴보면 "addCookie.jsp"에서 설정된 "쿠키이름/쿠키값"의 쌍인 "time"/"설정시각"은 "del.Cookies.jsp"에 의해 삭제되었음을 확인할 수 있다. 그러나 쿠키이름이 "JSESSIONID"과 관련된 항목은 뒤에 배울 세션과 관련된 쿠키 정보로 Tomcat과 같은 JSP 컨테이너에 자동으로 생성되는 정보이므로 삭제되지 않는다.

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

쿠키 및 세션을 이용한 카운터  (0) 2009.03.17
세션  (0) 2009.03.17
continue, break 문  (1) 2009.03.09
while, do 문  (0) 2009.03.09
for 문  (0) 2009.03.09
AND

HTTP 접속

홈페이지/HTML 2009. 3. 12. 19:58
쿠키와 세션을 공부하기 전에 다음의 경우를 생각해 보자. 우리가 전화로 여행사를 통하여 항공기 좌석을 예약한다고 가정하자. 우선 항공기 예약을 하려면 통화 중인 여행사 직원에게 원하는 날짜 및 시간, 목적지 등과 함께 자신의 간단한 신상을 제공할 것이다. 그러면 여행사 측에서 고객에게 예약번호를 부여한 후 항공기 예약을 완료하게 되고 전화를 끊는다. 그러나 사정이 생겨 후에 예약 내용을 변경하거나 취소 하려면 여행사에 전화를 걸어 자신의 예약번호 또는 이름, 주민등록번호와 같이 자신이 누구임을 밝힐 수 있는 정보를 고객이 여행사에 먼저 알려 줘야 한다. 그래야 항공기의 예약을 변경 또는 취소할 수 있기 때문이다. 만약 여행사에 전화를 걸어 예약과 관련된 정보(예약번호, 이름, 주민등록번호 등)를 알려주지 않고 무작정 예약을 변경 또는 취소한다고 하면 여행사 직원은 너무나도 당연한 얘기지만 올바른 처리를 할 수 없을 것이다.


사용자 삽입 이미지

항공편 예약 처리 과정


사용자 삽입 이미지

예약항공편 변경 처리 과정



http 접속은 사용자(클라이언트 또는 웹브라우저)로부터 웹 서버로 접속 요구가 시작되면 서버가 접속을 요구한 클라이언트로 데이터(일반적으로 HTML)를 보내기위해 연결을 설정한다. 그 후 데이터를 전송하고 데이터가 전송되면 그 연결을 지속적으로 유지하지 않고 자동으로 끊는다. 그 후 서버는 또 다른 접속 요구를 기다리고 위와 같은 방법으로 다른 클라이언트로부터의 접속요청을 처리한다. 다음 그림은 http 접속 과정을 나타낸 것이다.

사용자 삽입 이미지

http 접속 절차


이 방법은 연결이 지속적으로 유지되는 것에 비해 서버 및 네트워크의 부하를 많이 줄일 수 있지만 서버와 클라이언트 사이에 지속적인 정보를 유지하기가 어렵다.

Daum(http://www.daum.net)을 예를 들어보자. Daum에서 웹메일을 이용하기 위해서는 로그인을 해야한다. 이 때 로그인이 성공적으로 이루어지면 웹메일을 이용할 수 있는 화면으로 이동하여 메일읽기, 메일보내기 등 다양한 서비스를 이용할 수 있다. 이 때 각 서비스는 메뉴화면에서 해당 메뉴를 클릭함으로써 이용할 수 있다. 그러나 서비스를 이용하기 위해 메뉴를 클릭한다는 것은 이미 로그인 이라는 하나의 http 접속 주기(요청, 연결, 전송, 해제)를 완료하고 새로운 접속을 요청하고 있음을 의미한다. 즉 이 상황은 앞의 예에서 전화를 걸어 항공기 예약을 마친후 나중에 어떠한 사정으로 인하여 예약을 변경하는것에 비유될 수 있다. 따라서 로그인 후 각종 서비스를 이용하기위해 클릭을 하여 서버로 새로운 접속을 요구하게 되면 서버는 접속을 요구한 사용자가 어떤 사용자인지를 파악할 방법이 없습니다. 이를 위해서는 전화를 통한 예약 변경시 전화를 걸어 예약번호와 같은 자신의 정보를 직원에게 알려주는 것과 같은 방법으로 사용자가 서버에게 자신을 알릴 수 있는 어떤 정보를 알려줘야 한다. 바로 이러한 일련의 작업은 쿠키 또는 세션이라 불리는 기술을 통해서 구현할 수 있다.


'홈페이지 > HTML' 카테고리의 다른 글

HTML FORM  (0) 2009.03.18
AND

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

반복문의 또 다른 형태인 while 문과 do 문에 대해서 살펴보자. 먼저 이 두 경우 모두 주어진 조건이 만족하는 경우 특정 구간을 반복 수행한다. 그러나 while 문의 경우 주어진 조건을 먼저 검사한 후 그 결과에 따라 반복구간의 실행 여부를 결정하는 반면, do 문의 경우 반복구간을 먼저 실행한 후 조건식을 검사하여 반복구간을 또 실행 할 것인지 말것인지를 결정한다.

먼저 while 문을 살펴보자. while문의 형식은 다음과 같으며 while 옆 괄호 안에 조건식이 주어진다.

while 구조

형식

while ( 조건식 ) {
    실행코드
}


사용자 삽입 이미지

while - flowchart


while 문은 조건식과 함께 반복구간 앞에 위치해 앞서 언급한 것처럼 조건식을 먼저 검사한 후 반복구간의 수행 여부를 결정한다.

다음 프로그램 "while.jsp"는 1에서 100까지 자연수의 합을 구하는 프로그램으로 앞서 for 문으로 구현한 "for.jsp" 프로그램을 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, sum = 0;

i = 1;
while (i <= 100) {
    sum = sum + i;
    i ++;
}

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


사용자 삽입 이미지

while.jsp 실행결과


위 프로그램에서 "i ++"에 의해 결국 조건식이 변화되므로 변수 i의 값이 101이 되는 순간 반복구간을 더 이상 실행하지 않고 빠져나가고 변수 sum에는 5050이 저장되게 된다.

do문을 살펴보자. do 문은 반복구간 뒤에 while과 함께 조건식이 주어지는 구조로 형식은 다음과 같다.

do 구조

형식

do {
    실행코드
} while ( 조건식 ) ;


사용자 삽입 이미지

while~do - flowchart


위 형식과 순서도에서도 알 수 있듯 do 문은 조건식이 반복구간 뒤에 위치한 관계로 최소 한 번 이상 반복구간을 실행한 후 조건식의 결과에 따라 더 실행할 것인지 말것인지를 결정한다.

다음 프로그램 "do.jps" 역시 1에서 100까지 자연수의 합을 구하는 프로그램으로 do 문을 이용 수정한 것이다.

<%@ 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, sum = 0;

i = 1;
do {
    sum = sum + i;
    i ++;
} while (i <= 100);

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


사용자 삽입 이미지

do.jsp 실행결과


이 프로그램 역시 "while.jsp"와 마찬가지로 반복구간 내부의 "i ++"에 의해 조건식이 변화된다.

그러면 while과 do의 차이점을 아래 두 프로그램 "diff-while.jsp"와 "diff-do.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, sum = 0;

i = 200;
while (i <= 100) {
    i ++;
}

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


사용자 삽입 이미지

diff-while.jsp 실행결과


프로그램 "diff-while.jsp"의 실행과정을 살펴보면 변수 "i"에 초기값 200이 저장되어 있다. 그 후 while 문을 실행하는데 while 문의 경우 조건식을 먼저 검사하므로 그 결과가 "200 <= 100"으로 거짓이 되어 반복구간을 실행하지 않고 바로

out.println(i);

부분을 실행한다. 따라서 변수 "i"에는 여전히 200이 저장되어 있으므로 출력결과 역시 "200"이 된다. 반면 다음 프로그램 "diff-do.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, sum = 0;

i = 200;
do {
    i ++;
} while (i <= 100);

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


사용자 삽입 이미지

diff-do.jsp 실행결과


이 프로그램의 경우 do 문에 의해 먼저 반복구간을 실행

i ++ ;

에 의해 변수 "i"의 값은 201이 되고 조건식 "201 <= 100"에 의해 거짓이 되므로 더 이상 반복구간을 실행하지 않고 빠져나와

out.println(i);

을 실행 "201"을 출력한다.

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

쿠키  (0) 2009.03.17
continue, break 문  (1) 2009.03.09
for 문  (0) 2009.03.09
switch 문  (1) 2009.03.09
if 문  (0) 2009.03.05
AND