posted by 구름너머 2006. 3. 29. 11:24
제목 : 접속된 사용자 정보 지우기에 대해서..
글쓴이: 곽태일(cocktail) 2001/02/09 11:02:06 조회수:71 줄수:12
안녕하세요.

JSP로 서비스를 하려고 합니다. 사용자가 접속을 하면 서버에 정보를 저장을 하게
되는데요. 만약 사용자가 비정상적인 종료를 한다면, 예를들어 종료 버튼을 누르지
않고 브라우저를 닫는다거나 컴퓨터가 다운이 된다면 어떻게 그 사용자의 정보를
지워야 할지를 모르겠네요.
만약 session을 쓴다면 setMaxInactiveInterval()를 써서 그 사용자의 세션이 만료
되는 시점을 catch할 수 있는 방법이 있는지...

조그만 충고라도 저에게는 도움이 될 것 같네요.
어떤 방법을 써야 할지를 감만 잡히면 좋겠는데.
제목 : Re: 접속된 사용자 정보 지우기에 대해서..
글쓴이: 최유복(jnylove) 2001/02/10 14:34:31 조회수:1356 줄수:80
도움이 될지 모르겠습니다.
저는 다음과 같은 방법으로 브라우저를 죽이거나 컴퓨터가 다운되는등의
비정상적인 종료에 대해서 사용자의 세션을 관리했던 적이 있습니다.

우선 처음에 로그인을 하면서 세션을 만들 때, 세션에 리스너라고 하는걸 하나
넣어둡니다.
그 리스너가 하는 일은 리스너가 세션에 바인딩되거나 언바인딩 될경우 특정 메소드를
호출하도록 하였습니다.
그리고 비정상 종료에 대한 문제는 프레임을 이용해서 안보이도록 프레임을 나눠서
안보이는 곳에 jsp 파일을 뒀습니다.
이 페이지가 언로드 되면 세션의 값을 지우도록 했습니다.

Blank.jsp와 LoginCount.java, LoginListener.java에 대한 내용은 다음과 같습니다.
Blank.jsp : 로그인 하면서 리스너를 세션에 바인딩 시킴, 이 페이지가 언로드 될경우
해당 세션값 삭제
LoginCount.java : 접속자 증가/ 감소
LoginListener.java : 리스너

Blank.jsp ===============================================================
<%
session.setAttribute("login.listener", new LoginListener(getServletContext()));
%>
<script language="JavaScript">
<!--
function delSession() {
window.open('invalidate.jsp','Logout','scrollbars=no,width=400,height=200');
}
//-->
</script>
<body onUnLoad="delSession()">
<form name="logout">
<input type=hidden name="logflag" value="">
</form>
</body>

LoginCount.java =========================================================
public class LoginCount
{
public static Object lockObject = new Object();
public static int logCount = 0 ;

public static synchronized void increaseCount() {
synchronized (lockObject) {
logCount++;
}
}

public static synchronized void decreaseCount() {
synchronized (lockObject) {
logCount--;
}
}
}

LoginListener.java ======================================================
public class LoginListener implements HttpSessionBindingListener
{

ServletContext context;

public LoginListener(ServletContext context) {
this.context = context;
}

// listenter 가 session에 binding 될 때 호출
public void valueBound(HttpSessionBindingEvent event)
{
LoginCount.increaseCount();
}

// listenter 가 session에 unbinding 될 때 호출
public void valueUnbound(HttpSessionBindingEvent event)
{
LoginCount.decreaseCount();
}
}

미숙하나마 도움이 되었으면 좋겠습니다.
posted by 구름너머 2006. 3. 29. 11:14
Cookie, Session, application, pageContext, page, exception 객체 | JSP2006/02/01 12:29
http://blog.naver.com/kmis9797/120021696379

▩ cookie 객체의 사용
- Tomcat 서버가 Client에 저장하는 텍스트 파일로 된 정보
- 쿠키는 국제 표준에 따라 작성되어야 합니다.
- 보안성이 없음으로 계정과 패스워드를 동시에 쿠키에 저장하면, 쿠키의 내용을 전부 편집기로 열어 볼 수 있음으로
보안에 문제가 될 수 있습니다.
- 4Kb까지 저장할 수 있다.
- 쿠키의 저장 폴더는 2000서버의 경우 "C:\Documents and Settings\각 계정(Administrator)\Cookies"가 지정됨
- 사용예 : 하루동안 이벤트창 오픈하기, ID자동으로 저장기능 등
- setMaxAge() : 쿠키의 생존 기간, 초 단위, 12시간의 경우 12*60*60, 생존 기간이 지나면 쿠키가 Servlet Container에 의해
인식이 되지 않습니다.
- Cookie cname = new Cookie("cname", "Java"); --> Cookie cname = new Cookie(쿠키 변수명, 쿠키 값)

