달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2007. 10. 22. 12:27

JSP & Servlet 교육 Day 1st. 그거/Seminar2007. 10. 22. 12:27


장소 : 썬 교육센터
날짜 : 10.22 ~ 10.26
시간 : 09:30 ~ 17:30
내용 : Web Component Developement with Servlet and JSP Technologies


# Day 1

기본 환경 설정 및 설정 환경 테스트


프로그램 설치 및 설정 >
  JDK 1.5.0_12 설치
  PATH 설정
  CLASSPATH 설정
  Tomcat 5.5 설치
  Eclipse 3.2 설치
  Eclipse Project 만들기
  Eclipse + Tomcat 연동 (plug-in 복사 :
http://www.eclipsetotale.com/tomcatPlugin.html)
  Eclipse + Oracle 연동 (eclipse->window->show view->Data Explorer)

주의 >

  Kill Apache Server Process
  Oracle HttpService 중지(속성->수동 으로 변경)
  Tomcat bin (start server)

테스트 >
  HTML 페이지
  JSP 페이지
  Servlet 페이지

Introduction Web Application Technologies

## MVC 패턴

모델
  -> 비즈니스 데이터와 그 데이터를 다루는 연산의 집합
  -> 자바 객체와 데이터베이스 간의 매핑을 통해 자바 객체에 접근하듯이 데이터베이스에 접근할 수 있도록 하는 프레임워크 필요.
    : ejbStore(), ejbLoad()
  -> 모델의 구현
    : 어떤 방식으로 접근할 것인가
    : 어느 정도 규모의 애플리케이션인가?
    : 개발자들의 기술 수준이 어느 정도인가?


  -> 디자이너의 역할이 더 큰 영역
  -> 비지니스 로직과 프레젠테이션 로직의 분리
  -> JSP

컨트롤러
  -> 흐름을 관리하는 역할
  -> 모델과 뷰 간의 조정 역할

MVC 모델 1, 모델 2
 => 사용자의 요청을 받아 흐름을 제어하는 일을 누가 하는가?

모델 1 : JSP
모델 2 : Servlet

## 프레임워크

 -> 사전적 의미 : 무언가를 이루는 뼈대나 기반 구조
 -> Java에서의 의미
   : 소프트웨어의 특정 문제 영역을 해결하기 위한 뼈대를 이루는 클래스와 인터페이스의 집합
 -> 프레임워크는 내가 만든 프로그램을 끼워 넣는 것이고, 유틸리티는 필요한 프로그램을 갖다 쓰는 것이다.
 -> 프레임워크는 extends, 유틸리티는 import
 -> 디자인 패턴의 집합이다.
 -> 어떻게 하면 이전에 만들어 놓은 코드를 다시 사용할 수 있을까?
   : 얼마나 재사용성이 높은 프로그램을 만드는가?
   : 재사용에 적합한 구조로 잘 설계 되었는가?

## 수준별 재사용 방식


 - Copy & Paste 방식
  -> 복사한 소스에서 버그가 발견되거나, 기능을 추가해야 한다면,
     모든 소스를 일일이 찾아서 수정,
     복사한 소스의 위치와 횟수를 기억해야 한다.
  -> 유지보수가 매우 곤란해진다.
 - 함수 재사용
  -> 코드의 양을 줄일 수 있다.
  -> 공유되고 있는 소스에 버그가 있다면 한 곳에서 고치면 된다.
 - 클래스 상속과 재정의를 통한 재사용
  -> 객체의 상호 작용 중심의 사고로 개발자의 사고방식을 전환
  -> 상속과 인터페이스 구현
  -> 다형성
- 디자인 패턴, 프레임 워크
  -> 잘못된 클래스의 정의 시 문제 발생
    : 디자인 패턴과 프레임워크 적용
  -> 디자인 패턴
    : 개발자들이 오랫동안 고민해서 얻은 설계 노하우를 쉽게 자신의 것으로 재사용 할 수 있다.
    : 하나의 상황에 초점을 맞춘 것.


## 웹

Java
  -> 정적 + 동적
     HTML + <% %>
            Servlet
            JavaBeans
            EJB
.NET
  -> 정적(ASP.NET) + 동적(C#.NET, VB.NET)

Java Web Application
  -> HTML (정적)에 프로그램 기술을 접목시킴
  -> CGI (Common Gateway Interface) 기술
    : 사용자의 요청에 매번 새로운 프로세스가 생성
    : 어느 정도의 한계를 벗어난 동시 접속자가 발생하면 서버 전체가 다운되는 경우가 많다.
    : 다른 프로세스와의 정보 공유가 쉽지 않다.
  -> 1997년 서블릿의 소개

서블릿
  -> 서버 측 프로그램
  -> 서블릿 라이프 사이클(Life Cycle)
    : init(), service(), destroy()
  -> 하나의 JVM 안에서 Multi Thread로 동작
    : 서블릿이 한번 적재되면 동시 접속자가 몇 명이든 하나의 프로세스 안에서
      접속자 당 하나의 Thread가 생성되어 서비스
    : 자원을 효율적으로 나누어 사용하면서 서비스를 제공
  -> 서블릿의 생성과 초기화는 최초에 단 한번만 이루어진다.
  -> 모든 사용자 요청을 처리하면, 서블릿 컨테이너는 해당 서블릿을 소멸

                        요청1       요청2       요청3       요청4
    ================================================================
    서블릿 컨테이너 -- init()
    요청/응답       -- service()
    요청/응답       -------------- service()
    요청/응답       -------------------------- service()
    요청/응답       -------------------------------------- service()
    요청/응답       -------------------------------------- destroy()


  -> init() method
    : 서블릿이 처음 적재될 때 호출된다.
      실제로 서비스가 이루어지기 전에 호출 => 초기화 작업 가능
    : init(ServletConfig config)
        init(config) method에서 super.init(config)가 호출되어야 함
    : init()
        getServletConfig() method를 이용하여 ServletConfig 가져올 수 있음

  -> service() method
   : 사용자의 요청이 있을 때마다 호출
   : 서블릿 컨테이너는 GenericServlet에 정의된 service() 만 호출
     HttpServlet 에서는 service() method가 호출되면 요청 정보를 분석해서
     HTTP 명령에 따라 doGet() 또는 doPost() method를 호출하도록 재정의하고 있다.

  -> destroy() method
   : 서블릿 컨테이너가 서블릿을 소멸시키기 직전에 호출
     자원 반납하는 역할 구현

  -> ServletRequest
   : 사용자의 IP 주소나 호스트 명, 사용하는 프로토콜, 포트 번호,
     요청 파라미터 등 요청에 관련된 많은 정보를 제공
   : String getParameter(String name);
     String[] getParameterValues(String name);
     위 method를 이용하여 프로그램에 전송된 요청 파라미터를 확인할 수 있다.

  - ServletResponse
   : response.setCharacterEncoding(String enc)
     파라미터의 값이 한글일 경우, 한글 설정(euc-kr)
   : java.io.PrintWriter getWriter()
     Html 과 같은 텍스트 형식일 경우, getWriter()를 통해 PrintWriter를 생성하여 출력할 수 있다.
   : ServletOutputStream getOutputStream()
     바이너리(이미지, PDF 등등) 파일일 경우, getOutputStream()을 통해 SerlvetOutputStream을 이용할 수 있다.

서블릿에서 멀티 쓰레드에 대한 고려
  : concurrency, synchronization 문제
    사용자 1        사용자 2
    ===============================
    count++
    -------------------------------
                    count++
    -------------------------------
                    println(count)
    -------------------------------
    println(count)
    synchronized(this) {
      count++;
      out.println(count);
    }

멀티 쓰레드
  - Virtual CPU
  - Code
  - Class Variables
  위 3가지를 공유함

  하나의 process가 생성이 된 후에 Thread가 여러개 생성이 되면
  process가 사용하는 CPU를 각 Thread가 공유하게 된다(Virtual CPU)

  class variables는 process 범위에서 생성 & 유지되는 변수이고, 각 thread에서 공유한다.
  doGet(), doPost() 등은 각 thread 에서 각자 실행되는 부분이다.

 
:
Posted by 뽀기
2007. 10. 22. 11:59

Tomcat에서 JDBC driver 설정~! 그거/Tech2007. 10. 22. 11:59

odjbc14.jar 또는 classes12.zip 등의 JDBC 드라이버 파일을 다음 위치중에 한군데에 복사하면 된당~

# JRE의 library 디렉토리
C:\Program Files\Java\jdk1.5.0_12\jre\lib\ext


# Tomcat의 library 디렉토리
C:\apache-tomcat-5.5.23\common\lib

그러면 Driver Not found 라는 메세지는 나오지 않으리라!

캬캬~~

jre의 lib\ext에 복사해도 된다는 건 첨 알았네 쿠쿠~

'그거 > Tech' 카테고리의 다른 글

[JDK 1.4 VS JDK 1.5] Boolean.TRUE 와 true  (0) 2007.11.05
[Network] OSI 7 Layer  (0) 2007.10.31
JavaScript를 이용해서 Class 작성하기  (0) 2007.10.16
css로 문자열 길이 잘라내기  (0) 2007.07.31
Sun 서버 DNS 설정하기  (0) 2007.05.15
:
Posted by 뽀기


이 세미나도 재밌을 듯.
그런데 25일날 하는 세미나도 있어서.. 갈려면 둘 중에 하나는 선택을 해야 된다는.. ㅋㅋ

등록은 여기 에서
:
Posted by 뽀기
2007. 10. 16. 16:03

[세미나] BEA Developers Day 그거/Seminar2007. 10. 16. 16:03

http://response.bea.com/content/dev_index

BEA Developers Day가 10월 25일 12:00 ~ 17:50까지 코엑스에서 진행된다.

내용도 재밌을 것 같고, 사은품도 좋고, 갔으면 하는 소망이 있는데.. 쭈압.

갈 수 있을라나 모르겄네 쩝.
:
Posted by 뽀기
2007. 10. 16. 16:00

JavaScript를 이용해서 Class 작성하기 그거/Tech2007. 10. 16. 16:00

Javascript를 이용해서 class를 작성하려면 function 이라는 키워드를 사용한다.
function 키워드는 함수를 만들때 사용하지만, class를 작성할 때도 사용이 된다.

# 방법 1

 function Student(name, age) {
  this.name = name;
  this.age  = age;
 }

 
 // setName() 이 아님을 주의하라!
 Student.prototype.setName = function(name) {
  this.name = name;
 }

 
 Student.prototype.setAge = function(age) {
  this.age = age;
 }
 
 Student.prototype.getName = function() {
  return this.name;
 }
 
 Student.prototype.getAge = function() {
  return this.age;
 }

class의 기본만 선언하고 해당 class의 method를 추가로 선언하는 방법

 var student = new Student("홍길동", 45);
 alert(professor.name + " : " + professor.age);
 alert(professor.getAge());

# 방법 2

 function Student(name, age) {
  Student.prototype.setName = function(name) {
   this.name = name;
  }
 
  Student.prototype.setAge = function(age) {
   this.age = age;
  }
 
  Student.prototype.getName = function() {
   return this.name;
  }
 
  Student.prototype.getAge = function() {
   return this.age;
  }
 }

 class선언과 동시에 method를 선언하는 방법

 // class 선언에는 Student(name, age) 라고 되어 있지만, 아래처럼 해도 됨
 // 이것이 Javascript의 매력! ㅋㅋ
 var student = new Student();

 student.setName("홍길동");
 student.setAge(29);

 alert(student.getName() + " : " + student.getAge());

 // 아래처럼 하면 undefined 라고 나옴
 alert(student.name);

# 방법 3

 Student = function() {
  var name;
  var age;
 
 
this.setName = function(name) {
   this.name = name;
  }
 
 
this.getName = function() {
   return this.name;
  }
 }

 method 선언 방법


 Student.setName("럭키");
 alert(Student.getName());
 alert(Student.name);



TIP.

위에 보면 prototype 이라는 놈이 있는데 이는 Java에서 모든 객체가 최상위 객체로 Object를 갖고 있는 것과 비슷하다고 생각을 하면 된다.

Java에서 Student.getName() 하면 Student 객체에서 getName()을 찾고
없으면 Object 객체까지 올라가면서 getName() 메소드를 찾는데,
Javascript에서 Student.getName() 이라고 호출을 하면
Student 객체에서 찾고, Student 객체에 없으면 prototype이라는 property에서
getName() 이라는 function을 찾는다. 없으면 undefined(변수일 경우) 또는 ""(메소드일 경우)를 반환한다.

prototype 이라는 property는 인스턴스별로 하나씩 존재하는 것이 아니고,
클래스에 하나가 존재하는 것이다.
아래 예제를 보면 이해하기가 쉬울 듯....

1번째 라인에서 class를 정의한 후에 20번째 라인에서 해당 class의 instance를 만들고,
60번째 라인에서 해당 class에 prototype을 이용해서 method를 추가하면,
추가한 시점 이후부터는 20번째 라인에서 생성한 instance도 해당 method를 사용할 수 있게 된다.
즉,


1  : function Student(name, age) {
2  :
    this.name = name;
3  :
    this.age = age;
4  :
}
.
.
.
20 :
var lucky = new Student("최유복", 30);
.
.
25 : alert(lucky.name);
.
.
60 :
Student.prototype.setName = function(name) {
61 :
    this.name = name;
62 :
}
.
.
.
77 :
lucky.setName("홍길동");
78 :
alert(lucky.name);


이렇듯 prototype은 class 자체에 지정이 되기 때문에 아래와 같이하면 안된다.

function Student(name, age) {
    Student.prototype.name = name;
    Student.prototype.age = age;
}


var lucky = new Student("최유복", 30);
alert(lucky.name); => 최유복 이라고 찍힌다.

var hong  = new Student("홍길동", 24);
alert(lucky.name + " : " + hong.name); => 홍길동 : 홍길동 이라고 찍힌다.

위와 같이 하면 처음엔 "최유복" 이렇게 찍히나 두번째는 lucky.name 까지도 "홍길동"으로 바뀐다.

'그거 > Tech' 카테고리의 다른 글

[Network] OSI 7 Layer  (0) 2007.10.31
Tomcat에서 JDBC driver 설정~!  (0) 2007.10.22
css로 문자열 길이 잘라내기  (0) 2007.07.31
Sun 서버 DNS 설정하기  (0) 2007.05.15
Solaris 시스템 모니터링 방법  (0) 2007.05.11
:
Posted by 뽀기
2007. 10. 9. 11:07

[세미나] JCO 오픈소스 컨퍼런스 그거/Seminar2007. 10. 9. 11:07



오랜만에 함 가볼까나~? 흠.
:
Posted by 뽀기
2007. 9. 17. 10:05

WebLogic 8.1 SP6 Download URL 그거/Java2007. 9. 17. 10:05

'그거 > Java' 카테고리의 다른 글

eclipse TPTP update  (0) 2008.10.08
참, 자바란 것이 어렵다 ㅜㅜ  (1) 2007.10.24
[JavaQuiz] 3n+1  (0) 2007.09.12
[JavaQuiz] 셰익스피어-원숭이 문제  (0) 2007.09.12
[Java Quiz] 주민등록 번호와 바코드 유효성 체크  (0) 2007.09.12
:
Posted by 뽀기
2007. 9. 12. 10:57

[JavaQuiz] 3n+1 그거/Java2007. 9. 12. 10:57

/**
 *
 * @(#) ThreeNPlusOne.java
 * created date : 2007. 09. 04
 *
 * (c) Copyright by Youbok, Choi.,
 * All rights reserved.

 */
package ybchoi.quiz;

import java.util.ArrayList;

/**
 * 자연수 n을 하나 받아서 짝수면 2로 나누고 홀수면 3*n+1을 합니다.
 * 이 과정을 n이 1이 될때까지 반복하고 그 과정을 리스트로 돌려줍니다.
 *
 * @author Youbok, Choi
 * @version 1.0
 *
 */
public class ThreeNPlusOne {
 
 public void doIt(String arg) {
  int number = 0;

  try {
   number = Integer.parseInt(arg);
  } catch(NumberFormatException e) {
   number = 100;
  }
 
  ArrayList result = getList(number);
  for(int i = 0 ; i < result.size(); i ++ ) {
   if( i != 0 ) System.out.print(", ");
   System.out.print(result.get(i));
  }
 }
 
 private boolean isOdd(int number) {
  return number % 2 == 1;
 }
 
 private ArrayList getList(int number) {
  ArrayList tmp = new ArrayList();
  tmp.add(new Integer(number));
 
  do {
      // 홀수인지 짝수인지 체크
      number = isOdd(number) ? (number * 3 + 1) : (number / 2) ;
     
//      System.out.println(number);
//      try { Thread.sleep(1000); } catch(Exception ignr) {}
      tmp.add(new Integer(number));
  } while( number != 1 );
 
  return tmp;
 }
 
 public static void main(String[] args) {
  ThreeNPlusOne tnpo = new ThreeNPlusOne();
  tnpo.doIt("44");
 }
}

:
Posted by 뽀기
2007. 9. 12. 10:56

[JavaQuiz] 셰익스피어-원숭이 문제 그거/Java2007. 9. 12. 10:56

/**
 *
 * @(#) Monkey.java
 * created date : 2007. 08. 31
 *
 * (c) Copyright by Youbok, Choi.,
 * All rights reserved.

 */
package ybchoi.quiz;

import java.util.Random;

/**
 *
 * @author Youbok, Choi
 * @version 1.0
 *
 */
public class Monkey {

 char[] msg;
 String mem;

 Random random;
 int length;

 Monkey(String arg) {
  msg = arg.toUpperCase().toCharArray();
  length = msg.length;
  random = new Random(System.currentTimeMillis());
 
  // 비교할 문자열 초기화
  for(int i = 0 ; i < length ; i++ ) {
   mem += " ";
  }
 }

 /**
  * A ~ Z 까지중에 무작위 생성
  *
  * @return A ~ Z 까지의 문자중 하나
  */
 private char getRandomAlpha() {
  int result = 0;

  do {
   result = random.nextInt(90);
  } while( result < 65) ;

  return (char)result;
 }

 /**
  *
  * @param _Min
  * @param _Max
  * @return
  */
// private char getRandomAlpha(int _Min, int _Max) {
//  return (char) (Math.random() * ( _Max - _Min ) + _Min);
// }
 
 /**
  * 입력받은 문자열의 길이와 같은 무작위 문자열 생성
  * 문자열 중에 입력받은 문자열과 같은 문자는 그냥 두고 나머지만 무작위로 생성
  *
  * @return 문자열
  */
 private String makeRandomString() {
  StringBuffer sb = new StringBuffer();

  for(int i = length, j = 0 ; i > 0 ; i--, j++) {

   if( mem.charAt(j) == msg[j] ) {
    sb.append(msg[j]);
   } else {
    sb.append(getRandomAlpha());
   }  
  }
 
  return sb.toString();
 }

 /**
  *
  */
 public void doIt() {
  int i = 1;

  do {
   mem = makeRandomString();
   
   try { Thread.sleep(200); } catch(Exception e) {}
   
   System.out.println(i++ + " : " + mem + " # " + String.valueOf(msg));
  }while( !String.valueOf(msg).equals(mem) );
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  Monkey m = new Monkey("ABCDEF");
  m.doIt();
 }

}

# 문자열을 입력 받고, 해당 문자열과 같은 길이의 무작위 문자열을 생성하고
# 생성된 문자열에서 입력 받았던 문자열과 같은 위치의 같은 문자가 있으면
# 해당 문자는 그냥 두고 다른 문자만 무작위로 생성하여
# 처음에 입력 받았던 문자열이 나올때까지 수행한다.

'그거 > Java' 카테고리의 다른 글

WebLogic 8.1 SP6 Download URL  (0) 2007.09.17
[JavaQuiz] 3n+1  (0) 2007.09.12
[Java Quiz] 주민등록 번호와 바코드 유효성 체크  (0) 2007.09.12
Java Anti-Pattern  (2) 2007.08.20
JDK 5.0의 새로운 기능 Annotation  (0) 2007.08.14
:
Posted by 뽀기

/**
 *
 * @(#) JuminNoBarCode.java
 * created date : 2007. 09. 03
 *
 * (c) Copyright by Youbok, Choi.
 * All rights reserved.
 */
package ybchoi.quiz;

/**
 * 체크섬 계산을 통해 주어진 주민번호나 바코드가 옳은지 확인한다.
 *
 * == 주민번호 ==
 * 주민번호는 총 13자리인데, 앞의 12자리를 떼내어서 첫 숫자부터 각각 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5를 곱한다.
 * 그 수들을 모두 합한다음, 11로 나누어 그 나머지를 다시 11에서 뺀 수가 마지막 자릿수(13번째)와 일치하면 주민등록번호가 정상이라 본다.
 * 하지만 마지막 수식 결과가 10이면 0을 취하고 11이면 1을 취한다.
 *
 * == 바코드 ==
 * 바코드는 전체 13자리인데 처음 세 개 숫자는 국가로 880은 한국을 가리킨다.
 * 다음 네개가 제조업자이고 다음 다섯개는 어떤 상품인지를 말한다.
 * 마지막 하나의 숫자가 체크섬이 된다.
 * 앞 부분의 12자리 중 홀수자리는 그대로 더하고, 짝수자리는 더한 후 곱하기 3.
 * 이 두 값의 함에 체크 숫자를 더하면 10으로 나누어 떨어져야 한다.
 *
 * @author Youbok, Choi
 * @version 1.0
 *
 */
public class JuminNoBarCode {
 final int[] JUMIN_CHECK = new int[]{2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5};
 String strNo;
 /**
  *
  */
 public JuminNoBarCode(String arg) {
  this.strNo = arg;
 }
 
 public void check() {
  System.out.println("# " + checkJuminNo());
  System.out.println("# " + checkBarCode());
 }
 
 private boolean checkJuminNo() {
  int totalsum = 0;
  int checksum = 0;
  int idx = 0;
 
  // 마지막자리(13번째)를 제외한 각 숫자에 값을 곱하여 전부 더한다.
  for(idx = 0 ; idx < JUMIN_CHECK.length ; idx++ ) {
   totalsum += (((int)strNo.charAt(idx)-48) * JUMIN_CHECK[idx]);
   
//   System.out.println("# totalSum = " + totalsum + " =======> " + ((int)strNo.charAt(i)-48));
  }
 
  // 모두 합한 수를 11로 나누어 그 나머지를 다시 11에서 뺀 수가 체크섬
  checksum = 11 - (totalsum % 11) ;
 
  System.out.println("# checksum = " + checksum + " : " + strNo.charAt(idx) );
 
  // 체크섬이 10이면 0, 11이면 1
  if( checksum == 10 ) checksum = 0;
  else if( checksum == 11 ) checksum = 1;
 
  // 주민번호 마지막자리와 체크섬 비교
  if( (int)strNo.charAt(12) == checksum ) {
   return true;
  } else {
   return false;
  }
 }
 
 private boolean checkBarCode() {

  int totalsum = 0;
  int idx = 0;
 
  // 마지막자리(13번째)를 제외한 각 숫자에서, 홀수자리는 그대로 더하고, 짝수자리는 곱하기 3을 해서 더한다.
  for(idx = 0 ; idx < strNo.length() - 1 ; idx++ ) {
   if( idx % 2 == 1 ) {
    totalsum += ( ((int)strNo.charAt(idx) - 48) * 3);
   } else {
    totalsum += ( (int)strNo.charAt(idx) - 48 );
   }
//   System.out.println("# totalSum = " + totalsum + " =======> " + ((int)strNo.charAt(idx)-48));
  }
 
  // 마지막 체크섬을 더한다.
  totalsum += (int)strNo.charAt(idx) - 48;
 
  System.out.println("# totalsum = " + totalsum + " : " + strNo.charAt(idx) );
 
  // 최종값이 10으로 나누어 떨어지면 정상
  if( totalsum % 10 == 0 ) {
   return true;
  } else {
   return false;
  }
 }
 
 public static void main(String[] args) {
//  JuminNoBarCode jnbc = new JuminNoBarCode("7807021457211");
  JuminNoBarCode jnbc = new JuminNoBarCode("8809010665009");
  jnbc.check();
 }
}

# 흠. 주민번호와 바코드에 이런 심오한 뜻이 있는 줄 몰랐다.

'그거 > Java' 카테고리의 다른 글

[JavaQuiz] 3n+1  (0) 2007.09.12
[JavaQuiz] 셰익스피어-원숭이 문제  (0) 2007.09.12
Java Anti-Pattern  (2) 2007.08.20
JDK 5.0의 새로운 기능 Annotation  (0) 2007.08.14
JDK 5.0의 새로운 기능 Generics  (1) 2007.08.13
:
Posted by 뽀기