------------------------------------------------------------------------------
>>>>> jcookieWrite.jsp, http://127.0.0.1:8081/jsp2030/jcookieWrite.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>

<%
//쿠키 변수 선언
Cookie cname= null;
Cookie ckuk = null;
Cookie ceng = null;
Cookie cmat = null;

cname = new Cookie("cname", "Java"); //cname이란 쿠키변수에 "Java"를 저장합니다.
cname.setMaxAge(20); //20초
response.addCookie(cname); //쿠키를 Client에 저장합니다.

ckuk = new Cookie("ckuk", "100");
ckuk.setMaxAge(20);
response.addCookie(ckuk);

ceng = new Cookie("ceng", "90");
ceng.setMaxAge(20);
response.addCookie(ceng);

cmat = new Cookie("cmat", "100");
cmat.setMaxAge(20);
response.addCookie(cmat);

%>

<html>
<head>
<title>쿠키 저장하기(Cookie객체의 사용)</title>
</head>
<body>
<p>성적을 쿠키로 저장 했습니다.</p>
<p><a href="jcookieRead.jsp">쿠키로 저장된 성적 읽어오기</p>
</body>
</html>


------------------------------------------------------------------------------
>>>>>>>>>> jcookieRead.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>

<html>
<head>
<title>쿠키 읽어 오기(Cookie객체의 사용)</title>
</head>
<body>
<%
//client안에 있는 모든 쿠키를 전부 읽어 옵니다.
Cookie[] cookies = request.getCookies();
Cookie cItem=null;

String name=null;
int kuk=0;
int eng=0;
int mat=0;

for (int i = 0; i < cookies.length; i++) {
//쿠키 변수를 각각 추출합니다.
cItem = cookies[i];

if (cItem.getName().equals("cname")) name = (String)(cItem.getValue());
if (cItem.getName().equals("ckuk")) kuk = Integer.parseInt(cItem.getValue());
if (cItem.getName().equals("ceng")) eng = Integer.parseInt(cItem.getValue());
if (cItem.getName().equals("cmat")) mat = Integer.parseInt(cItem.getValue());
}

out.println ("성명 : " + name + "<br><br>");
out.println ("국어 : " + kuk + "<br><br>");
out.println ("영어 : " + eng + "<br><br>");
out.println ("수학 : " + mat + "<br><br>");
out.println ("총점 : " + (kuk+eng+mat) + "<br><br>");
out.println ("평균 : " + (kuk+eng+mat)/3 + "<br><br>");
%>
</body>
</html>

http://127.0.0.1:8081/jsp2030/jcookieWrite.jsp

▩ session 객체의 사용
- javax.servlet.http.HttpSession Interface
- 서버의 메모리상에 저장되는 정보
- 보안성이 높으나 서버의 메모리를 사용함으로 비용이 많이 발생되어 사용을 최대한 줄여야 함
- 아이디, 패스워드, 쇼핑카트등 로그인 정보를 저장함
- 사용자가 웹사이트에 접속시 접속자별로 웹서버는 세션ID를 생성해 줌
- 서버상에서 세션의 유지시간은 초단위로 session.setMaxInactiveInterval(600); 로 지정합니다.
만약 사용자가 JSP페이지를 열어놓고 링크를 마우스 클릭등의 작업을 하지 않아도 session은 삭제됩니다.
- 서버상에 있는 세션 변수의 값을 삭제하려면 session.invalidate();을 이용합니다.
- Session ID는 서블릿컨테이너가 부여하는 것으로 접속자의 상태를 파악해서 일정 시간이 흐르면
session을 삭제할 것인지를 결정하게 됩니다. 개발자는 이 Session ID값을 읽어 올수만 있습니다.
- Session ID외에 개발자는 필요한 만큼 Session 변수를 만들어 사용할 수 있습니다.

- 페이지 흐름도 YES
ⓐ main.jsp -----> 로그인여부 판단 -----┬----> main.jsp -----> logout.jsp -----> ⓐ

│NO
└----> login.jsp -----> session.jsp -----> ⓐ


------------------------------------------------------------------------------
>>>>>>>>>> login.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>

<html>
<head>
<title>session객체 사용하기</title>
</head>
<body>
<center>

<form method="post" action="session.jsp">

<table border=1 cellspacing=1 cellpadding=0>
<tr>
<th>ID</th>
<td><input type="text" name="id" value='java'></td>
</tr><tr>
<th>Password</th>
<td><input type="password" name="passwd" value='1234'></td>
</tr><tr>
<td colspan="2" align="center"><input type="submit" value="Login"></td>
</tr>
</table>

</form>

* 인증을 위한 ID는 java, Password는 1234입니다.

</center>
</body>
</html>


------------------------------------------------------------------------------
>>>>>>>>>> session.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>

<html>
<head>
<title>session처리 페이지</title>
</head>
<body>

<%
String inid = request.getParameter("id");
String inpasswd = request.getParameter("passwd");

//System.out.println("id : " + inid+ " passwd:" + inpasswd);

String id = "java";
String passwd = "1234";

//== : 참조값 비교
if (!id.equals(inid)){
%>
<script Language="JavaScript">
alert("등록된 아이디가 아닙니다.");
history.back();
</Script>

<%}

if (!passwd.equals(inpasswd)){
%>
<script Language="JavaScript">
alert("비밀번호가 잘못되었습니다.");
history.back();
</Script>

<%}

if (id.equals(inid) && passwd.equals(inpasswd)) {
//session 변수 생성
session.setAttribute("user", id);
response.sendRedirect("main.jsp");
}
%>
</body>
</html>


------------------------------------------------------------------------------
>>>>>>>>>> main.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" import="java.util.*"%>
<% session.setMaxInactiveInterval(600); %>
<html>
<head>
<title>회원 전용 메인 페이지</title>
</head>
<body>
<font size=5>
<%
try {
if (session.getAttribute("user")!=null){
%>
<p>로그인 된 아이디 : <%=session.getAttribute("user")%><p>
<p>현재 session ID : <%= session.getId() %></p>

<%
Date dd = new Date(session.getCreationTime());

Calendar rightNow = Calendar.getInstance();

rightNow.setTime(dd);

int year = rightNow.get(Calendar.YEAR);
int month = rightNow.get(Calendar.MONTH)+1;
int day = rightNow.get(Calendar.DATE);

int hour = rightNow.get(Calendar.HOUR);
int min = rightNow.get(Calendar.MINUTE);
int sec = rightNow.get(Calendar.SECOND);

String sd = year + "년 " + month + "월 " + day + "일 ";
sd += hour + "시 " + min + "분 " + sec + "초 ";

%>
<p>session이 만들어진 시각 : <%=sd%></p>
<p>설정된 session Timeout 시간 : <%= session.getMaxInactiveInterval() %></p>
<p><a href="logout.jsp">로그 아웃하기</a></p>
<%}else{%>
<p>회원만 이 페이지에 접속할 수 있습니다.</p>
<Script Language='JavaScript'>
alert("로그인을 해주세요......");
location.href='login.jsp';
</Script>
<%}
} catch(NullPointerException e) {
System.out.println("에러가 발생했습니다. 원인: "+e.toString());
}
%>
</font>
</body>
</html>


------------------------------------------------------------------------------
>>>>> logout.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>

<html>
<head>
<title>로그 아웃</title>
</head>
<body>
<%
session.invalidate();
//response.sendRedirect("main.jsp");
%>
<p>로그아웃 되었습니다. 이용하여 주셔서 감사합니다.</p>
<a href='main.jsp'>메인화면으로 가기</a>
</body>
</html>


http://127.0.0.1:8081/jsp2030/main.jsp

▩ application 객체
- javax.servlet.ServletContext Interface

1. 서블릿 또는 어플리케이션의 외부 환경 정보(Context) 제공
------------------------------------------------------------------------------
>>>>> application.jsp
------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=EUC-KR"%>
<%
String serverInfo = application.getServerInfo();
String mimeType = application.getMimeType("test.html");
String realPath = application.getRealPath("/");
application.log("application 내부 객체 로그 테스트");
%>
<h1>application.jsp</h1>
서블릿 컨테이너의 이름과 버전 : <%=serverInfo%><p>
test.html의 MIME Type : <%=mimeType%><p>
로컬 파일 시스템 경로 : <%=realPath%>

▩ exception 객체
- java.lang.Throwable

1. 에러 처리 페이지에 에러를 전달하는 역활을 함

------------------------------------------------------------------------------
>>>>> errorStart.jsp
------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=EUC-KR" errorPage="error.jsp"%>
<%
int one = 1;
int zero = 0;
%>
<h1>errorStart.jsp</h1>
one / zero = <%=one/zero%><p>

------------------------------------------------------------------------------
>>>>> error.jsp
------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=EUC-KR" isErrorPage="true"%>
<%
String message = exception.getMessage();
String objectMessage = exception.toString();
%>
<h1>error.jsp</h1>
에러 메세지 : <b><%=message%></b><p>
에러 실체의 클래스명과 에러 메세지 : <b><%=objectMessage%></b><p>

http://127.0.0.1:8081/jsp2030/errorStart.jsp

posted by 구름너머 2006. 3. 29. 10:36
내장객체(request,response,pageContext,session,application,out....) | java2006/02/20 14:48
http://blog.naver.com/smilejwb/90001882178
내장객체
===================

-----------------
request 내장객체
-----------------
1. 클라이언트에서 서버로 보내는 요청을 담고있는 객체
2. 요청범위를 가지며 javax.servlet.ServletRequest 클래스의 한인스터스이다.
3. 컨테이너는 이객체를 _jspService()메소드의 한인자로서 JSP에게 넘겨준다.

--------------------
response 내장객체
--------------------
1.서버에서 클라이언트로의 응답을 담고 있다.
2. 페이지 범위를 가지며javax.servlet.ServletResponse 클래스의 한 인스턴스이다.
3. 이것은 JSP에 의해 생성된 , 클라이언트에 보내질 응답을 캡슐화 한것이다.
4. 이객체는 컨테이너에 의해 생성되어 _jspService()메소드의 한 인자로서 JSP에게
전달되며JSP는 그메소드안에서 적절하게 response 객체를 수정한다.
5. JSP에서는 클라이언트로의 출력 스트림에 버퍼링이 적용되므로 일단 어떠한 출력이
있은후에 HTTP상태코드나 응답헤더를 설정해도 오류가 생기지 않는다.

----------------------
pageContext 내장객체
----------------------
1. 페이지 범위를 가지며, javax.servlet.jsp.PageContext 클래스의 한인스턴스이다.
2. 해당 JSP Page의 페이지문맥을 캡슐화 한것
3. 다른 명시적 객체에 접근하는 여러가지 편리한 함수제공
4. pageContext객체는 현재 페이지의 제어권을 다른 페이지로 넘기는 방법을 제공한다. 5. 잠시 줄수도 있고 영구히 줄수도 있다. <jsp:include> <jsp:forward>등이 해당
JSP 컨테이너에 의해 실행되기전 자동으로 서블릿의 javax.servlet.jsp.PageContext
객체로 변환되어 해석된다.
6. Abstract java.lang.Object.getAttribute(java.lang.String name)
- “name”이라는 객체를 반환, 없을경우null반환
Abstract vod removeAttribute(java.lang.String name)
- “name” 이라는 이름의 객체를 삭제
Abstract vod setAttribute(java.lang.String name, java.lang.Object attribute)
- attribute에 해당하는 “name” 이라는 이름의 객체생성

--------------------
session 내장객체
--------------------
1. 세션범위를 가지며 , javax.servlet.http.HttpSession 객체의 한 인스턴스이다.
이것은 요청을 보낸 클라이언트에 대해 생성된 대표하며 HTTP 요청에 대해서만
유효하다.
2. 세션은 자동적으로 생성되므로 이 객체는 세션을 사용하지 않는 경우에도 유효하다.
유일한 예외는 page지시자의 session특성을 이용해서 session을 끈 경우인데,
그런경우 이객체를 참조하려고 하면 컴파일 시점에 오류가 생긴다.
3. JSP의 세션객체는 JSP컨테이너에 의해 서블릿의 javax.servlet.http.HttpSession
객체로 변환된다. 결국 JSP의 session객체와 HttpSession는 같은 것이다.
4. 메소드
getId() : session ID를 돌려줌
getCreateTime() : session이 생성된 시간을 돌려줌
getLastAccessedTime() : session이 마지막으로 액세스된 시간을 돌려준다.
getMaxInactiveInterval() : session이 유지되는 시간을 얻음(초단위)
setMaxInactiveInterval(time) : session이 유지되는 시간을 설정(초단위)
isNew() : 웹브라우저가 session을 생성한적인 있는지 확인 있다면 true를 넘겨줌
isNew() : 웹브라우저가 session을 생성한적인 있는지 확인 있다면 true를 넘겨줌
invalidate() : session 객체를 소멸시킨다. Session에 저장되어 있던 정보는 모두
삭제된다.

-------------------
application 내장객체
-------------------
1. application 범위를 가지며, javax.servlet.ServletContext 클래스의 한 인스턴스이다.
2. JSP가 실행되고 있는 문맥(서블릿문맥)을 대표한다.
3. JSP 컨테이너에 의해 자동으로서블릿의 ServletContext 객체로 변환된다.
4. session객체의 경우 각 사용자마다 하나의 세션을 공유하나, application 객체의
경우 각 서버내에 있는 모든 JSP File들은 하나의 application 객체를 공유한다.
5. application 객체의 getServerInfo() 메소드를 이용하여 컨테이너의 버전과 이름을
알수있다.


--------------------
out 내장객체
--------------------
1.페이지 범위를 가지며, javax.servlet.jsp.JspWriter 클래스의 한 인스턴스이다.
클라이언트에게 전달될 출력 스트림을 대표한다.
2.클라이언트에게 실제 출력을 보내는것은 PrintWriter이며 JspWriter는response
객체를 좀더 유용하게 하기위해서 PrintWriter에 버퍼링 기능을 추가한 것이다.
3.page 지시자의 buffer특성을 이용해서 버퍼크기를 변경도 가능하며 버퍼링 자체를
끌수도 있다.

--------------------
page 내장객체
--------------------
1. 페이지 범위를 가지며, java.lang.Object 클래스의 한 인스턴스이다.
2. JSP 페이지 자체를 가르키는 것으로 this참조 변수로서 접근이 가능하다.

--------------------
config 내장객체
--------------------
1. 페이지 범위를 가지며, javax.servlet.ServletConfig 객체의 한 인스턴스이다.
서블릿설정을 대표한다.
2. JSP페이지가 JSP 컨테이너에 의해 초기화될때 전달받는 객체이다.
3. getInitParameterNames() : 모든 초기화 파라미터를 Enumeration 형태의
객체형식으로 가져온다.
4. getInitParameter(String name) : 지정된 name 초기화 파라미터를 가져온다.


--------------------
exception 내장객체
--------------------
1. 페이지 범위를 가지며, java.lang.Throwable클래스의 한 인스턴스이다.
2. 에러페이지(isErrorPage=true)안에서만 사용이 가능하다.
3. 대부분의 컨테이너들은 예외를 request객체의 한 특성으로 포함시켜
(ServletRequest.setAttribute() 메소드를 이용)에러페이지에게 전달하고
에러페이지 에서는 request.getAttribute(String name) 메소드를 이용하여 예외를
뽑아내는 방식을 취하고 있다.
posted by 구름너머 2006. 3. 29. 09:20
[본문스크랩] [JAVA/SCJP강좌]Map(HashMap, TreeMap, Hashtable) | 나의 관심정보 메모 삭제 2006/03/29 09:19
damool2 http://memolog.blog.naver.com/damool2/25
출처 카페 > 오라클OCP/MCSE/SCJ.. / 신죤
원본 http://cafe.naver.com/spszone/260
# Collection #


◎ Map은 key와 value를 가진 집합이며, 중복을 허용하지 않는다.
◎ 즉, 한개의 key에 한개의 value가 매칭된다.
◎ java.util 패키지에 여러 집합들을 사용하기 위한 여러 interface와 class 들이 정의되어 있다.


# HashMap #


◎ HashMap은 Map interface를 implements 한 클래스로서 중복을 허용하지 않는다.
◎ Map의 특징인 key와 value의 쌍으로 이루어지며, key 또는 value 값으로써 null을 허용한다.
◎ 아래의 예는 HashMap을 사용한 간단한 예제이다.


public class HashMapTest
{
public static void main(String argv[])
{
HashMap hm = new HashMap();
System.out.println(hm.put("aaa", "111"));
System.out.println(hm.put("bbb", "222"));
System.out.println(hm.put("aaa", "444"));
System.out.println(hm.put("ccc", "333"));
System.out.println(hm.put("ccc", null));

System.out.println("HashMap size : " + hm.size());

Set set = hm.keySet();
Object []hmKeys = set.toArray();
for(int i = 0; i < hmKeys.length; i++)
{
String key = (String)hmKeys[i];
System.out.print(key);
System.out.print(" - ");
System.out.println((String)hm.get(key));
}
}
}
/**
실행:java HashMapTest
결과:
null
null
111
null
333
HashMap size : 3
ccc - null
bbb - 222
aaa - 444
*/

# TreeMap #


◎ TreeMap역시 중복을 허용하지 않으며, key와 value의 쌍으로 이루어져 있다.
◎ HashMap과 다른 점은 SortedMap을 implements 하였으므로, key 값들에 대한 정렬이 이루어진다는
점이다.
◎ 아래의 예는 TreeMap을 사용하여 각 요소가 몇몇 이나 나왔는지 알아보는 간단한 예제이다.

import java.util.*;

public class Freq {
private static final Integer ONE = new Integer(1);

public static void main(String args[]) {
Map m = new TreeMap();

// Initialize frequency table from command line
for (int i=0; i < args.length; i++) {
Integer freq = (Integer) m.get(args[i]);
m.put(args[i], (freq==null ? ONE :
new Integer(freq.intValue() + 1)));
}

System.out.println(m.size()+" distinct words detected:");
System.out.println(m);
}
}
/**
실행:java Freq if it is to be it is up to me to delegate
결과:
8 distinct words detected:
{be=1, delegate=1, if=1, is=2, it=2, me=1, to=3, up=1}
*/

# Hashtable #


◎ Hashtable Map interface를 implements 한 클래스로서 중복을 허용하지 않는다.
◎Map의 특징인 key와 value의 쌍으로 이루어지며, key 또는 value 값으로써 null을 허용하지 않는다.
(HashMap과의 차이점)
아래의 예는 HashTable을 사용한 간단한 예제이다.

public class HashtableTest
{
public static void main(String argv[])
{
Hashtable ht = new Hashtable();
System.out.println(ht.put("aaa", "111"));
System.out.println(ht.put("bbb", "222"));
System.out.println(ht.put("aaa", "444"));
System.out.println(ht.put("ccc", "333"));

System.out.println("Hashtable size : " + ht.size());

System.out.println("aaa value : " + (String)ht.get("aaa");

}
}
/**
실행:java HashMapTest
결과:
null
null
111
null
Hashtable size : 3
aaa value : 444
*/
posted by 구름너머 2006. 3. 29. 09:17

기본적인 동작은 HashTable이나 HashMap은 같습니다.

즉 Key object - Value object 를 쌍으로 저장하여 seek타임을 줄이기 위해 hash값을 이용합니다.

Hashtable

Hashtable 은 키나 값에 Null을 허용하지 않습니다. 또한 Object에 정의된 hashCode()와 equals()메소드를 재정의하는 객체들만 저장할 수 있습니다.

다행히도 자바 내장 클래스들은 대부분 hashCode()구현되어 있다는 것을 아실겁니다.

특히 String 타입이 hashCode(), equals()메소드 두개 모두 구현되어 있지요.

Hashtable은 Map 클래스와 마찬가지로 반복자(interator)를 직접제공 하지 않습니다

다음 두가지 방식으로 HashTable 내용을 출력합니다.

Hashtable hashtable = new Hashtable();

hashtable.put("jakarta", "project");

hashtable.put("apache", "tomcat");

Enumertaion keys = hashtable.keys();

while(keys.hasMoreElements()) {

key = (String)keys.nextElement();

System.out.println(hashtable.get(key));

}

혹은

Setset = hashtable.keySet();

Iteratorkeys = set.interator();

while(keys.hasNext()) {

key = (String)keys.next();

System.out.println(hashtable.get(key));

}

HashMap

HashMap은 키나 값에 Null을 허용 합니다.

HashMap 출력방법은 다음 한가지 이네요. (Enumeration 지원 안함)

HashMap hashmap = new HashMap();

hashmap.put("jakarta", "project");

hashmap.put("apache", "tomcat");

Set set = hashmap.entrySet();

Iterator keys = set.iterator();

while (keys.hasNext()) {

key = (String)keys.next();

System.out.println(hashmap.get(key));

}

또한 Hashtable은 thread safe 한 객체이지만 HashMap은 그렇지 못해 unsynchronized 합니다. 이말은 즉 멀티 쓰레드 환경이 아니면 HashMap을 쓰면 속도가 빠르다는 말입니다.

굳이 동기화 하자면 다음과 같이 사용해야 겠지요

Map m = Collections.synchronizedMap(new HashMap(...));

간단히 정리하자면

HashMap이 HashTable에 비해 좀더 실용적으로 변한 형태라고 보면 되겠네요 ^^

일반적으로 쓴다면 HashMap을 사용하세요

posted by 구름너머 2006. 3. 29. 09:13
Hashtable과 HashMap의 차이점 알고 싶습니다..
평점 :
+ 1 (1 명)나도 평가하기tmslzl80 조회 :1153답변 : 1
답변이 완료된 질문입니다. (2004-11-15 10:55 작성)신고
이 둘의 차이점을 잘 모르겠네요
책에는 HashMap이 Hashtable보완되어 나왔다고만 되어 있는데
사용하는거 보니깐 그렇지 않은거 같아서요
아직도 Hashtable을 많이 사용도 되고 있는거 같고....
질문자가 선택한 답변
re: Hashtable과 HashMap의 차이점 알고 싶습니다..
bomb100 (2004-11-15 12:37 작성)
이의제기 | 신고
질문자 평
HashMap 이나 Hashtable 이나 둘다 Map 인터페이스를 implements 하고있지만 프로그래밍 환경에 따라서 적절한 놈으로 골라써야 합니다.



java API 문서에 보면

The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls

"간략히 말해서 HashMap 은 Hashtable과 같다, 다만 HashMap 이 unsynchronized 하고 null 값을 허용할 뿐이다."

그러면 Hashtable 에는 null 값이 들어갈 수 없다는건가? 이건 잘 모르겠지만 님께서 Hashtable 만들어놓고 null 키값과 null value 를 함 넣어보시면 확인하실 수 있을 듯...

중요한 건 HashMap은 멀티쓰레드 환경에서 사용하면 안된다는 겁니다.

여러개의 쓰레드가 동시에 HashMap 을 건드려서 key, value 를 써넣게 되면 문제가 발생할 수 있다, 뭐 이런것 같습니다. 멀티쓰레드 프로그래밍 환경에서는 HashMap 을 쓰면 안되고 Hashtable 을 써야 한다는 거죠...

단일 쓰레드 환경에서 Hashtable 을 쓰더라도 별 문제는 없는데, HashMap보다는 성능이 저하될 수 있습니다.

'JAVA' 카테고리의 다른 글

Map(HashMap, TreeMap, Hashtable)  (0) 2006.03.29
HashTable vs HashMap 사용법  (0) 2006.03.29
Jsp 기초 - 스크립트 프로그래밍  (0) 2006.02.17
Runtime.getRuntime().exec( cmd )  (1) 2005.11.25
StringTokenizer for JDK1.5.0  (0) 2005.11.25
WEB
posted by 구름너머 2006. 3. 28. 18:36
posted by 구름너머 2006. 3. 28. 12:36
 항목명단위년/월\일01020304050607080910111213141516171819202122232425262728293031
[ 시장금리(일별) ]                                
 CD(91일)연%200512                         4.074.084.084.094.09 
   200601 4.104.114.124.134.14  4.154.164.174.174.16  4.164.164.164.164.16  4.164.164.164.164.16   4.18
   2006024.204.214.22  4.244.254.264.264.26  4.264.264.264.264.26  4.264.264.264.264.26  4.264.26   
   200603 4.264.26  4.274.274.274.274.27  4.274.274.274.274.27  4.274.274.274.274.27       
 콜금리(익일물, 전체거래) 200512                         3.753.743.743.753.76 
   200601 3.743.743.743.703.69  3.743.743.743.743.73  3.743.743.743.703.72  3.743.743.753.763.75   3.76
   2006023.753.743.73  3.693.683.743.993.99  3.993.993.993.993.98  3.983.953.973.993.99  3.993.99   
   200603 3.993.98  3.953.943.983.983.98  3.983.983.983.983.97  3.983.953.923.973.97