최종명님의 몽땅 자바강좌 - ckwoo.tistory.com · 최종명님의 자바 강좌 1. -...

169
숭실대학교 최종명님의 자바 프로그래밍 강좌 최종명님의 몽땅 자바강좌 이 글은 자바스터디 문서 링크입니다. 자바 강좌 ::::: 자바 강좌 (기초부터 고급까지 몽땅!!) 1. 자바 초보를 위하여 I - 자바입문 2. 자바 초보를 위해 II - 초보자가 하기 쉬운 실수 3. 자바 애플릿의 기초 I 4. 자바 애플릿의 기초 II 5. 자바 제어구조 6. 자바 AWT 7. 자바 이벤트 8. 자바 네트워크 9. 자바 데이타베이스 프로그래밍 - JDBC 와 Postgres 10. 자바 데이타베이스 프로그래밍 - JDBC 와 mSql 11. 자바 분산 프로그래밍 - RMI 12. 자바 분산 프로그래밍 - CORBA 13. 자바 분산 프로그래밍 - CORBA CALLBACK 14. 자바 OS 15. 자바 프로그래밍 - 자바 쓰레드 16. 자바 프로그래밍 - 라운드 로빈 스케쥴러 17. 자바 IO (입출력) 18. 자바 그래픽 프로그래밍 - 폰트를 이용하자. 19. 자바 웹 프로그래밍 - CGI 1편 (인터넷 검색엔진의 원리) 20. 자바 웹 프로그래밍 - CGI 2편 21. 자바 문서화 프로그램 - JAVADOC 22. JACL 소개 23. 자바 프로그래밍 - 다형성(폴리모피즘) 24. 자바 Cut & Paste 25. 자바스크립트를 이용한 자바 애플릿 제어 26. 자바 그래픽 프로그래밍 - 스윙 1편 27. 자바 그래픽 프로그래밍 - 스윙 2편 http://50001.com/sub/jm.html (1 / 2)2006-09-01 오전 1:57:36

Upload: others

Post on 04-Oct-2019

5 views

Category:

Documents


0 download

TRANSCRIPT

숭실대학교 최종명님의 자바 프로그래밍 강좌

최종명님의 몽땅 자바강좌

이 글은 자바스터디 문서 링크입니다.

자바 강좌 :::::

자바 강좌 (기초부터 고급까지 몽땅!!)

1. 자바 초보를 위하여 I - 자바입문

2. 자바 초보를 위해 II - 초보자가 하기 쉬운 실수

3. 자바 애플릿의 기초 I

4. 자바 애플릿의 기초 II

5. 자바 제어구조

6. 자바 AWT

7. 자바 이벤트

8. 자바 네트워크

9. 자바 데이타베이스 프로그래밍 - JDBC 와 Postgres

10. 자바 데이타베이스 프로그래밍 - JDBC 와 mSql

11. 자바 분산 프로그래밍 - RMI

12. 자바 분산 프로그래밍 - CORBA

13. 자바 분산 프로그래밍 - CORBA CALLBACK

14. 자바 OS 15. 자바 프로그래밍 - 자바 쓰레드

16. 자바 프로그래밍 - 라운드 로빈 스케쥴러

17. 자바 IO (입출력)

18. 자바 그래픽 프로그래밍 - 폰트를 이용하자.

19. 자바 웹 프로그래밍 - CGI 1편 (인터넷 검색엔진의 원리)

20. 자바 웹 프로그래밍 - CGI 2편

21. 자바 문서화 프로그램 - JAVADOC

22. JACL 소개

23. 자바 프로그래밍 - 다형성(폴리모피즘)

24. 자바 Cut & Paste

25. 자바스크립트를 이용한 자바 애플릿 제어

26. 자바 그래픽 프로그래밍 - 스윙 1편

27. 자바 그래픽 프로그래밍 - 스윙 2편

http://50001.com/sub/jm.html (1 / 2)2006-09-01 오전 1:57:36

숭실대학교 최종명님의 자바 프로그래밍 강좌

자바 웹 프로그래밍 (Servlet/JSP)

1.JSWDK 사용법과 간단한 JSP

2.자카르타 프로젝트 소개

프로그래밍 예제

1.JPEG 프로그래밍 예제

2.더블 버퍼링 예제

3.이미지 스케일링

4.텍스트 필드에서 글자를 오른쪽으로

5.AWT에서 메뉴 숏컷

프로그래머를 위한 JAVA 2

이 책은 대학교 전산 전공자와 전산실에 근무하는 프로그래머들이 자버 언어를 체계적으로 기초에서부터 현업에서 사용할 수 있는 전문가 수준의 내용까지 배울 수 있도록 구성하였다 가격 25000원 출판사 : 홍릉 과학 출판사 페이지 : 824페이지

Copyright All right reservered by Byungwook Cho 1999.

http://50001.com/sub/jm.html (2 / 2)2006-09-01 오전 1:57:36

최종명님의 자바 강좌 1. - 자바 초보자를 위해 I

자바 초보자를 위해..

이글은 숭실대학교 최종명님의 강좌에서 발최한 내용입니다. 최종명

자바 란 ?

간단하고(simple) 객체지향적이고(object-oriented) 분산처리되고(distributed) 인터프리트되고(interpreted) 강건하고(robust) 컴퓨터 하드웨어에 영향을 받지않고(architecture-neutral) 보안성이 있으며(secure) 포팅하기 쉽고(portable) 성능이 우수하고(hight-performance) 멀티쓰레드를 사용하고(multithreaded) 동적인(dynamic) 언어이다.

썬에서는 가전 제품을 제어하기 위해 초기에는 C++언어를 이용해서 oak 프로젝트를 추진하였지만 C++언어를 이용하는 경우에 잘못 사용된 포인터 때문에 너무 많은 디버깅 작업이 필요해지자 새로운 언어를 개발하기로 결정하였다. 새로운 언어는 C++언어의 문법과 유사하면서, 의미적으로 는 Smalltalk과 유사한 특징을 가지도록 했다. 특히 C++언어의 불필요하고 복잡한 포인터 연산과 가비지 콜렉션 등의 기능을 제거하였다.

oak 프로젝트를 수행하면서 컴퓨터 업계에는 새로운 기류가 형성되고 있었다. 바로 Mosaic 웹브라우저의 출현이었다. 1993년 마크 앤드슨은 모자익 웹브라우저를 개발하고, 1994년 넷스케입사를 설립하였다. 웹브라우저의 출현으로 oak 프로젝트는 가전 제품을 위한 언어에서 웹브라우저를 위한 언어로 방향을 급선회하게 되었다. 1995년 썬은 웹브라우저를 위한 언어로 Java를 발표하게되었다. 당시 정적이던 웹브라우저에 동적인 자바 애플릿은 큰 관심을 불러 일으켰다. 초기에 사용자들은 웹브라우저에서 수행되는 간단한 애플릿에 관심을 두었지만, 썬의 지속적인 홍보덕분으로 자바를 이용한 응용프로그램을 작성하는 프로그래머들이 점차 늘어나게 되었다.

썬에서는 자바언어를 이용해 프로그램을 개발할 수 있는 개발 환경(JDK)을 무료로 계속 지원하고 있으며, 이것은 자바의 개념을 점차 확대 시키는 계기가 되었다. 자바는 이제 단순한 언어가 아니라 개발 환경으로 확대된 것이다. 썬에서는 개발 환경을 지원하는 차원을 넘어서 점차 자바를 이용할 수 있는 분야를 확대시켜 나가고 있다. 자바를 이용해 개발한 핫자바 브라우저, 핫자바뷰어 등의 사용자 응용프로그램에서 부터 swing, JMF 등의 각종 지원 클래스, javaOS 등의 시스템 프로그램, 자바 반지, 자바 카드, 피코 자바 등의 하드웨어까지 응용 분야를 넓히고 있다. 자바는 언어, 개발 환경의 개념을 넘어서 이제는 하나의 컴퓨팅환경으로 자리잡아가고 있는 것이다.

http://www.javastudy.co.kr/docs/jm/jm1.html (1 / 8)2006-09-01 오전 1:58:27

최종명님의 자바 강좌 1. - 자바 초보자를 위해 I

자바 관련 서적

자바와 관련된 서적은 세계적으로 1997년 11월 현재 900여권을 넘어서고 있다. 정말 수도 없이 많은 책들이 있는 것이다. 초보자들에게 책을 선정하는 것도 쉬운일은 아니다.

The Java Programming Language 우선 자바 언어를 개발한 주역인 제임스 고슬링이 직접 저술한 "The Java Programming Language" 는 Addison Wesley 출판사에서 출간되었다. 자바 언어 자체를 조금 깊이 알아보고 싶은 분에게 꼭 권하고 싶은 책이다. 일반 초보자에게는 좀 지겨운 느낌이 들지도 모르겠다.

Java in Nutshell 저자는 David Flanagan 이고 첫판과 두번째 판이 나와있다. 첫번째 판은 JDK1.0 에 관해, 두번째 판은 JDK1.1에 관해 설명하고 있다. 간결하면서도 중요한 부분들을 잘 설명해두었기 때문에 자바 프로그래머에게 꼭 권하고 싶은 책이다. O'Reilly 출판사에서 출간되었다.

teach yourself Database Programming with JDBC teach yourself 시리즈 책으로 JDBC 프로그래밍에 관련해 잘 설명하고 있다. 저자는 Ashton Hobbs이고 Sams net에서 출간되었다.

Client/Server Programming with Java and CORBA 자바와 코바를 연결하려는 사람들에게 꼭 권하고 싶은 책이다. Robert Orfali 와 Dan Harkey 가 공동 저술하였고, John Willey & Sons에서 출간하였다.

http://www.javastudy.co.kr/docs/jm/jm1.html (2 / 8)2006-09-01 오전 1:58:27

최종명님의 자바 강좌 1. - 자바 초보자를 위해 I

Java Network Programming 저자는 Hughes 이고, Manning 출판사에서 출간되었다. 네트워크 및 I/O 스트림에 대해 자세히 설명하고 있다. 자바 네트워크 프로그래머에게 권장할만한 책이다.

Java Network Programming 저자는 Elliotte 이고 O'Reilly 출판사에서 출간되었다. 자바 네트워크 프로그래밍 팁을 중심으로 서술되어 있어서 네트워크 프로그래머에게 권할만한 책이다.

Java Threads Scott 과 Henry가 공동으로 저술한 책으로 자바 쓰레드를 이용하는 방법들이 기술되어 있다. O'Reilly 출판사에서 출간되었다.

Concurrent Programming in Java Doug Lea가 집필한 이 책은 자바의 쓰레드를 이용해서 병행응용프로그램을 작성하는 사람에게 권장할 만하다. 책은 Addison Wesley 출판사에서 출간되었고, 웹에서도 무료로 제공하고 있다.

http://www.javastudy.co.kr/docs/jm/jm1.html (3 / 8)2006-09-01 오전 1:58:27

최종명님의 자바 강좌 1. - 자바 초보자를 위해 I

modern compiler implementation in Java Andrew 가 쓴 이책은 Cambridge 출판사에서 출판되었고, 자바를 이용해서 컴파일러를 작성하는 사람들에게 권할 만 하다.

자바 관련 사이트

www.javasoft.com

자바를 개발한 썬(SUN)사의 공식 자바 사이트이다. 자바와 관련된 각종 문서와 각종 도구 및 JDK를 얻을 수 있는 사이트이다. http://www.javasoft.com/tutorial/ 디렉토리에는 자바 프로그래밍을 설명해주는 온라인 책이 있다. www.gamelan.com

세계의 수 많은 자바 프로그램을 모아놓은 곳이다. 다양한 자바 프로그램들을 분류해서 사용자에게 제공한다. 많은 자바 프로그램들이 소스를 공개해 놓고 있기 때문에 프로그램을 작성하기 전에 이곳에 있는 프로그램들을 참조하는 것이 바람직하다. www.javaworld.com

자바 월드는 온라인상에서 발행되는 자바관련 잡지이다. 96년부터 발행되는 이 잡지는 각종 자바 프로그래밍 기법을 설명해준다. 각종 프로그래밍 기법들을 소개하기 때문에 전문 프로그래머는 반드시 보아두어야할 사이트이다.

자바 언어 맛보기

1. 에디터를 이용해서 HelloWorld.java 라는 파일을 작성한다.

HelloWorld.java 파일

1 class HelloWorld { 2 3 // 주석 부분 4 public static void main (String args[]) { 5 6 String msg = "World"; 7 8 System.out.print("Hello "); 9 System.out.println(msg); 10 } 11 }

2. javac라는 자바 컴파일러를 이용해서 HelloWorld.java 파일을 컴파일한다.% javac HelloWorld.java

3. javac를 이용하여 컴파일하면 HelloWorld.class라는 파일이 생성된다.생성된 HelloWorld.class 파일은 java라는 자바 인터프리터에 의해 실행된다.

http://www.javastudy.co.kr/docs/jm/jm1.html (4 / 8)2006-09-01 오전 1:58:27

최종명님의 자바 강좌 1. - 자바 초보자를 위해 I

% java HelloWorld

HelloWorld.java 파일 설명자바 프로그램의 확장자는 .java이고 실행 파일의 확장자는 .class이다.1 class HelloWorld {자바는 객체지향 언어이다. 따라서 자바에서는 모든 것이 클래스 되어 있다.1번 문장은 HelloWorld라는 클래스를 정의하는 것이다.

javac를 이용하여 컴파일하면 각 클래스는 .class 확장자를 갖는 파일로 저장된다.

3 // 주석 부분/* */ : C 스타일 주석, 여러 줄에 걸쳐서 사용할 수 있다.// : C++ 스타일 주석, 한줄을 주석으로 사용할 때 편리하다./* **/ : javadoc을 이용하여 도큐먼트할 때 사용된다.

4 public static void main (String args[]) {public : 함수의 억세스 퍼미션을 의미static : void : 함수의 리턴 타입main : 함수 이름. main은 프로그램의 시작 함수이다.String args[] : main의 아규먼트, 스트링 배열

6 String msg = "World";String : 문자열을 나타내는 데이타 타입 클래스msg = "World" : msg 라는 변수에 World라는 문자열을 넣는다.; : 모든 문장은 ;로 끝난다.

8 System.out.print("Hello ");System : 자바가 제공하는 클래스 이름System.out.print : System 클래스의 out 멤버필드의 print라는 메소드. 화면에 문자를 출력하는데 사용된다."Hello " : Hello라는 문자열

9 System.out.println(msg);println : print line이라는 뜻이다. 문자열을 출력하고 라인을 바꾼다.msg : String 타입의 변수

10 }main함수의 끝을 의미한다. 모든 함수와 블락은 { }안에 들어간다.

http://www.javastudy.co.kr/docs/jm/jm1.html (5 / 8)2006-09-01 오전 1:58:27

최종명님의 자바 강좌 1. - 자바 초보자를 위해 I

11 }C 나 C++와는 다르게 클래스의 모든 메소드는 클래스안에 정의되어 있어야한다. 이것은 PASCAL과 유사하다.

자바 애플릿 만들어보기

1. 에디터를 이용하여 Hello.java 파일을 작성한다.

1 import java.awt.*; 2 import java.applet.*; 3 4 public class Hello extends Applet { 5 private String Greeting[] = { 6 "Hello, world" 7 }; 8 9 public void paint(Graphics g) { 10 g.drawString(Greeting[0], 25, 25); 11 } 12 }

2. 에디터를 이용해서 Hello.html파일을 작성한다.

1 <html><head><title>Hello</title></head> 2 <body> 3 <applet code=Hello.class width=250 height=250> 4 </applet> 5 </body> 6 </html>

3. javac를 이용해서 Hello.java를 컴파일한다.% javac Hello.java

4. appletviewer나 넷스케이프를 이용해서 Hello.html 파일을 본다.% appletviewer Hello.html

http://www.javastudy.co.kr/docs/jm/jm1.html (6 / 8)2006-09-01 오전 1:58:27

최종명님의 자바 강좌 1. - 자바 초보자를 위해 I

Hello.java 파일 설명애플릿(applet) : 웹브라우저 상에서 실행되는 프로그램(Hello.java) appletviewer 나 넷스케이프를 이용해서 실행시킨다.

어플리케이션 : 일반적인 응용 프로그램(HelloWorld.java) java라는 인터프리터를 이용해서 실행시킨다.

1 import java.awt.*;import : C 언어의 #include 에 해당된다.java.awt : 자바언어가 제공하는 패키지 이름이다. 패키지란 비슷한 종류의 클래스를 모아서 만든 클래스들의 모임이다. java.awt 패키지는 GUI나 그래픽에 관련된 클래스들의 모임이다.java.awt.* : java.awt 패키지에 있는 모든 클래스를 의미한다.

2 import java.applet.*;java.applet : 애플릿 프로그램을 작성하기 위해서 만든 에플릿 패키지이다.java.applet.* : 애플릿 패키지의 모든 클래스.

4 public class Hello extends Applet {public : 클래스의 억세스 퍼미션class Hello : Hello 라는 클래스를 선언한다.extends : Applet 클래스에서 상속받아 Hello 라는 클래스를 만들겠다는 의미이다.Applet : java.applet패키지에 있는 Applet 클래스

5 private String Greeting[] = {private : 클래스 멤버 필드의 억세스 퍼미션String Greeting[] : Hello 클래스의 멤베 필드. 타입은 문자열 배열 = { : 배열에 값을 초기화하기 위해서 사용되었다.

6 "Hello, world"Greeting[0]에 Hello, world라는 문자열로 초기화 했다.

7 };}; : Greeting 문자열 배열에 초기화를 끝내고 블락을 닫았다.

9 public void paint(Graphics g) {public : 함수의 억세스 퍼미션void : 함수의 리턴 타입 void는 아무것도 리턴하지 않는다.paint : Hello 클래스의 메소드Graphics : 그림을 그리는데 필요한 정보를 가지고 있는 자료 구조 타입

http://www.javastudy.co.kr/docs/jm/jm1.html (7 / 8)2006-09-01 오전 1:58:27

최종명님의 자바 강좌 1. - 자바 초보자를 위해 I

10 g.drawString(Greeting[0], 25, 25);g.drawString : 문자열을 화면에 그린다. 애플릿에서는 System.out.print를 이용해서 화면에 문자열을 출력할 수 없다.Greeting[0], 25, 25 : 문자열 Greeting[0]을 X좌표 25, Y좌표 25에 그린다.

11 }paint 메소드의 끝을 의미한다.

12 }Hello 클래스의 끝을 의미한다.

http://www.javastudy.co.kr/docs/jm/jm1.html (8 / 8)2006-09-01 오전 1:58:27

최종명님의 자바강좌 2 - 초보자가 하기쉬운 실수

<%@ Language=VBScript %>

자바 초보자가 자주 범하는 실수들

1. 자바는 대소문자를 구별한다. 도스에서는 대소문자를 구별하지 않기 때문에, 자바 파일 이름도 대소문자 구별없이 사용하는 경우가 많이 있는데, 유감스럽게도 자바는 프로그램내에서 는 물론 파일 이름도 대소문자를 구별한다.

2. 한글이름으로 된 디렉토리에서는 잘 안된다. 도스에서 한글 이름의 디렉토리를 사용하는 경우에도 자바에서는 문제가 될 수 있다. 이것은 주로 클래스 패스를 찾는 동안에 한글 이름의 디렉토리는 자바가 잘 인식하지 못하기 때문이다.

3. 자바 소스 파일은 .java 로 끝나고, 텍스트 형태로 저장해야한다. 윈도우 95에서 자바 소스 파일을 편집하는데 많이 사용되는 편집기는 메모장이나 MS 워드 등 이다. 메모장이나 워드를 사용하는 경우에 자바 소스 파일의 이름이 .java로 끝나는지 확인해봐야 한다. 특히 워드로 작성하는 경우에는 워드 포맷이 아닌 텍스트 형태로 저장하는 것을 잊어서는 안된다.

4. 자바 실행 파일 패스와 클래스 패스가 제대로 설정되어야 한다. autoexec.bat 파일에 다음 변수가 설정되어 있어야한다. set JAVA_HOME=c:₩java set CLASSPATH=.;c:₩java₩lib₩classes.zip PATH=%PATH%;%JAVA_HOME%₩bin

5. main()이 있는 클래스를 실행시켜야 한다. 초보자들은 때로는 main()이 없는 클래스를 java 인터프리터로 실행하려고 한다. main()이 없는 클래스는 java 인터프리터로 실행시킬 수 없다.

6. main은 항상 public static void main(String args[]) { } 형태이다.

7. 애플릿으로 작성한 클래스는 항상 public 이다. 자바가 처음 나왔을 때 teach yourself 책들 중 하나가 애플릿을 public으로 선언하지 않은 프로그램이 애플릿 프로그램 첫 예제로 나온적이 있었다. 물론 당시 자바책도 많지 않은 상황에서 자바를 배우려는 사람들은 이 부분에서 많이 고생했을 것이다. 애플릿 클래스는 항상 public이어야 한다.

8. 한 파일에 public 클래스는 1개를 초과할 수 없다. 한 파일에는 public 클래스가 최대 1개이다. 1개를 초과하는 경우에는 컴파일시에

http://www.javastudy.co.kr/docs/jm/jm2.html (1 / 3)2006-09-01 오전 1:58:44

최종명님의 자바강좌 2 - 초보자가 하기쉬운 실수

에러 메시지를 보여준다.

9. public 으로 선언된 클래스가 있는 경우에 파일 이름은 클래스 이름과 동일해야 한다.

10. 생성자(constructor)는 리턴 타입이 없고, 클래스 이름과 동일 하다. 어떤 때는 클래스의 생성자가 제대로 작동하니 않응 경우가 있다. 이런 경우에는 대부분 생성자 선언이 잘못되어 있기 때문이다. 생성자는 클래스 이름과 동일해야하고 리턴 타입이 없어야 한다. 리턴 타입이 있는 경우에는 다른 일반 함수로 인식하게 된다.

11. 애플릿은 애플릿뷰어나 웹브라우저를 이용해서 실행시켜야한다.

12. HTML에서 애플릿의 width와 height 사이에는 ","가 없다. <applet code=클래스파일 width=300 height=200> </applet>

13. 자바에서 제공하는 클래스 이름과 동일한 이름으로 클래스를 만들지 않는 것이 좋다.

14. 클래스의 멤버 필드와 함수의 아규먼트 이름이 같은 경우, 아규먼트의 이름이 우선순위가 높다. 예를 들면, public class Test { int x; public Test(int x) { x = x; } } 는 원하는 결과를 얻을 수 없다. 프로그래머는 멤버필드 x 에 아규먼트로 들어온 값을 할당하려고 하였는데 결과는 아규먼트 x 에 아규먼트 자신의 값을 다시 할당한 결과가 되었다. 이런 경우에는 항상 클래스의 멤버필드임을 확실히 하기 위해서 this 레퍼런스를 사용한다. 즉, this.x = x; 형태로 변경해야한다.

15. HTML에서 애플릿의 code 부분에 클래스 이름이 정확한가 확인해보라. <applet code=클래스파일이름 width=300 height=200> </applet> 에서 "클래스파일이름"의 철자가 틀리는 경우에 IOException 에러가 발생한다. 철자가 틀리지 않도록 조심해야한다.

16. BorderLayout에서 컴포넌트를 붙이는 경우 "East", "South", "West", "North", "Center" 의 대소문자 구별 및 철자에 유의해야한다. 철자가 틀리는 경우에 컴포넌트가 화면에 안보일 수 있다.

http://www.javastudy.co.kr/docs/jm/jm2.html (2 / 3)2006-09-01 오전 1:58:44

최종명님의 자바강좌 2 - 초보자가 하기쉬운 실수

http://www.javastudy.co.kr/docs/jm/jm2.html (3 / 3)2006-09-01 오전 1:58:44

최종명님의 자바강좌 3 - 애플릿 #1

<%@ Language=VBScript %>

애플릿의 기조 1

자바 프로그래밍 최종명

애플릿(applet)이란 웹브라우저 상에서 실행되는 프로그램을 말한다. 애플릿과는 다른 어플리케이션이라는 것도 있는데 이것은 우리가 일반적으로 알고 있는 응용 프로그램을 의미한다. 따라서 어플리케이션은 일반 컴퓨팅 환경에서 실행되는 프로그램을 의미하고, 애플릿이란 웹브라우저에서만 실행되는 프로그램을 의미한다. 프로그래머는 자바라는 언어를 이용해서 애플릿과 어플리케이션 프로그램을 모두 작성할 수 있다. 그러나 이곳에서는 주로 애플릿에 관련된 내용만 다루도록 하자. 이곳에서는 자바 언어의 특징이나 구조에 대해서 자세하게 언급하지는 않겠다. 이곳에서는 주로 제가 자바를 공부하면서 실습한 내용들로 꾸밀 예정이다.

다음은 Hello.java라는 애플릿 프로그램이다. 되도록이면 실제로 자신이 입력해보는 것이 바람직하다.

import java.awt.*; // 여기부터는 주석문..import java.applet.Applet; // import는 C-언어의 #include와 동일

public class Hello extends Applet { // Hello 라는 클래스를 선언 private String Greeting[] = { "Hello, world" };

public void paint(Graphics g) { // 웹브라우저에 Hello, world를 출력 g.drawString(Greeting[0], 25, 25); g.drawLine(25, 27, 150, 27); }}

작성된 자바 프로그램은 javac라는 자바 컴파일러를 이용해서 컴파일 시킨다. 자바 컴파일러는 목적 코드로 .class 파일을 생성한다. .class 파일은 자바 프로그램에서 정의한 클래스 이름마다 하나씩 생성된다. class 파일이 생성되면, html 파일에 애플릿을 인클루드(include)한다. 인클루드하기 위해서는 <applet>라는 태그를 이용한다.

http://www.javastudy.co.kr/docs/jm/jm3.html (1 / 2)2006-09-01 오전 1:58:53

최종명님의 자바강좌 3 - 애플릿 #1

<html><head><title>Hello</title></head><body><applet code=Hello.class width=250 height=250></applet></body></html>

작성된 애플릿을 실행시켜보기 위해서는 웹브라우저를 이용할 수도 있지만, 보통 썬에서 제공하는 appletviewer라는 프로그램을 이용한다. 다음 예는 자바 프로그램을 컴파일하고, 애플릿뷰어로 애플릿을 실행시키는 내용이다.

% javac Hello.java% appletviewer Hello.html

http://www.javastudy.co.kr/docs/jm/jm3.html (2 / 2)2006-09-01 오전 1:58:53

최종명님의 자바강좌 4 - 애플릿 #2

<%@ Language=VBScript %>

애플릿의 기초 2

여기서는 앞장에서 한 Hello.java를 조금 변형해보자.

import java.awt.*;import java.applet.Applet;

public class Hello extends Applet { Image img; //그림을 위한 변수를 선언 했다. Image img2;

private String Greeting[] = { "Hello, world" };

public void init() {

// 원하는 그림을 읽어들인다. //여러분은 가지고 있는 그림 이름으로 다음 두 줄을 변경해야 한다. img = getImage(getDocumentBase(), "../img/book.gif"); img2 = getImage(getDocumentBase(), "../img/runroom.gif"); }

public void paint(Graphics g) {//drawString은 (25,25)에서 부터 문자열을 출력한다. g.drawString(Greeting[0], 25, 25);

//drawLine은 (25,27)과 (150,27) 두점을 연결하는 선을 그린다. g.drawLine(25, 27, 150, 27);

//drawImage는 읽어들인 그림을 출력한다. g.drawImage(img, 25, 33, this); g.drawImage(img2, 100, 33, this); }}

http://www.javastudy.co.kr/docs/jm/jm4.html2006-09-01 오전 1:58:56

최종명님의 자바강좌 5 - 제어구조

<%@ Language=VBScript %>

자바 프로그래밍 기초 최종명

자바는 C나 C++와 비슷한 연산자와 제어 구조를 가지고 있다. 이제 자바언어의 제어구조의 형태와 제어 구조를 이용한 간단한 프로그램들을작성해보자.

IF 문

if (boolean) { statements;} else { statements;}

HelloSomebody.java 파일

1 class HelloSomebody { 2 3 public static void main (String args[]) { 4 5 System.out.print("Hello "); 6 if (args.length > 0) { 7 System.out.println(args[0]); 8 } 9 else { 10 System.out.println("?????"); 11 } 12 } 13 }

% javac HelloSomebody.java% java HelloSomebody CHOIHello CHOI --> 실행 결과% java HelloSomebodyHello ????? --> 실행 결과

http://www.javastudy.co.kr/docs/jm/jm5.html (1 / 5)2006-09-01 오전 1:59:09

최종명님의 자바강좌 5 - 제어구조

FOR 문

for(init_expr; test_expr2; increment_expr3) { statements;}

HelloFrields.java 파일

1 class HelloFrields { 2 3 public static void main (String args[]) { 4 5 int i; 6 7 System.out.print("Hello "); 8 for (i=0; i < args.length; i++) { 9 System.out.print(args[i]); 10 System.out.print(" "); 11 } 12 System.out.println(); 13 } 14 }

% javac HelloFrields.java% java HelloFrields CHOI LEE KIM SONG PARK YANGHello CHOI LEE KIM SONG PARK YANG --> 실행 결과

while 문

while(boolean) { statements;

http://www.javastudy.co.kr/docs/jm/jm5.html (2 / 5)2006-09-01 오전 1:59:09

최종명님의 자바강좌 5 - 제어구조

}

HelloFriendsWhile.java 파일

1 class HelloFriendsWhile { 2 3 public static void main (String args[]) { 4 5 int i = 0; 6 7 System.out.print("Hello "); 8 while(i < args.length) { 9 System.out.print(args[i]); 10 System.out.print(" "); 11 i++; 12 } 13 System.out.println(); 14 } 15 }

% javac HelloFriendsWhile.java% java HelloFriendsWhile CHOI LEE KIM SONG PARK YANGHello CHOI LEE KIM SONG PARK YANG --> 실행 결과

do-while 문

do { statements;} while(boolean);

http://www.javastudy.co.kr/docs/jm/jm5.html (3 / 5)2006-09-01 오전 1:59:09

최종명님의 자바강좌 5 - 제어구조

1 class HelloFriendsDoWhile { 2 3 public static void main (String args[]) { 4 5 int i = 0; 6 7 System.out.print("Hello "); 8 do { 9 System.out.print(args[i]); 10 System.out.print(" "); 11 i++; 12 } while(i < args.length); 13 System.out.println(); 14 } 15 }

% javac HelloFriendsDoWhile.java% java HelloFriendsDoWhile CHOI LEE KIM SONG PARK YANGHello CHOI LEE KIM SONG PARK YANG --> 실행 결과

switch 문

switch(expr) { case expr1: statements; break; case expr2: statements; break; default: statements; break;}

http://www.javastudy.co.kr/docs/jm/jm5.html (4 / 5)2006-09-01 오전 1:59:09

최종명님의 자바강좌 5 - 제어구조

YesOrNo.java 파일

1 import java.io.*; 2 3 class YesOrNo { 4 public static void main(String args[]) { 5 6 System.out.println("Yes/No ?"); 7 try { 8 char c = (char)System.in.read(); 9 10 switch(c) { 11 case 'y': 12 case 'Y': 13 System.out.println("Yes"); 14 break; 15 case 'n': 16 case 'N': 17 System.out.println("No"); 18 break; 19 default: 20 System.out.println("Wrong answer"); 21 break; 22 } 23 }catch(IOException e) {} 24 } 25 }

% javac YesOrNo.java% java YesOrNoYes/No ?y <-- 사용자 입력Yes

http://www.javastudy.co.kr/docs/jm/jm5.html (5 / 5)2006-09-01 오전 1:59:09

최종명님의 자바강좌 6 - AWT

<%@ Language=VBScript %>

자바 프로그래밍 기초 최종명

AWT 클래스

프레임(Frame)1. new 를 이용해서 프레임을 생성한다.2. resize()함수를 호출해서 크기를 조정한다.3. 원도우를 화면에 출력하기 위해서는 show() 함수를 호출한다.

http://www.javastudy.co.kr/docs/jm/jm6.html (1 / 14)2006-09-01 오전 1:59:30

최종명님의 자바강좌 6 - AWT

import java.awt.*;

public class FrameDemo {

public static void main(String[] args) { Frame f = new Frame();

f.resize(300, 200); f.show(); }}

버튼(Button)

StandardButton.java 파일

import java.awt.*;import java.applet.Applet;

public class StandardButton extends Applet { Button button1,button2,button3;

public void init() { button1 = new Button("OK"); button2 = new Button("Cancle"); button3 = new Button("Help"); add(button1); add(button2); add(button3); }

public boolean action (Event evt, Object arg) { if (evt.target instanceof Button) { handleButton(evt,arg); return true; } return false; }

public void handleButton(Event evt, Object arg) { if("OK".equals((String) arg)) System.out.println("OK"); else if("Cancel".equals((String) arg)) System.out.println("Cancel"); else if("Help".equals((String) arg)) System.out.println("Help");

http://www.javastudy.co.kr/docs/jm/jm6.html (2 / 14)2006-09-01 오전 1:59:30

최종명님의 자바강좌 6 - AWT

}}

체크박스버튼(CheckboxButton)

CheckboxButton.java 파일

import java.awt.*;import java.applet.Applet;

public class CheckboxButton extends Applet { public void init() { add(new Checkbox("Cake")); add(new Checkbox("Ice cream")); add(new Checkbox("Pie")); } public boolean action (Event evt, Object arg) { if (evt.target instanceof Checkbox) { handleCheckbox(evt,arg); return true; } return false; }

public void handleCheckbox(Event evt,Object arg) { System.out.print(((Checkbox)evt.target).getLabel()); System.out.println("=" + arg); }}

선택버튼(ChoiceButton)

http://www.javastudy.co.kr/docs/jm/jm6.html (3 / 14)2006-09-01 오전 1:59:30

최종명님의 자바강좌 6 - AWT

ChoiceButton.java 파일

import java.awt.*;import java.applet.Applet;

public class ChoiceButton extends Applet { Choice myChoice; public void init() { myChoice = new Choice(); myChoice.addItem("One for the money..."); myChoice.addItem("Two for the show..."); myChoice.addItem("Three to get ready..."); myChoice.addItem("And away we go!"); add(myChoice); } public boolean action(Event evt,Object arg) { if (evt.target instanceof Choice) { handleChoice(evt,arg); return true; } return false; }

public void handleChoice(Event evt,Object arg) { System.out.println(arg); }}

리스트(List)

http://www.javastudy.co.kr/docs/jm/jm6.html (4 / 14)2006-09-01 오전 1:59:30

최종명님의 자바강좌 6 - AWT

ListDemo.java 파일

import java.awt.*;import java.applet.Applet;

public class ListDemo extends Applet { List l1,l2; public void init() { l1 = new List(5,false); l1.addItem("Choose"); l1.addItem("ONE"); l1.addItem("word"); l1.addItem("from"); l1.addItem("this"); l1.addItem("list"); add(l1); l2 = new List(5,true); l2.addItem("as"); l2.addItem("many"); l2.addItem("words"); l2.addItem("from"); l2.addItem("this"); l2.addItem("list"); l2.addItem("as"); l2.addItem("you"); l2.addItem("want"); add(l2); }

public boolean action(Event evt,Object arg) { if (evt.target instanceof List) { handleListAction(evt, arg); return true; } return false; } public void handleListAction(Event evt, Object arg) { System.out.println("You double clicked o '"+ arg + "'."); }}

http://www.javastudy.co.kr/docs/jm/jm6.html (5 / 14)2006-09-01 오전 1:59:31

최종명님의 자바강좌 6 - AWT

텍스트영역(TextArea)

TextAreaDemo.java 파일

import java.awt.*;import java.applet.Applet;

public class TextAreaDemo extends Applet { TextArea ta1,ta2,ta3;

public void init() { ta1 = new TextArea(); add(ta1); ta2 = new TextArea("Hello",3,20); add(ta2); ta3 = new TextArea("Not editable",3,20); ta3.setEditable(false); add(ta3); }

public boolean action(Event evt,Object arg) { if (evt.target instanceof TextArea) { handleTextArea(evt, arg); return true; } return false; } public void handleTextArea(Event evt, Object arg) { System.out.println("You typed'"+ arg + "'."); }}

http://www.javastudy.co.kr/docs/jm/jm6.html (6 / 14)2006-09-01 오전 1:59:31

최종명님의 자바강좌 6 - AWT

스크롤바(Scrollbar)

scroll.java 파일

import java.awt.*;

public class scroll extends Frame{ Scrollbar hbar; Label veryLong; int offset; Point p; Dimension s;

public scroll() { offset = 0; veryLong = new Label("This is very long label for demonstrating how to working with scroll bar"); hbar = new Scrollbar(Scrollbar.HORIZONTAL); setLayout(new BorderLayout(0,0)); add("South", hbar); add("Center", veryLong); }

public boolean handleEvent(Event e) { if(e.target == hbar) { switch(e.id) { case Event.SCROLL_LINE_UP: case Event.SCROLL_LINE_DOWN: case Event.SCROLL_PAGE_DOWN: case Event.SCROLL_PAGE_UP: offset = ((Integer)e.arg).intValue(); m(offset); break; } } return true; }

public void m(int o) {

p = veryLong.location(); s = veryLong.size(); veryLong.move(-o, p.y); veryLong.resize(s.width+o,s.height); }

public static void main(String[] args) { scroll s = new scroll(); s.resize(100, 80); s.show(); }}

http://www.javastudy.co.kr/docs/jm/jm6.html (7 / 14)2006-09-01 오전 1:59:31

최종명님의 자바강좌 6 - AWT

레이아웃 매니저

화면에 AWT 구성 요소들의 모양과 위치는 2가지 요소에 의해서 결정된다.첫번째는 AWT 요소들이 패널에 추가되는 순서이고, 두번째는 레이아웃매니저이다. 레이아웃 매니저는 화면에서 각 AWT요소들을 어디에 위치시킬 것인가를 결정한다.AWT는 "FlowLayout", "GridLayout", "BorderLayout", "CardLayout"의기본적인 4가지 레이아웃을 제공한다.

FlowLayoutFlow 레이아웃은 컨테이너에 컴포넌트들을 가로나 세로방향의 줄단위로늘어놓을 때 적절하게 사용된다. 만약 구성 요소들이 한 줄에 들어가지않으면 다음 줄로 이동한다. FlowLayout은 각 줄 안에서 정렬위치를 결정할 수 있는 alignment 값을 가지고 있다. alignment의 기본 값은 "CENTER"이고, 이것은 구성 요소를 중앙에 정렬시킨다.Panel 컨테이너는 디폴트로 Flow 레이아웃을 이용한다.setLayout(new FlowLayout());

http://www.javastudy.co.kr/docs/jm/jm6.html (8 / 14)2006-09-01 오전 1:59:31

최종명님의 자바강좌 6 - AWT

FlowTest.java 파일

import java.applet.*;import java.awt.*;

public class FlowTest extends java.applet.Applet { public void init() {

setLayout(new FlowLayout()); add(new Button("1")); add(new Button("2")); add(new Button("3")); add(new Button("4")); add(new Button("5")); add(new Button("6")); add(new Button("7")).hide(); add(new Button("8")); add(new Button("9")); add(new Button("10")); add(new Button("11")); }

}

BorderLayoutBorderLayout은 컨테이너에 컴포넌트들의 위치를 "동/서/남/북/중앙"중에서하나를 지정해서 사용할 수 있다. 모든 가장 자리의 요소들은 필요한 크기만큼배열되고, 중앙에 있는 요소는 만은 여백을 사용한다.setLayout(new BorderLayout());add("North", new TextField("Name", 30));

http://www.javastudy.co.kr/docs/jm/jm6.html (9 / 14)2006-09-01 오전 1:59:31

최종명님의 자바강좌 6 - AWT

BorderTest.java 파일

import java.io.*;import java.awt.*;import java.applet.*;public class BorderTest extends Applet { public void init() { setLayout(new BorderLayout(5, 5)); add("North", new Button("North")); add("Center", new Button("Center")); add("South", new Button("South")); add("West", new Button("West")); add("East", new Button("East")); show(); }}

Grid 레이아웃Grid 레이아웃은 컴포넌트들을 행열식으로 행과 열의 수에 맞게 배치할 때 사용된다. 컴포넌트들의 위치는 맨윗줄부터 시작해서 왼쪽에서 오른쪽으로움직이며 각 줄을 이동한다. add()메소드를 호출하는 순서에 따라 컴포넌트의위치가 달라진다. Grid 레이아웃을 생성하기 위해서는 행과 열을 지정해야한다.각 행과 열의 크기가 동일하기 때문에 Grid 레이아웃에서는 각 컴포넌트는 동일한 크기를 갖는다.setLayout(new GridLayout(3,4));

http://www.javastudy.co.kr/docs/jm/jm6.html (10 / 14)2006-09-01 오전 1:59:31

최종명님의 자바강좌 6 - AWT

GridTest.java 파일

import java.applet.*;import java.awt.*;

class GridPanel extends Panel { GridPanel(int rows, int cols) { setLayout(new GridLayout(rows, cols, 5, 5)); add(new Button("1")); add(new Button("2")); add(new Button("3")); add(new Button("4")); add(new Button("5")); add(new Button("6")); add(new Button("7")); add(new Button("8")); add(new Button("9")); add(new Button("10")); add(new Button("11")); }}

public class GridTest extends Applet { public void init() { setFont(new Font("Dialog", Font.PLAIN, 16)); setLayout(new BorderLayout()); Panel p = new GridPanel(3, 4); add("Center", p); p.add(new GridPanel(4, 3)); show(); }

http://www.javastudy.co.kr/docs/jm/jm6.html (11 / 14)2006-09-01 오전 1:59:31

최종명님의 자바강좌 6 - AWT

}

GridBag 레이아웃자바에서 가장 복잡한 레이아웃 이 GridBag 레이아웃이다. GridBag 레이아웃은 Grid 레이아웃과 비슷한 성질을 가지고 있지만, 각 컴포넌트의 크기가 동일할 필요는 없다는 것이 차이점이다. GridBag 레이아웃은 GridBagConstraints를이용해서 컴포넌트의 위치를 지정해 줄 수 있다.

GridBagConstraints 변수gridx, gridy컴포넌트의 좌측 상단 모서리의 시작 위치를 지정한다. 화면의 좌측 상단 모서리의좌표 값은 gridx=0, gridy=0 이다. 컴포넌트의 좌측 상단 시작 위치를 이전 컴포넌트가끝나는 곳 다음부터(이전 컴포넌트의 오른쪽 혹은 아래쪽) 사용하고자 할 때는 GridBagConstraints.RELATIVE 값을 사용한다. 기본값은 GridBagConstraints.RELATIVE로 정의되어 있다.

gridwidth, gridheight컴포넌트가 화면에 출력되는 행과 열의 셀(cell) 수를 지정한다. 기본값은 1로 정의되어있다. gridwidth의 값으로 GridBagConstraints.REMAINDER이 설정되면 컴포넌트는 행의마지막에 위치하고, gridheight의 값으로 설정되면 열의 마지막에 위치한다. GridBagConstraints.RELATIVE 로 값이 설정되면, 행과 열의 마지막 컴포넌트 옆에 위치한다.

fill컴포넌트의 크기가 컨테이너보다 커야할 때 사용된다. GridBagConstraints.NONE 으로값이 설정되면 컨테이너의 크기는 변경되지 않는다. GridBagConstraints.HORIZONTAL으로설정되면 가로측이 확장된다. GridBagConstraints.VERTICAL인 경우에는 세로측이확장된다. GridBagConstraints.BOTH인 경우에는 가로 세로 방향으로 모두 확장된다.

ipadx, ipady

insets

anchor컴포넌트의 크기가 컨테이너보다 작은 경우에 컴포넌트를 컨테이너의 어느 곳에위치시킬 것인가를 결정한다. 사용 가능한 값으로는 GridBagConstraints.CENTER (기본값) GridBagConstraints.NORTH GridBagConstraints.NORTHEAST GridBagConstraints.EAST GridBagConstraints.SOUTHEAST GridBagConstraints.SOUTH GridBagConstraints.SOUTHWEST GridBagConstraints.WEST GridBagConstraints.NORTHWEST

http://www.javastudy.co.kr/docs/jm/jm6.html (12 / 14)2006-09-01 오전 1:59:31

최종명님의 자바강좌 6 - AWT

weightx, weighty

GridBagTest.java 파일

import java.awt.*;import java.util.*;import java.applet.Applet;

public class GridBagTest extends Applet { protected void makebutton(String name, GridBagLayout gridbag, GridBagConstraints c) {

Button button = new Button(name); gridbag.setConstraints(button, c); add(button); }

public void init() { GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); setFont(new Font("Helvetica", Font.PLAIN, 14)); setLayout(gridbag); c.fill = GridBagConstraints.BOTH;

c.weightx = 1.0; makebutton("Button1", gridbag, c); makebutton("Button2", gridbag, c); makebutton("Button3", gridbag, c); c.gridwidth = GridBagConstraints.REMAINDER; makebutton("Button4", gridbag, c); c.weightx = 0.0; makebutton("Button5", gridbag, c); c.gridwidth = GridBagConstraints.RELATIVE; makebutton("Button6", gridbag, c); c.gridwidth = GridBagConstraints.REMAINDER; makebutton("Button7", gridbag, c); c.gridwidth = 1; c.gridheight = 2;

http://www.javastudy.co.kr/docs/jm/jm6.html (13 / 14)2006-09-01 오전 1:59:31

최종명님의 자바강좌 6 - AWT

c.weighty = 1.0; makebutton("Button8", gridbag, c); c.weighty = 0.0; c.gridwidth = GridBagConstraints.REMAINDER; c.gridheight = 1; makebutton("Button9", gridbag, c); makebutton("Button10", gridbag, c); resize(300, 100); }}

http://www.javastudy.co.kr/docs/jm/jm6.html (14 / 14)2006-09-01 오전 1:59:31

최종명님의 자바강좌 7 - EVENT

<%@ Language=VBScript %>

자바 : 이벤트 처리 최종명

대부분의 프로그램은 사용자의 명령어를 기다리고 있다가, 사용자의 액션에 반응해서 작동하게 된다. 마우스 버튼 클릭, 더블클릭, 마우스 이동 등의 모든 사용자 액션에 대해 응답하는 형태로 작동하도록 프로그래밍하는 것을 이벤트-드리븐(event-driven)프로그래밍이라고 한다. 윈도우 환경에서는 대부분의 응용프로그램이 이벤트-드리븐 프로그래밍 방식으로 작성된다. 자바의 AWT에서도 물론 이벤트-드리븐 프로그래밍을 지원한다. 자바에서는 모든 사용자의 액션을 이벤트라는 클래스로 표현하고 있다. 사용자의 액션에의해 발생된 이벤트 객체는 사용자의 액션에 관련된 정보를 가지고 있다.

● 이벤트 타입 정보 : 예) 마우스 클릭, 키보드 키 누름 등 ● 이벤트 타겟 : 예) 사용자가 클릭한 버튼, 사용자가 입력한 텍스트 필드 등 ● 이벤트가 발생한 시각 ● 이벤트가 발생한 X-Y 좌표 위치 : 예) 마우스가 클릭된 위치 등 ● 눌려진 키보드 키 : 예) 사용자가 누른 키보드의 키값 ● 아규먼트 ● 모디파이어 키의 상태 : 예) Shift, Cntl 등

컴포넌트(Component) 클래스에서 이벤트를 처리하는 함수들이 정의되어 있다. 프로그래머는 원하는 경우에 이벤트 처리 함수를 overriding 방법을 통해 자신이 원하는 형태로 정의할 수 있다. 이벤트 처리 함수들 중에 가장 중요한 것은 handleEvent()라는 함수이다. handleEvent()는 모든 이벤트를 처리할 수 있는 함수이다. 컴포넌트에 이벤트가 발생되면 handleEvent()함수가 자동적으로 호출된다. handleEvent()는 모든 이벤트를 처리할 수 있지만 handleEvent() 함수 사용은 가급적 자제하는 것이 좋다. 왜냐하면, 모든 이벤트를 하나의 함수에서 모두 처리하기 때문에 함수의 크기가 너무 커진다. 이것은 프로그램 작성, 수정, 이해하는데 많은 장애 요인이 된다. 두번째 이유로는 많은 이벤트를 처리함으로서 이벤트 간에 상호 작용에 의해 원하지 않는 결과를 가져올 수 있다. 컴포넌트(Component) 클래스에서는 handleEvent()이외에 특정 이벤트만 처리할 수 있는 함수들을 제공한다. 따라서 이런 특정 이벤트만 처리하는 함수가 정의되어 있으면, 원하는 이벤트가 발생하는 경우 handleEvent()함수가 자동적으로 해당되는 이벤트 처리 함수를 호출한다. 이러한 함수들로는 다음과 같은 것들이 있다.

http://www.javastudy.co.kr/docs/jm/jm7.html (1 / 9)2006-09-01 오전 1:59:59

최종명님의 자바강좌 7 - EVENT

모든 이벤트 처리 함수들은 적어도 하나의 아규먼트(Event)를 가지며, boolean 값을 리턴한다. 이벤트 처리 함수가 false를 리턴하면, 이것은 이벤트 핸들러가 이벤트를 상위 컴포넌트 계층으로 전달한다는 것을 의미한다. 반대로, true를 리턴하면 이벤트는 더 이상 전달되지 않고 현재 이벤트 처리 함수에서 처리된다는 것을 의미한다. handleEvent()함수는 모든 이벤트가 적당한 이벤트 처리 함수에 전달되도록 super.handleEvent()를 리턴 값으로 호출해주어야 한다.

public boolean handleEvent(Event e) { if(e.target instanceof Scrollbar) { textField.setText(String.valueOf(slider.getValue())); } return super.handleEvent(e);}

다음과 같은 모양의 애플릿을 작성하였다. 이 애플릿은 사용자가 버튼을 클릭하면 텍스트 영역에 이벤트가 전달되는 과정을 기록한다.

http://www.javastudy.co.kr/docs/jm/jm7.html (2 / 9)2006-09-01 오전 1:59:59

최종명님의 자바강좌 7 - EVENT

다음 그림은 앞 그림에서 본 애플릿의 계층적 구성도이다. 그림에서 화살표는 사용자가 버튼을 클릭하는 경우 이벤트가 상위 계층으로 전달되는 과정을 보여주고 있다.

파일 Example1.java

import java.awt.*;

class NewButtonEx1 extends Button{ private TextArea ta;

public NewButtonEx1(String str, TextArea ta) { super(str); this.ta = ta; }

public boolean handleEvent(Event evt) { if (evt.id == Event.ACTION_EVENT) { ta.appendText("Button " + getLabel() + " saw action...₩n"); }

return super.handleEvent(evt); }

http://www.javastudy.co.kr/docs/jm/jm7.html (3 / 9)2006-09-01 오전 1:59:59

최종명님의 자바강좌 7 - EVENT

}

class NewPanelEx1 extends Panel{ private String str; private TextArea ta;

public NewPanelEx1(String str, TextArea ta) { super(); this.str = str; this.ta = ta; }

public Insets insets() { return new Insets(5, 5, 5, 5); }

public void paint(Graphics g) { g.drawRect(0, 0, size().width - 1, size().height - 1); }

public boolean handleEvent(Event evt) { if (evt.id == Event.ACTION_EVENT) { ta.appendText("Panel " + str + " saw action...₩n"); } else if (evt.id == Event.MOUSE_DOWN) { ta.appendText("Panel " + str + " saw mouse down...₩n"); }

return super.handleEvent(evt); }}

public class Example1 extends java.applet.Applet{ TextArea ta = new TextArea();

public void init() { setLayout(new BorderLayout());

add("Center", ta);

NewPanelEx1 p1 = new NewPanelEx1("1", ta); NewPanelEx1 p2 = new NewPanelEx1("2", ta);

p2.add(new NewButtonEx1("One", ta)); p2.add(new NewButtonEx1("Two", ta));

p1.add(p2);

http://www.javastudy.co.kr/docs/jm/jm7.html (4 / 9)2006-09-01 오전 1:59:59

최종명님의 자바강좌 7 - EVENT

add("South", p1); }

public Dimension preferredSize() { return new Dimension(400, 230); }

public Insets insets() { return new Insets(5, 5, 5, 5); }

public boolean handleEvent(Event evt) { if (evt.id == Event.ACTION_EVENT) { ta.appendText("Applet saw action...₩n₩n"); } else if (evt.id == Event.MOUSE_DOWN) { ta.appendText("Applet saw mouse down...₩n₩n"); }

return super.handleEvent(evt); }

public static void main(String [] args) { Frame f = new Frame("Example 1");

Example1 ex = new Example1();

ex.init();

f.add("Center", ex);

f.pack(); f.show(); }}

다음 그림은 이벤트를 테스트하는 애플릿이다. 각종 이벤트가 발생할 때마다 System.out.println()을 이용해서 화면에 내용을 출력하도록 하였다.

http://www.javastudy.co.kr/docs/jm/jm7.html (5 / 9)2006-09-01 오전 1:59:59

최종명님의 자바강좌 7 - EVENT

파일 EventTutor.java

import java.applet.Applet;import java.awt.*;

public class EventTutor extends Applet {

public void init() { System.out.println("init event"); }

public void paint(Graphics g) { System.out.println("paint event"); }

public void start() { System.out.println("start event"); }

public void destroy() { System.out.println("destroy event");

http://www.javastudy.co.kr/docs/jm/jm7.html (6 / 9)2006-09-01 오전 1:59:59

최종명님의 자바강좌 7 - EVENT

}

public void update(Graphics g) { System.out.println("update event"); }

public boolean mouseUp(Event e, int x, int y) { System.out.println("mouseUp event"); return false; }

public boolean mouseDown(Event e, int x, int y) { System.out.println("mouseDown"); return false; }

public boolean mouseDrag(Event e, int x, int y) { System.out.println("mouseDrag event"); return false; }

public boolean mouseMove(Event e, int x, int y) { System.out.println("mouseMove event"); return false; }

public boolean mouseEnter(Event e, int x, int y) { System.out.println("mouseEnter event"); return false; }

public boolean mouseExit(Event e, int x, int y) { System.out.println("mouseExit event"); return false; }

public void getFocus() { System.out.println("getFocus event"); }

public void gotFocus() { System.out.println("gotFocus event"); }

public void lostFocus() { System.out.println("lostFocus event"); }

public boolean keyDown(Event e, int x) { System.out.println("keyDown event"); return true; }}

http://www.javastudy.co.kr/docs/jm/jm7.html (7 / 9)2006-09-01 오전 1:59:59

최종명님의 자바강좌 7 - EVENT

다음은 사각형을 그리는 애플릿의 예이다.

파일 drawRec.java

import java.applet.*;import java.awt.*;

public class DrawRec extends Applet { int startX, startY, w, h;

public void init() { startX = 0; startY = 0; w = 0; h = 0; }

public void paint(Graphics g) { g.drawRect(startX, startY, w, h); }

public boolean mouseDown(Event e, int x, int y) { startX = x; startY = y; return true; }

public boolean mouseDrag(Event e, int x, int y) { w = Math.abs(startX -x); h = Math.abs(startY - y); repaint(); return true; }

http://www.javastudy.co.kr/docs/jm/jm7.html (8 / 9)2006-09-01 오전 2:00:00

최종명님의 자바강좌 7 - EVENT

public boolean mouseUp(Event e, int x, int y) { w = Math.abs(startX -x); h = Math.abs(startY - y); repaint(); return true; }}

http://www.javastudy.co.kr/docs/jm/jm7.html (9 / 9)2006-09-01 오전 2:00:00

http://www.javastudy.co.kr/docs/jm/jm8.html

<%@ Language=VBScript %>

자바 프로그래밍: 네트워크 글: 최종명 그림: 박준서

TCP/IP 이해

국제 표준 단체인 ISO가 제정한 OSI 7 layers는 실제로 사용되지않는 프로토콜이지만, 통신 프로토콜 개발과 이해하는데 이용된다.

ARPA 네트워크에서 부터 시작된 TCP/IP 프로토콜은 1983년 버클리 대학교에서 개발된 BSD 유닉스에 포함되면서 부터 점차 많이 사용되게되었다. BSD 유닉스가 소켓 기능을 제공하면서 부터 네트워크 프로그래밍은휠씬 간단하게 되었다. 즉, 프로그래머는 OSI 7 layer에서 트랜스포트 계층이하는 무시하고, 소켓 함수만 이용해서 프로그래밍 할 수 있게 된 것이다.System V 계열의 유닉스도 소켓의 영향을 받아서 STREAM을 개발해서TLI 프로그래밍을 지원하고 있다.

http://www.javastudy.co.kr/docs/jm/jm8.html (1 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

TCP/IP 프로토콜에서 각 계층은 상대방에게 전달할 데이터와 제어 정보를가지고 있다. 데이터와 제어 정보를 메시지라고 한다. 메시지는 하위 계층으로전달되면 기존 메시지에 추가적인 제어 정보를 붙이게 되는데 이것을 캡슐화(encapsulation)라고 한다. 이와 반대되는 과정을 decapsulation이라고한다.

다음 그림은 인터넷 상에서 메시지가 전송되는 과정을 보여준다. 인터넷상에는수많은 컴퓨터들이 존재하고, 이 컴퓨터들 중에서 어떤 것들은 메시지를

http://www.javastudy.co.kr/docs/jm/jm8.html (2 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

받아서 다른 곳으로 전송하는 역할을 하기도 한다. 이러한 역할을 하는 컴퓨터나장치를 라우터라고 한다. 라우터는 전송받은 내용을 decapsulation해서 제어 정보를 알아보고 적당한 곳으로 메시지를 전송한다.

URL

protocol://hostname[:port]/path/filename#section

프로토콜에는 다음과 같은 것이 있다.file : 하드 디스크에 있는 파일ftp : FTP 서버에 연결http : 웹서버에 연결gopher : gopher 서버에 연결news : usenet 뉴스 그룹에 연결telnet : 텔넷 서비스를 이용wais : wais 서버에 연결

URL을 이용해서 다른 곳으로 이동하는 애플릿을 작성해보자.

http://www.javastudy.co.kr/docs/jm/jm8.html (3 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

URLButton.java 파일

import java.awt.*;import java.net.*;import java.applet.Applet;

public class URLButton extends Applet { URL url = null; String title = null;

public void init() { String urlString = null; setLayout(new GridLayout(1,1)); title = getParameter("title"); if(title == null) title = "URLButton"; urlString = getParameter("url"); if(urlString == null) urlString = "http://"; try { url = new URL(urlString); } catch(MalformedURLException e) { System.out.println("Invalid URL:"+ urlString); } Button site = new Button(title); add(site); resize(100, 60); }

public boolean action(Event e, Object arg) { if((e.target instanceof Button)&&(arg.equals(title))) { getAppletContext().showDocument(url); } return false; }}

URLButton.html 파일

http://www.javastudy.co.kr/docs/jm/jm8.html (4 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

<body bgcolor="#ffffff"><applet code=URLButton width=100 height=50><param name=title value="WebZine"><param name=url value="http://203.253.23.3/special.html"></applet>

<applet code=URLButton width=100 height=50><param name=title value="BBS"><param name=url value="http://203.253.24.55/~bbs/"></applet>

<applet code=URLButton width=100 height=50><param name=title value="WebNews"><param name=url value="http://203.253.23.3/"></applet>

실행 예

소켓

일반적으로 C 언어를 이용해서 네트워크 프로그램을 작성하는 경우, 프로그램 절차는 다음 그림과 같다. 서버 프로그램은 소켓을 생성하고, bind()를 이용해서소켓과 어드레스 및 포트를 결합시킨다. listen() 함수를 호출하고, bind()함수를호출해서 클라이언트로 부터 요청이 올 때까지 블락되어서 기다린다.bind() 함수는클라이언트로부터 요청이 오면 클라이언트와 콩신할 수 있는 소켓을 만들어서리턴한다. 리턴된 소켓을 통해서 서버와 클라이언트는 read()/write() 함수를 이용해서통신할 수 있다.클라이언트에서는 소켓을 생성하고, connnect()함수를 통해서 서버에 연결을 시도한다.connect()를 호출하면 서버에서는 accept()함수 가 실행된다. 서버와 연결되면 소켓을통해 read/write를 할 수 있다.

http://www.javastudy.co.kr/docs/jm/jm8.html (5 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

서버소켓

자바에서 네트워크 프로그래밍을 하기 위해서는 java.net패키지를 이용한다.

서버프로그램을 만들 때는 소켓을 만들고, bind()하고 listen()하는 일들이 항상 반복된다.자바에서는 이러한 반복 작업을 제거하기 위해서 서버 소켓(ServerSocket)이라는 클래스를만들었다. 프로그래머는 서버 소켓을 만들어서 accept()메소드를 호출한다. accept() 메소드는 클라이언트로 부터 컨넥션이 요청될 때까지 블락되있다가, 요청이들어오면 클라이언트와 통신할 수 있는 소켓을 생성해서 리턴해준다. 서버는 리턴된소켓을 이용해서 클라이언트와 통신할 수 있다.클라이언트에서도 마찬가지로 반복되는 작업을 제거하기 위해, connect()라는 함수를 호출할필요가 없도록 소켓(Socket)이라는 클래스를 만들었다. 따라서, 클라이언트에서는 소켓을 만들고,소켓을 이용해서 만든 I/O 스트림을 이용해서 서버와 통신할 수 있다.

http://www.javastudy.co.kr/docs/jm/jm8.html (6 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

예: 자바 채팅 프로그램

다음 채팅 프로그램은 "Java Network programming"의 저자인 Hughes가 자바월드에 기고한프로그램 소스이다. 프로그램을 너무 간단하고도 잘 작성했기 때문에 저자의 허락없이 인용한다. 프로그램의 저작권은 hughes에 있슴을 밝혀둔다.(국내에서는 출처만 밝히면 인용해도저작권법에 저촉되지 않는 것으로 알고 있다. -_-;;;)

서버 실행시키기% java ChatServer 9830 &

애플릿뷰어로 본 채팅 클라이언트

http://www.javastudy.co.kr/docs/jm/jm8.html (7 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

ChatServer.java 파일

import java.net.*; import java.io.*; import java.util.*;

public class ChatServer { public ChatServer (int port) throws IOException { ServerSocket server = new ServerSocket (port); while (true) { Socket client = server.accept (); System.out.println ("Accepted from " + client.getInetAddress ()); ChatHandler c = new ChatHandler (client); c.start (); } }

public static void main (String args[]) throws IOException { if (args.length != 1) throw new RuntimeException ("Syntax: ChatServer "); new ChatServer (Integer.parseInt (args[0])); } }

ChatHandler.java 파일

http://www.javastudy.co.kr/docs/jm/jm8.html (8 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

import java.net.*; import java.io.*; import java.util.*;

public class ChatHandler extends Thread { protected Socket s; protected DataInputStream i; protected DataOutputStream o;

public ChatHandler (Socket s) throws IOException { this.s = s; i = new DataInputStream (new BufferedInputStream (s.getInputStream ())); o = new DataOutputStream (new BufferedOutputStream (s.getOutputStream ())); }

protected static Vector handlers = new Vector ();

public void run () { String name = s.getInetAddress ().toString (); try { broadcast (name + " has joined."); handlers.addElement (this); while (true) { String msg = i.readUTF (); broadcast (name + " - " + msg); } } catch (IOException ex) { ex.printStackTrace (); } finally { handlers.removeElement (this); broadcast (name + " has left."); try { s.close (); } catch (IOException ex) { ex.printStackTrace(); } } }

protected static void broadcast (String message) { synchronized (handlers) { Enumeration e = handlers.elements (); while (e.hasMoreElements ()) { ChatHandler c = (ChatHandler) e.nextElement (); try { synchronized (c.o) { c.o.writeUTF (message); }

http://www.javastudy.co.kr/docs/jm/jm8.html (9 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

c.o.flush (); } catch (IOException ex) { c.stop (); } } } } }

ChatApplet.java 파일

import java.net.*; import java.io.*; import java.awt.*; import java.applet.*;

// Applet parameters: // host = host name // port = host port

public class ChatApplet extends Applet implements Runnable { protected DataInputStream i; protected DataOutputStream o;

protected TextArea output; protected TextField input;

protected Thread listener;

public void init () { setLayout (new BorderLayout ()); add ("Center", output = new TextArea ()); output.setEditable (false); add ("South", input = new TextField ()); input.setEditable (false); }

public void start () { listener = new Thread (this); listener.start (); }

public void stop () { if (listener != null) listener.stop (); listener = null;

http://www.javastudy.co.kr/docs/jm/jm8.html (10 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

}

public void run () { try { String host = getParameter ("host"); if (host == null) host = getCodeBase ().getHost (); String port = getParameter ("port"); if (port == null) port = "9830"; output.appendText ("Connecting to " + host + ":" + port + "..."); Socket s = new Socket (host, Integer.parseInt (port)); i = new DataInputStream (new BufferedInputStream (s.getInputStream ())); o = new DataOutputStream (new BufferedOutputStream (s.getOutputStream ())); output.appendText (" connected.₩n"); input.setEditable (true); input.requestFocus (); execute (); } catch (IOException ex) { ByteArrayOutputStream out = new ByteArrayOutputStream (); ex.printStackTrace (new PrintStream (out)); output.appendText ("₩n" + out); } }

public void execute () { try { while (true) { String line = i.readUTF (); output.appendText (line + "₩n"); } } catch (IOException ex) { ByteArrayOutputStream out = new ByteArrayOutputStream (); ex.printStackTrace (new PrintStream (out)); output.appendText (out.toString ()); } finally { listener = null; input.hide (); validate (); try { o.close (); } catch (IOException ex) { ex.printStackTrace (); } } }

public boolean handleEvent (Event e) { if ((e.target == input) && (e.id == Event.ACTION_EVENT)) {

http://www.javastudy.co.kr/docs/jm/jm8.html (11 / 12)2006-09-01 오전 2:00:20

http://www.javastudy.co.kr/docs/jm/jm8.html

try { o.writeUTF ((String) e.arg); o.flush (); } catch (IOException ex) { ex.printStackTrace(); listener.stop (); } input.setText (""); return true; } else if ((e.target == this) && (e.id == Event.WINDOW_DESTROY)) { if (listener != null) listener.stop (); hide (); return true; } return super.handleEvent (e); } }

http://www.javastudy.co.kr/docs/jm/jm8.html (12 / 12)2006-09-01 오전 2:00:20

최종명님의 자바강좌 9 - Postgres DBMS + JDBC

<%@ Language=VBScript %>

POSTGRES DBMS + JDBC

데이타 베이스 만들기

% createdb mydb % psql mydb Welcome to the POSTGRESQL interactive sql monitor: Please read the file COPYRIGHT for copyright terms of POSTGRESQL

type ₩? for help on slash commands type ₩q to quit type ₩g or terminate with semicolon to execute query You are currently connected to the database: mydb

mydb=> create table weather (city varchar(80), temp_lo int, temp_hi int, date date); CREATE mydb=> insert into weather values('seoul', 26, 32, '8/17/1997') mydb-> ₩g INSERT 21059 mydb=> insert into weather values('pusan', 27, 34, '8/17/1997') mydb-> ₩g INSERT 21060 mydb=> select * from weather ; city |temp_lo|temp_hi| date -----+-------+-------+---------- seoul| 26| 32|08-17-0000 pusan| 27| 34|08-17-0000 (2 rows)

mydb=> select * from weather where city='seoul'; city |temp_lo|temp_hi| date -----+-------+-------+---------- seoul| 26| 32|08-17-0000 (1 row)

http://www.javastudy.co.kr/docs/jm/jm9.html (1 / 4)2006-09-01 오전 2:00:27

최종명님의 자바강좌 9 - Postgres DBMS + JDBC

mydb=> select city from weather where temp_hi > 30 ; city ----- seoul pusan (2 rows)

mydb=> select city, temp_hi from weather where temp_hi > 30 ; city |temp_hi -----+------- seoul| 32 pusan| 34 (2 rows)

mydb=> ₩q

JDBC 이용해서 데이타베이스 접근하기

Postgres DBMS용 JDBC 드라이버를 /usr/local/java/JavaPostgres95-0.4 디렉토리에설치한다. JDBC 드라이버는 http://www.postgresql.org/에서 구할 수 있다.JDBC 드라이버를 설치한 다음에 자신의 CLASSPATH 환경변수를 변경해주어야 한다.C-Shell 사용자는 다음 내용을 $HOME/.cshrc 파일에 추가한다.

setenv CLASSPATH /usr/local/java/JavaPostgres95-0.4:$CLASSPATH

추가한 후에 % source $HOME/.cshrc

Bourne-Shell 과 Korn-Shell 사용자는 다음 내용을 $HOME/.profile 파일에 추가한다.

CLASSPATH=/usr/local/java/JavaPostgres95-0.4:$CLASSPATHexport $CLASSPATH

추가한 후에# . $HOME/.profile

% vi JdbcTest.java

1 import java.sql.*;

http://www.javastudy.co.kr/docs/jm/jm9.html (2 / 4)2006-09-01 오전 2:00:27

최종명님의 자바강좌 9 - Postgres DBMS + JDBC

2 3 public class JdbcTest { 4 public static void main(String argv[]) { 5 try { 6 // DriverManager.setLogStream(System.out); 7 8 Driver pgd = (Driver) new postgres95.PGDriver(); 9 10 String url = "jdbc:postgres95:mydb"; 11 12 Connection conn = DriverManager.getConnection(url,"",""); 13 14 Statement stat = conn.createStatement(); 15 16 ResultSet rs = stat.executeQuery("Select * from weather"); 17 18 while ( rs.next() ) { 19 String city = rs.getString(1); 20 short lo = rs.getShort(2); 21 short hi = rs.getShort(3); 22 Date date = rs.getDate(5); 23 System.out.println(city+" "+lo+" "+hi+" "+date); 24 } 25 stat.close(); 26 conn.close(); 27 } catch ( Exception e ) { 28 } 29 } 30 }

% javac JdbcTest.java

% java JdbcTest

간단한 설명

JDBC 프로그래밍 절차1. 각 데이타베이스에 맞는 JDBC 드라이버를 메모리에 로드한다.

http://www.javastudy.co.kr/docs/jm/jm9.html (3 / 4)2006-09-01 오전 2:00:27

최종명님의 자바강좌 9 - Postgres DBMS + JDBC

8 Driver pgd = (Driver) new postgres95.PGDriver();

2. DriverManager의 getConnection() 메소드를 이용해서 데이타베이스에 연결한다. getConnection() 메소드는 Connection 을 리턴한다.

12 Connection conn = DriverManager.getConnection(url,"","");

3. Connection의 createStatement() 메소드를 이용해서 Statement 를 만다느다.

14 Statement stat = conn.createStatement();

4. Statement의 executeQuery() 메소드를 이용해서 SQL 문장을 데이타베이스에 전달한다. executeQuery() 메소드는 ResultSet을 리턴한다. ResultSet은 테이블 형태로 되어있다.

16 ResultSet rs = stat.executeQuery("Select * from weather");

5. ResultSet은 테이블 형태로 되어있기 때문에 cursor를 이동하면서 결과를 검색한다. next() 메소드는 cursor를 한 행씩 이동 시킨다. cursor가 위치한 행에서 각 필드의 값을 검색하기 위해서는 getXXX()함수를 이용한다. 주의할 점은 값을 한번 읽으면, 다시 접근할 수 없다는 사실이다.

18 while ( rs.next() ) { 19 String city = rs.getString(1); 20 short lo = rs.getShort(2); 21 short hi = rs.getShort(3); 22 Date date = rs.getDate(5); 23 System.out.println(city+" "+lo+" "+hi+" "+date); 24 }

6. 작업이 끝난 경우에는 Statement와 Connection 에서 close() 메소드를 호출해주어야 한다.

25 stat.close(); 26 conn.close();

http://www.javastudy.co.kr/docs/jm/jm9.html (4 / 4)2006-09-01 오전 2:00:27

최종명님의 자바강좌 10 - JDBC와 MSQL

<%@ Language=VBScript %>

mSQL 설치

mSQL은 mini SQL DBMS로서 널리 알려진 공개 DBMS이다. 호주의 Hughes에서제공하고 있으며, 가격은 저렴하지만 공짜는 아니다. 다운받아서 사용하는 경우14일동안 공짜로 사용할 수 있다.

http://www.Hughes.com.au

mSQL 2.071 버전 예1. msql-2.0-B7.1.tar.gz 파일을 다운 로드 받는다.

2. 다운로드 받은 파일을 압축을 푼다. % gzip -d msql-2.0-B7.1.tar.gz | tar xvf -

3. mSQL 소스 파일이 있는 디렉토리로 이동해서 INSTALL 파일을 읽어본다. % cd msql-2.0-B7.1

4. make 유틸리티를 이용해서 컴퓨터 타입을 체크한다. % make target

5. make target를 하면, target 디렉토리가 생성된다. target 디렉토리 에는 자신의 컴퓨터 타입에 맞는 디렉토리가 존재한다. % cd target % ls -aF ./ ../ Solaris-2.5.1-Sparc/

6. 자신의 컴퓨터 타입에 맞는 디렉토리로 이동한다. % cd Solaris-2.5.1-Sparc

7. setup 유틸리티를 이용해서 컴파일전 셋업작업을 한다. % ./setup

8. make 유틸리티를 이용해서 컴파일한다. % make

9. 컴파일이 성공적으로 끝나는 경우에 mSQL을 인스톨한다. % su % make install

http://www.javastudy.co.kr/docs/jm/jm10.html (1 / 4)2006-09-01 오전 2:00:52

최종명님의 자바강좌 10 - JDBC와 MSQL

10. 인스톨이 성공적으로 종료되는 경우에 mSQL은 /usr/local/Hughes 디렉토리에 인스톨된다.

11. msql 계정을 만든다.

12. /usr/local/Hughes/msqldb 디렉토리의 owner 를 msql로 한다.

13. ACL 파일을 만들어 준다. % cd /usr/local/Hughes % cp msql.acl.sample msql.acl

13. 루트 권한으로 msql 데몬을 실행시킨다. % /usr/local/Hughes/bin/msql2d &

14. 필요한 경우에 mSQL이 어떤 포트를 사용하는지 알아본다. % more /usr/local/Hughes/msql.conf

#### 자바 JDBC 사용자를 위해.

1. http://www.imaginary.com/Java/ 를 방문해서 mSQL을 위한 JDBC 드라이버를 받아온다.

2. 받아온 mSQL-JDBC.tar.gz 파일을 압축을 풀어서 $JAVA_HOME 디렉토리에 설치한다. 만약 $JAVA_HOME 이 /usr/local/java 이고, JDBC 디라이버 버전이 1.0a4라면 /usr/local/java/mSQL-JDBC_1.0a4 디렉토리에 디라이버가 설치 된다.

3. JDBC 드라이버 설치가 완료되었으면 CLASSPATH 환경 변수를 설정해주어야 한다. CLASSPATH 가 /usr/local/java/mSQL-JDBC_1.0a4/classes 를 포함하도록 한다.

% setenv CLASSPATH /usr/local/java/mSQL-JDBC_1.0a4/classes:$CLASSPATH

4. 적당한 데이타 베이스를 만든다.

% msqladmin create mydb Database "mydb" created.

http://www.javastudy.co.kr/docs/jm/jm10.html (2 / 4)2006-09-01 오전 2:00:52

최종명님의 자바강좌 10 - JDBC와 MSQL

% msql mydb

Welcome to the miniSQL monitor. Type ₩h for help.

mSQL > create table weather (city char(20), temp int) -> ₩g

Query OK. 1 row(s) modified or retrieved.

mSQL > insert into weather values('SEOUL', 20) -> ₩g

Query OK. 1 row(s) modified or retrieved.

mSQL > select * from weather -> ₩g

Query OK. 1 row(s) modified or retrieved.

+----------------------+----------+ | city | temp | +----------------------+----------+ | SEOUL | 20 | +----------------------+----------+

5. JDBC 를 이용한 자바 프로그램을 작성한다. % vi mydb.java 1 import java.sql.*; 2 import COM.imaginary.sql.msql.*; 3 4 public class mydb { 5 public static void main(String args[]) { 6 try { 7 new MsqlDriver(); 8 String url="jdbc:msql://203.253.23.3:1114/mydb"; 9 10 Connection conn = DriverManager.getConnection(url); 11 Statement stmt = conn.createStatement();

http://www.javastudy.co.kr/docs/jm/jm10.html (3 / 4)2006-09-01 오전 2:00:52

최종명님의 자바강좌 10 - JDBC와 MSQL

12 ResultSet rs = stmt.executeQuery("select * from weather"); 13 14 while(rs.next()) { 15 System.out.println("City :"+rs.getString(1)); 16 System.out.println("Temperature :"+rs.getInt(2)); 17 } 18 19 stmt.close(); 20 conn.close(); 21 }catch(Exception e) { 22 e.printStackTrace(); 23 } 24 } 25 }

6. 자바 프로그램을 컴파일 한다 % javac mydb.java

7. 자바 프로그램을 실행 시킨다. % java mydb City :SEOUL Temperature :20

http://www.javastudy.co.kr/docs/jm/jm10.html (4 / 4)2006-09-01 오전 2:00:52

최종명님의 자바 강좌 11. - RMI기초

<%@ Language=VBScript %>

Java RMI

이글은 숭실대학교 최종명님의 강좌에서 발최한 내용입니다.

최종명

1. Hello 인터페이스 파일과 Hello 인터페이스를 implement 하는 클래스 를 만든다. % vi Hello.java 1 import java.rmi.*; 2 3 public interface Hello extends Remote { 4 5 public String sayHello() throws java.rmi.RemoteException; 6 7 }

2. Hello 인터페이스 파일과 implement 한 클래스를 javac를 이용해서 컴파일 한다.% vi HelloImpl.java 1 import java.rmi.*; 2 import java.rmi.server.*; 3 import java.net.*; 4 5 public class HelloImpl extends UnicastRemoteObject implements Hello { 6 7 public HelloImpl() throws RemoteException { 8 super(); 9 } 10 11 public String sayHello() throws RemoteException { 12 13 return "Hello World"; 14 } 15 16 public static void main(String[] args) { 17 System.setSecurityManager(new RMISecurityManager()); 18 19 try { 20 HelloImpl h = new HelloImpl(); 21 Naming.rebind("hello", h); 22 System.out.println("Hello Server ready");

http://www.javastudy.co.kr/docs/jm/jm11.html (1 / 3)2006-09-01 오전 2:01:03

최종명님의 자바 강좌 11. - RMI기초

23 } catch (RemoteException re) { 24 System.out.println("Exception in HelloImpl.main: " + re); 25 } catch (MalformedURLException mfe) { 26 System.out.println("MalformedURLException in HelloImpl.main" + mfe); 27 } 28 } 29 }

% javac -d . Hello.java HelloImpl.java % ls ./ Hello.class Hello.java HelloClient.java HelloImpl.java ../ Hello.html HelloApplet.java HelloImpl.class

3. rmic 를 이용해서 stub 과 skeleton 클래스를 만든다.% rmic -d . HelloImpl % ls ./ Hello.html HelloClient.java HelloImpl_Skel.class ../ Hello.java HelloImpl.class HelloImpl_Stub.class Hello.class HelloApplet.java HelloImpl.java

4. rmiregistry 를 등록한다.% rmiregistry & [1] 7382

5. rmi 서버를 가동시킨다.% java HelloImpl & [2] 7387 Hello Server ready

6. Hello 클라이언트 프로그램을 작성한다.% vi HelloClient.java 1 import java.rmi.*; 2 3 public class HelloClient { 4 5 public static void main(String[] args) { 6 7 System.setSecurityManager(new RMISecurityManager()); 8 9 try { 10 Hello h = (Hello) Naming.lookup("rmi://203.253.23.3/hello");

http://www.javastudy.co.kr/docs/jm/jm11.html (2 / 3)2006-09-01 오전 2:01:03

최종명님의 자바 강좌 11. - RMI기초

11 12 String message = h.sayHello(); 13 System.out.println("HelloClient: " +message); 14 } catch(Exception e) { 15 System.out.println("Exception in main: "+ e); 16 } 17 } 18 }

7. javac 를 이용해서 클라이언트 프로그램을 컴파일한다.% javac HelloClient.java

8. 클라이언트 프로그램을 실행시킨다.% java HelloClient HelloClient: Hello World

http://www.javastudy.co.kr/docs/jm/jm11.html (3 / 3)2006-09-01 오전 2:01:03

최종명님의 자바 강좌 12 - 코바(CORBA) 프로그래밍 시작

<%@ Language=VBScript %>

코바 프로그래밍 1편

이글은 숭실대학교 최종명님의 강좌에서 발최한 내용입니다. 최종명

VisiBroker 환경 맞추기

http://www.visigenic.com/를 방문해서 VisiBroker for Java 3.0을 받아온다.

다운받은 프로그램의 압축을 풀면 다양한 파일들이 나타난다. 이 파일들 중에서 vbinstall를실행시키면 자동적으로 비지브로커를 설치해준다. 기본적으로 비지브로커는 /usr/local/vbroker디렉토리에 설치된다.

비지브로커를 설치한 후에 사용자의 환경 변수를 설정해주어야 한다.C-Shell 사용자는 $HOME/.cshrc 파일에 다음과 같은 내용을 추가해준다.

setenv VBROKER_ADM /usr/local/vbroker/admsetenv CLASSPATH /usr/local/vbroker/lib/vbj30.jar:${CLASSPATH}setenv PATH /usr/local/vbroker/bin:${PATH}

Bourne-Shell 과 Korn-Shell 사용자는 $HOME/.profile 파일에

VBROKER_ADM=/usr/local/vbroker/admexport VBROKER_ADMCLASSPATH=/usr/local/vbroker/lib/vbj30.jar:${CLASSPATH}export CLASSPATHPATH=/usr/local/vbroker/bin:${PATH}export PATH

를 추가한다.

Count 예제 따라하기

이제 간단한 Count 예제를 만들에 보자.

IDL 만들기

Counter.idl 파일

module Counter { interface Count { attribute long sum; long increment(); };};

http://www.javastudy.co.kr/docs/jm/jm12.html (1 / 5)2006-09-01 오전 2:01:12

최종명님의 자바 강좌 12 - 코바(CORBA) 프로그래밍 시작

idl 컴파일러를 이용해서 Stub/Skeleton 파일 만들기

% idl2java Counter.idl Creating: Counter Creating: Counter/Count.java Creating: Counter/CountHolder.java Creating: Counter/CountHelper.java Creating: Counter/_st_Count.java Creating: Counter/_sk_Count.java Creating: Counter/_CountImplBase.java Creating: Counter/CountOperations.java Creating: Counter/_tie_Count.java Creating: Counter/_example_Count.java

% ls ./ ../ Counter/ Counter.idl

% cd Counter % ls ./ CountHelper.java _CountImplBase.java _st_Count.java ../ CountHolder.java _example_Count.java _tie_Count.java Count.java CountOperations.java _sk_Count.java % javac -d .. *.java % cd ..

서버 프로그램 만들기

% vi CountServer.java

import Counter.*;

class CountImpl extends _sk_Count implements Count { private int sum;

CountImpl(String name) { super(name); System.out.println("Count Object Created"); sum = 0; }

public int sum() { return sum; }

public void sum(int val) { sum = val; }

public int increment() { sum++; return sum; }}

public class CountServer { public static void main(String args[]) { try { org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();

http://www.javastudy.co.kr/docs/jm/jm12.html (2 / 5)2006-09-01 오전 2:01:12

최종명님의 자바 강좌 12 - 코바(CORBA) 프로그래밍 시작

org.omg.CORBA.BOA boa = orb.BOA_init();

CountImpl count = new CountImpl("hi");

boa.obj_is_ready(count); boa.impl_is_ready();

} catch(Exception e) { System.out.println(e); } }}

% javac -d . CountServer.java

클라이언트 만들기

% vi CountClient.java

import Counter.*;

public class CountClient { public static void main(String args[]) { try { System.out.println("Initializing the ORB"); org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(); System.out.println("Binding to Count Object"); Count counter = CountHelper.bind(orb, "hi"); System.out.println("sum <- 0"); counter.sum(0);

for(int i=0; i<1000;i++) { counter.increment(); } System.out.println("Sum = "+counter.sum()); } catch(Exception e) { System.out.println(e); } }}

% javac -d . CountClient.java

실행시키기

% osagent &

% gatekeeper &

% vbj CountServer & [1] 15628

http://www.javastudy.co.kr/docs/jm/jm12.html (3 / 5)2006-09-01 오전 2:01:12

최종명님의 자바 강좌 12 - 코바(CORBA) 프로그래밍 시작

Count Object Created

% vbj CountClient Initializing the ORB Binding to Count Object sum <- 0 Sum = 1000

Applet 클라이언트 만들기

% vi CountApplet.java

import java.applet.*;import java.awt.*;import Counter.*;

public class CountApplet extends Applet { private TextField countField, pingTimeField; private Button runCount; private Count counter;

public void init() { setLayout(new GridLayout(2, 2, 10, 10)); add(new Label("Count")); add(countField = new TextField()); countField.setText("1000"); add(runCount = new Button("Run")); add(pingTimeField = new TextField()); pingTimeField.setEditable(false);

try { showStatus("Initializing the ORB"); org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(this);

showStatus("Binding to Count Object"); counter = CountHelper.bind(orb, "hi");

}catch(Exception e) { showStatus("Applet Exception:"+e); } }

public boolean action(Event e, Object arg) { if(e.target == runCount) { try { showStatus("sum <- 0"); //counter.sum((int)0);

showStatus("Increment..."); int stopCount = Integer.parseInt(countField.getText()); pingTimeField.setText(" ");

long startTime = System.currentTimeMillis();

for(int i=0; i < stopCount; i++) { counter.increment(); }

http://www.javastudy.co.kr/docs/jm/jm12.html (4 / 5)2006-09-01 오전 2:01:12

최종명님의 자바 강좌 12 - 코바(CORBA) 프로그래밍 시작

long stopTime = System.currentTimeMillis(); pingTimeField.setText("Time = "+Float.toString((float)(stopTime-startTime)/stopCount)+" msec"); showStatus("Sum = "+ counter.sum()); } catch(Exception ex) { showStatus("System Exception:"+ex); System.out.println(ex); ex.printStackTrace(System.out); } return true; } return false; }}

% javac -d . CountApplet.java

% vi CountApplet.html

<applet code=CountApplet.class width=300 height=400><param name=GATEKEEPER_PORT value=15000><param name=ORBbackCompat value=true><param name=org.omg.CORBA.ORBClass value=com.visigenic.vbroker.orb.ORB></applet>

% appletviewer CountApplet.html

% netscape & 애플릿 보기....

http://www.javastudy.co.kr/docs/jm/jm12.html (5 / 5)2006-09-01 오전 2:01:12

최종명님의 자바 강좌 2 - 코바(CORBA) Callback

<%@ Language=VBScript %>

코바 프로그래밍 2편 - CallBack

이글은 숭실대학교 최종명님의 강좌에서 발최한 내용입니다. 최종명

idl 파일 만들기

HelloCallback.idl 파일 1 // Copyright Choi Jong Myung, Soongsil Univ. 2 // E-mail: [email protected] 3 module HelloCallback { 4 interface Hello { 5 void writeMsg(); 6 }; 7 8 interface HelloCallbackServer { 9 boolean register(in Hello client); 10 void broadcast(); 11 }; 12 };

% idl2java HelloCallback.idl % cd HelloCallback% javac -d .. *.java% cd ..

서버 만들기

% vi HelloServer.java

HelloServer.java 파일 1 // Copyright Choi Jong Myung, Soongsil Univ. 2 // E-mail: [email protected] 3 4 import java.util.*; 5 import HelloCallback.*; 6 7 public class HelloServer { 8 public static void main(String args[]) { 9 try { 10 org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(); 11 org.omg.CORBA.BOA boa = orb.BOA_init(); 12 HelloCallbackServerImpl registor = new HelloCallbackServerImpl("registor"); 13 boa.obj_is_ready(registor); 14 boa.impl_is_ready(); 15 } catch(Exception e) { 16 System.out.println(e); 17 }

http://www.javastudy.co.kr/docs/jm/jm13.html (1 / 2)2006-09-01 오전 2:01:22

최종명님의 자바 강좌 2 - 코바(CORBA) Callback

18 } 19 } 20 21 22 class HelloCallbackServerImpl extends _sk_HelloCallbackServer implements HelloCallbackServer { 23 Vector clientList; 24 25 public HelloCallbackServerImpl(String name) { 26 super(name); 27 clientList = new Vector(10); 28 System.out.println("HelloCallbackServerImpl is ready"); 29 } 30 31 32 public boolean register(Hello client) { 33 try { 34 clientList.addElement(client); 35 System.out.println("Client registered"); 36 return true; 37 } catch (Exception e) { 38 return false; 39 } 40 } 41 42 43 public void broadcast() { 44 Enumeration e = clientList.elements(); 45 while(e.hasMoreElements()) { 46 Hello client = (Hello)e.nextElement(); 47 client.writeMsg(); 48 System.out.println("broadcast is called.."); 49 } 50 } 51 }

% javac -d . HelloServer.java

클라이언트 만들기

% vi HelloClientApplet.java 1 // Copyright Choi Jong Myung, Soongsil Univ. 2 // E-mail: [email protected] 3

http://www.javastudy.co.kr/docs/jm/jm13.html (2 / 2)2006-09-01 오전 2:01:22

최종명님의 자바강좌 15 - 자바 쓰레드 프로그래밍

자바 쓰레드 프로그래밍

쓰레드 기초

"실행중인 프로그램"을 프로세스라고한다. 그러니까 명령어를 입력해서 돌아가는 프로그램은 전부 프로세스인것이다. 프로세스에는 명령어들이 순차적으로 실행이되는데 이것을 실행 쓰레드하고 한다. 순차적으로 실행되는 명령어들을 하나의 실로 꿸 수 있기 때문이다. 이렇게 하나의 실로 꿸 수 있는 프로그램은 단일 쓰레드 프로그램이라고 한다. 그런데 어떤 프로그램에는 여러 개의 함수들이 서로 독립적으로 수행되는 경우도 있다. 이런 경우에는 명령어들이 순차적으로 수행되는 것이 아니기 때문에 하나의 실로 꿸수 없을 것이다. 이런 프로그램은 다중 쓰레드 프로그램이라고 한다.

다음 그림은 세차하는 프로그램이다. 홍길동이 스케쥴표에 나와 있는대로 세차를 하고 있다. 여기서 스케쥴표는 프로그램 명령어들이고, 스케쥴표대로 일을 하는 홍길동은 쓰레드가 된다. 홍길동이 세차하기 위해 사용하는 비누,

물, 호수 등은 시스템 자원들이다.

다음 그림은 홍길동이 두 동생(홍길숙, 홍길찬)을 데리고 세차를 하고 있다. 이 세명은 각자 스케쥴 에 맞게 자신에게 할당된 일을 한다. 스케쥴표는 프로그램 명령어들이고, 홍길동, 홍길숙, 홍길찬은 일을 하는 쓰레드이다. 이렇게 일하는 쓰레드가 많은 프로그램을 다중 쓰레드 프로그램이라고 한다. 우선 직관적으로 봐도 다중 쓰레드 프로그램이 단일 쓰레드 프로그램보다 효율적일 것이다. 다중 쓰레드를 사용하는 프로그램이 대부분 효과적이지만 항상 그런 것은 아니다. "사공이 많으면 배가 산으로 간다"라는 속담이 있는 것 처럼 쓰레드가 많으면 어떤 경우에는 비효

http://www.javastudy.co.kr/docs/jm/jm15.html (1 / 8)2006-09-01 오전 2:01:49

최종명님의 자바강좌 15 - 자바 쓰레드 프로그래밍

율적인 경우도 있다.

쓰레드는 Thread 클래스로 부터 상속을 받아서 만들수도 있고, Runnable 인터페이스를 인플리멘츠해서 사용할 수 도 있다. 두가지 방법중에서 프로그래머는 그때 그때 상황에 맞게 사용하면 된다. 두 방법 모두 쓰레드를 사용하려면 run() 함수를 만들어야 한다. 이 run()함수에 쓰레드가 일할 작업의 내용을 기술해 놓는 것이다.

쓰레드를 만든 다음에 쓰레드를 실행 시키려면 start()함수를 호출해주어야 한다. start() 함수를 호출하면 자동적으로 run()함수가 수행된다. 쓰레드는 run()함수를 마치거나 stop()함수가 호출되면 실행을 종료한다. 종료된 쓰레드는 start()함수로 다시 실행시킬 수는 없다.

쓰레드의 스케쥴링은 자바 가상 머신에서 이루어진다. 자바 가상 머신은 우선 순위에 따라 선점 방식(preemtive) 방식으로 스케쥴링된다. 선점방식이란 우선 숭위가 높은 쓰레드가 등장하면 현재 실행중인 쓰레드는 쫏겨나고 우선순위가 높은 쓰레드가 실행되는 것을 의미한다. 우선 순위가 낮은 쓰레드는 우선 순위가 높은 쓰레드가 종료하거나 sleep, blocked 될때 까지 기다려야 한다.

예제: CountThreadCountThread.java 파일 1 class CountThread extends Thread { 2 int maxcount; 3 4 CountThread(int maxcount) { 5 this.maxcount = maxcount; 6 } 7 8 public void run() { 9 10 for(int count = 1;count 쓰레드가 종료되면 ThreadDeath 예외가 발생한다. 어떤 경우에는 쓰레드가 종료하기 전에 꼭 해주어야 할일들이 있을 수도 있다. 이런 경우에 쓰레드가 종료할 때 발생되는 ThreadDeath 예외를 잡아서 쓰레드 종료직전에 필요한 작업들을 처리할 수 있다. 모든 작업이 처리된 다음에는 ThreadDeath 예외를 다시 throw해주어야 한다.

http://www.javastudy.co.kr/docs/jm/jm15.html (2 / 8)2006-09-01 오전 2:01:49

최종명님의 자바강좌 15 - 자바 쓰레드 프로그래밍

CatchDeath.java 파일 1 class MyThread extends Thread { 2 MyThread(String name) { 3 super(name); 4 } 5 6 public void run() { 7 try { 8 while (true) { 9 sleep(500); 10 System.out.println(getName() + ": is running"); 11 } 12 } catch (ThreadDeath ouch) { 13 System.out.println("I ("+getName() + ") is being killed."); 14 throw(ouch); 15 } catch (InterruptedException e) {} 16 } 17 } 18 19 public class CatchDeath { 20 static public void main(String args[]) { 21 MyThread thr_a = new MyThread("A"); 22 23 System.out.println("Starting the thread..."); 24 thr_a.start(); 25 26 try { 27 Thread.sleep(2000); 28 } catch (InterruptedException e) {} 29 30 System.out.println("Stopping the thread..."); 31 thr_a.stop(); 32 } 33 }

결과% java CatchDeathStarting the thread...A: is runningA: is runningA: is runningStopping the thread...I (A) is being killed.

설명 3 super(name);쓰레드에 이름을 붙이기 위해서 Thread(String name) 생성자를 사용할 수 있다. super(name)은 상위 클래스의생성자, 즉 Thread(String name)를 의미한다.

12 } catch (ThreadDeath ouch) { 13 System.out.println("I ("+getName() + ") is being killed."); 14 throw(ouch);

http://www.javastudy.co.kr/docs/jm/jm15.html (3 / 8)2006-09-01 오전 2:01:49

최종명님의 자바강좌 15 - 자바 쓰레드 프로그래밍

쓰레드가 종료되면 ThreadDeath 예외가 발생한다. 13번째 줄에서 쓰레드가 종료하기 전에 처리할 작업들을 처리할수 있다. 작업이 끝나면 ThreadDeath 예외를 다시 throw 해서 쓰레드가 종료되도록한다.

8.2 자바 쓰레드

다음은 쓰레드의 상태도이다. 쓰레드는 생성자를 통해 생성되면 Newborn 상태에 있게된다. Newborn 상태에서 start() 메소드가 호출되면 Runnable 상태로 전이된다. Runnable 상태는 쓰레드가 CPU의 디스패치(dispatch) 큐(queue)에 등록된 상태이다. Runnable 상태에서 Running 상태로의 전이는 운영체제에 의해 자동적으로 이루어진다. Runnable 상태에 우선 순위에 따라 가장 높은 우선 순위의 쓰레드가 Running 상태로 전이된다. Running 상태는 쓰레드가 CPU를 차지하고 실행중인 상태이다. 쓰레드가 차지하고 있는 CPU를 다른 쓰레드에 넘겨주기 위해서는 suspend()/sleep()/wait() 메소드들과 yield() 메소드가 있다. suspend()/sleep()/wait() 메소드들은 쓰레드를블락상태로 전이해서 다른 쓰레드에게 CPU를 넘겨주는 형태이고, yield() 메소드는 쓰레드가 Runnable 상태로전이해서 다른 쓰레드에 CPU를 넘겨줄 수 있다. 그런데 두 종류의 메소드에는 스케쥴링에 약간의 차이점이 있다. suspend()/sleep()/wait() 메소드들은 쓰레드가 블락되기 때문에 CPU를 다른 쓰레드에게 넘겨주지만, yield()메소드는 Runnable 상태로 가기 때문에 현재 쓰레드가 우선 순위가 가장 높다면 다시 CPU를 잡을 수 있다는것이다. 이렇게되면 우선 순위가 낮은 쓰레드들은 CPU를 차지해서 실행할 기회를 얻을 수 없을 수도 있다.suspend()메소드에 의해 블락된 쓰레드는 resume() 메소드를 통해 블락 상태에서 Runnable 상태로 전이 할 수 있다.반면에 wait() 메소드에 의해 블락된 쓰레드는 notify() 메소드를 통해서 블락 상태에서 Runnalbe 상태로 전이될 수 있다. sleep() 메소드에 의해 블락된 쓰레드는 일정 시간이 되면 자동적으로 Runnable 상태로 전이된다.

http://www.javastudy.co.kr/docs/jm/jm15.html (4 / 8)2006-09-01 오전 2:01:49

최종명님의 자바강좌 15 - 자바 쓰레드 프로그래밍

자바에서 쓰레드는 실제 운영체제의 쓰레드로 매핑이 이루어져야 실제로 쓰레드로서작업을 할 수 있다. UNIX나 NT, Win95, OS/2 등이 쓰레드를 지원하는 방식이 다르기때문에 자바 쓰레드와 실제 운영체제의 쓰레드와 매핑이 달라질 수 있다. 실제 운영체제에서 쓰레드는 사용자 쓰레드와 커널 쓰레드로 구분된다. 사용자 쓰레드는사용자가 라이브러리를 이용해서 만든 쓰레드이고, 커널 쓰레드는 실제 스케쥴링이 일어나는스케쥴링 단위가 된다. 사용자 쓰레드와 커널 쓰레드는 M-1 관계, 1-1 관계, M-N 관계를갖을 수 있다. NT 와 Win95는 1-1 관계의 대표적인 예이고, M-N은 Solaris 쓰레드의 대표적인예이다. 자바 쓰레드는 일종의 사용자 쓰레드이다.

M-1 매핑

자바 쓰레드는 사용자 쓰레드와 1:1 관계를 갖고, 사용자 쓰레드는 커널 쓰레드와 M:1 관계를

http://www.javastudy.co.kr/docs/jm/jm15.html (5 / 8)2006-09-01 오전 2:01:49

최종명님의 자바강좌 15 - 자바 쓰레드 프로그래밍

갖는다. 따라서, 커널 쓰레드는 하나만 있기 때문에 다중 쓰레드의 장점을 살리지 못하고 있다.M-1 매핑의 대표적인 예는 green_threads 이다. 솔라리스 2.4, 2.5 운영체제에 제공되는 JDK는모두 green_threads를 사용하고 있다.

One-One 매핑

1:1 매핑 관계는 NT, Win95에서 사용되는 쓰레드이다. 자바 쓰레드 1개에 커널 쓰레드가 1개 매핑되기 때문에 다중 쓰레드의 장점을 잘 살릴 수 있다.

http://www.javastudy.co.kr/docs/jm/jm15.html (6 / 8)2006-09-01 오전 2:01:49

최종명님의 자바강좌 15 - 자바 쓰레드 프로그래밍

M-N 매핑

솔라리스 2.6에서 지원되는 자바 native 쓰레드를 사용하는 경우에, C 언어에서 쓰레드를사용하는 것처럼 쓰레드를 자유롭게 사용할 수 있다. 프로그래머는 원하는 경우 사용자 쓰레드가원하는 만큼의 커널 쓰레드와 매핑이되도록 프로그램 할 수 있다. NT의 1:1 매핑보다 프로그래머가 프로그램하는데 편리하면서, 다중 쓰레드의 장점을 최대한 활용할 수 있다.

http://www.javastudy.co.kr/docs/jm/jm15.html (7 / 8)2006-09-01 오전 2:01:49

최종명님의 자바강좌 15 - 자바 쓰레드 프로그래밍

http://www.javastudy.co.kr/docs/jm/jm15.html (8 / 8)2006-09-01 오전 2:01:49

최종명님의 강좌 16 - 라운드로빈 스케쥴러

RoundRobin 스케쥴러 만들기

-글&코딩: 최종명

RoundRobin 방식으로 스케쥴링하기

CircularList.java 파일 1 public class CircularList { 2 Node head, nil; 3 Node current; 4 5 public CircularList() { 6 head = null; 7 nil = null; 8 current = null; 9 } 10 11 public synchronized Object getNext() { 12 if(current == null) { 13 current = head; 14 } else { 15 current = current.next; 16 } 17 if(current == null) { 18 current = head; 19 } 20 if(current != null) 21 return current.value; 22 else 23 return null; 24 } 25 26 public synchronized void insert(Object o) { 27 if(head == null) { 28 Node node = new Node(o); 29 head = node; 30 nil = node; 31 } else { 32 Node node = new Node(o); 33 Node temp = nil; 34 nil = node;

http://www.javastudy.co.kr/docs/jm/jm16.html (1 / 6)2006-09-01 오전 2:01:59

최종명님의 강좌 16 - 라운드로빈 스케쥴러

35 temp.next = nil; 36 } 37 } 38 39 public void delete(Object o) { 40 Node temp1 = head; 41 Node temp2 = null; 42 43 while(temp1 != null) { 44 if(temp1.value == o) { 45 if(temp2 == null) { 46 head = temp1.next; 47 } else { 48 temp2.next = temp1.next; 49 } 50 break; 51 } 52 temp2 = temp1; 53 temp1 = temp1.next; 54 } 55 } 56 57 public class Node { 58 Object value; 59 Node next; 60 61 public Node(Object o) { 62 value = o; 63 next = null; 64 } 65 } 66 }

Scheduler.java 파일 1 public class Scheduler extends Thread { 2 private int timeslice; 3 static private CircularList threads; 4 5 static { 6 threads = new CircularList(); 7 } 8

http://www.javastudy.co.kr/docs/jm/jm16.html (2 / 6)2006-09-01 오전 2:01:59

최종명님의 강좌 16 - 라운드로빈 스케쥴러

9 public Scheduler(int t) { 10 timeslice = t; 11 setDaemon(true); 12 start(); 13 } 14 15 static public void addThread(Thread t) { 16 threads.insert(t); 17 System.out.println("new thread inserted"); 18 t.setPriority(2); 19 } 20 21 static public void removeThread(Thread t) { 22 if(t.isAlive()) 23 t.setPriority(5); 24 threads.delete(t); 25 } 26 27 public void run() { 28 Thread current; 29 setPriority(6); 30 while(true) { 31 current = (Thread) threads.getNext(); 32 if(current == null) { 33 System.out.println("Scheduling is done..."); 34 continue; 35 } 36 if(current.isAlive()) { 37 current.setPriority(4); 38 } else { 39 removeThread(current); 40 } 41 //System.out.println("Scheduler running"); 42 try { 43 Thread.sleep(timeslice); 44 } catch (InterruptedException ie) { 45 System.out.println("Thread interrupted."); 46 } 47 if(current.isAlive()) { 48 current.setPriority(2); 49 } else { 50 removeThread(current); 51 }

http://www.javastudy.co.kr/docs/jm/jm16.html (3 / 6)2006-09-01 오전 2:01:59

최종명님의 강좌 16 - 라운드로빈 스케쥴러

52 } 53 } 54 }

Task.java 파일 1 class Task extends Thread { 2 String id; 3 4 public Task(String s) { 5 id = s; 6 Scheduler.addThread(this); 7 } 8 9 public void run() { 10 for(int i =0; i < 10 ; i++) { 11 doCalc(i); 12 System.out.println(id+":"+getPriority()); 13 } 14 } 15 16 public void doCalc(int n) { 17 for(int i = 0; i < n*200000; i++) 18 ; 19 } 20 }

App.java 파일 1 class App { 2 public static void main(String args[]) { 3 Task t1, t2, t3; 4 Scheduler c = new Scheduler(100); 5 t1 = new Task("T1"); 6 t2 = new Task("T2"); 7 t3 = new Task3("T3"); 8 9 t1.start(); 10 t2.start(); 11 t3.start(); 12 } 13 } 14 15 class Task3 extends Task { 16

http://www.javastudy.co.kr/docs/jm/jm16.html (4 / 6)2006-09-01 오전 2:01:59

최종명님의 강좌 16 - 라운드로빈 스케쥴러

17 public Task3(String id) { 18 super(id); 19 } 20 21 public void run() { 22 for(int i =0; i < 10 ; i++) { 23 doCalc(i); 24 System.out.println("Task3 id ="+id + ":"+getPriority()); 25 } 26 } 27 28 public void doCalc(int n) { 29 for(int i = 0; i < n*200000; i++) 30 ; 31 } 32 33 }

결과% java Appnew thread insertednew thread insertednew thread insertedT1:4T2:4T2:4Task3 id =T3:4Task3 id =T3:4T1:4T2:4Task3 id =T3:4T1:4T2:4Task3 id =T3:4T1:4T1:4T2:4Task3 id =T3:4T1:4T2:4Task3 id =T3:4T1:4T2:4

http://www.javastudy.co.kr/docs/jm/jm16.html (5 / 6)2006-09-01 오전 2:01:59

최종명님의 강좌 16 - 라운드로빈 스케쥴러

Task3 id =T3:4T1:4T2:4Task3 id =T3:4Task3 id =T3:4T1:4T2:4T1:4T2:4Task3 id =T3:2

http://www.javastudy.co.kr/docs/jm/jm16.html (6 / 6)2006-09-01 오전 2:01:59

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

<%@ Language=VBScript %>

예제를 통해본 자바 입출력

이글은 숭실대학교 최종명님의 강좌에서 발최한 내용입니다.

최종명

바이트의 연속을 스트림(stream)이라고 한다. 자바에서는 스트림을 이용해서 입출력을 한다.입력을 하는 스트림을 입력스트림(input stream)이라고 하고, 출력하는 스트림을 출력 스트림(output stream)이라고 한다. 입출력 스트림은 java.io 패키지에 만들어져 있다.화면에 출력하고, 키보드로 부터 입력을 받아들이기 위해서는 System 클래스의 out 과 in 을 사용했다. System 클래스의 out은 PrintStream 타입의 멤버 필드이고,in은 InputStream 타입의 멤버 필드이다. 자바에서 입력 스트림 클래스들은 InputStream 클래스로부터 상속된 클래스이다. 출력 스트림 클래스들은 OutputStream 클래스로부터 상속된 클래스이다.

9.2.1 InputStream 클래스

System 클래스의 in 멤버필드는 대표적인 InputStream 타입이다. InputStream은 입력을위해 다음과 같은 메소드들을 이용할 수 있다. int read() int read(byte[]) int read(byte[], int, int)read() 메소드를 이용하는 경우에 바이트 값을 읽어오거나 파일의 끝인 경우에는-1을 리턴한다. read(byte[]) 메소드는 읽은 내용을 바이트 배열에 채우고, 읽은 바이트의수를 리턴한다. read(byte[], int, int) 메소드는 바이트 배열에서 시작 위치와 끝 위치를지정한 뒤에 내용을 읽어오고, 읽은 바이트의 수를 리턴한다.

inOut.java 파일 1 import java.io.*; 2 3 class inOut { 4 public static void main (String args[]) throws IOException { 5 int b, count = 0; 6 while ((b = System.in.read()) != -1) { 7 count++; 8 System.out.print((char)b); 9 } 10 System.out.println(); 11 System.err.println("total bytes = " + count); 12 } 13 }

결과 % java inOutHelloHello한글??±?^Dtotal bytes = 11

http://www.javastudy.co.kr/docs/jm/jm17.html (1 / 12)2006-09-01 오전 2:02:21

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

설명 6 while ((b = System.in.read()) != -1) {System.in.read() 메소드를 이용해서 키보드로부터 입력을 받는다. read() 메소드는바이트 입력을 리턴하고, 입력이 종료되면(Cntl-D) -1을 리턴한다.

8 System.out.print((char)b);System.out.print() 메소드를 이용해서 읽어온 바이트를 문자 타입으로 변환해서출력한다.

11 System.err.println("total bytes = " + count);System 클래스의 err 멤버 필드를 이용해서 출력하였다. err 멤버필드는 표준 에러출력을 위해 사용된다.

total bytes = 11유닉스 시스템에서 테스트 하였기 때문에 영어 문자당 1개의 바이트와 한글에 2바이트가 사용되었다. 따라서, 영어 5개 문자(5 바이트), 한글 2개 문자(4 바이트), 리턴값(1 바이트 x 2), 총 11 바이트가 된다.

9.2.2 InputStreamReader 클래스

JDK 1.0의 입출력 스트림은 JDK 1.1에서 Reader 와 Writer 클래스로 대체되었다.입력을 위해서는 Reader 클래스를 이용하고, 출력을 위해서는 Writer 클래스를 이용할 수 있다. Reader 클래스는 입력을 위해 다음과 같은 메소드들을 이용할 수 있다. int read() int read(char[]) int read(char[], int, int)

InputStreamReader 클래스는 InputStream 을 아규먼트로 만들어진다. InputStreamReader 클래스의 getEncoding() 메소드는 스트림에서 사용된 인코딩 이름을 리턴한다.

BufferedReader 클래스는 Reader 클래스를 아규먼트로 만들 수 있다. BufferedReader 클래스 는 다음과 같은 메소드를 이용해서 입력을 받을 수 있다. int read() String readLine()read() 메소드는 한문자를 읽어서 리턴하는 메소드이고, readLine() 메소드는 한 줄을읽어서 문자열을 리턴하는 메소드이다.

CharInput.java 파일 1 import java.io.*; 2 3 public class CharInput { 4 5 public static void main(String args[]) { 6 String s; 7 BufferedReader in; 8 in = new BufferedReader(new InputStreamReader(System.in)); 9 10 try { 11 System.out.print("Put characters:"); 12 while((s = in.readLine()) != null) { 13 System.out.println("₩tCharacters from console :" + s); 14 System.out.print("Put characters:"); 15 } 16 } catch (IOException ex) { } 17 }

http://www.javastudy.co.kr/docs/jm/jm17.html (2 / 12)2006-09-01 오전 2:02:21

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

18 }

결과% java CharInputPut characters:Hello ? Characters from console :Hello ?Put characters:안녕하세요 ? Characters from console :안녕하세요 ?Put characters:^D

설명 8 in = new BufferedReader(new InputStreamReader(System.in));키보드로 부터 입력을 받는 BufferedReader 클래스를 만들기 위해, InputStreamReader클래스와 System.in 을 이용했다.

12 while((s = in.readLine()) != null) {BufferedReader 클래스의 readLine() 메소드를 이용해서 한줄을 읽어들였다.

9.2.3 FileOutputStream 클래스

FileOut.java 파일 1 import java.io.*; 2 3 public class FileOut { 4 private FileOutputStream fout; 5 private byte msg[]; 6 private int len; 7 8 FileOut(String fname) throws IOException { 9 msg = new byte[1024]; 10 len = 0; 11 fout = new FileOutputStream(fname); 12 int b =0; 13 14 System.out.print("Put characters:"); 15 b = System.in.read(); 16 while(b != 10) { 17 msg[len++] = (byte)b; 18 b = System.in.read(); 19 } 20 write(msg); 21 System.out.println("Total "+ len + " bytes."); 22 } 23 24 public void write(byte[] m) throws IOException{ 25 for(int i=0; i < len; i++) { 26 fout.write(m[i]); 27 } 28 } 29 30 public void close() { 31 try { 32 fout.close(); 33 } catch(IOException ex) { } 34 } 35 36

http://www.javastudy.co.kr/docs/jm/jm17.html (3 / 12)2006-09-01 오전 2:02:21

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

37 public static void main(String[] args) throws IOException{ 38 FileOut o = new FileOut("temp"); 39 o.close(); 40 } 41 42 }

결과% java FileOutPut characters:Hello ? 안녕하세요 ?Total 20 bytes.

% more tempHello ? 안녕하세요 ?

설명 11 fout = new FileOutputStream(fname);파일 이름을 아규먼트로 갖고 FileOutputStream 클래스를 만든다.

15 b = System.in.read();키보드로부터 입력을 받아들인다.

26 fout.write(m[i]);FileOutputStream 클래스를 이용해서 파일에 기록한다.

32 fout.close();close() 메소드를 이용해서 파일을 닫는다.

9.2.4 RandomAccessFile 클래스

RandomAccessFile 클래스는 seek() 메소드를 이용해서 입출력 포인터의 위치를이동할 수 있다. 포인터를 이동시킨뒤에 파일에 기록하거나 내용을 읽을 수 있다.RandomAccessFile 클래스는 다음과 같은 생성자를 이용해서 만들 수 있다. RandomAccessFile(String filename, String openmode)첫번째 아규먼트는 파일의 이름을 의미하고, 두번째 아규먼트는 파일을 오픈할 때읽기 전용인가 아니면 읽기/쓰기 가능한지를 나타낸다. 두번째 아규먼트는 읽기 전용인 경우에는 "r", 읽기/쓰기 인 경우에는 "rw" 이다.RandomAccessFile 클래스는 파일의 길이를 알아볼 수 있는 length() 메소드, 각 자료타입을 읽을 수 있는 readBoolean(), readByte(), readChar(), readDouble(), readFloat(),readInt(), readLong(), readShort() 등의 메소드들이 있다. 마찬가지로 각 자료 타입을기록할 수 있는 writeBoolean(boolean), writeByte(int), writeBytes(String), writeChar(int),writeChars(String), writeDouble(double), writeFloat(float), writeInt(int), writeLong(long),writeShort(int) 등의 메소드들이 있다.

EmployeeDB.java 파일 예제는 자바에서 C 언어에서 레코드를 어떻게 사용하는가를 보여준다.자바는 레코드가 없기 때문에 클래스를 레코드로 사용한다. Record 클래스는 레코드를 표현하기위해 사용된 클래스이다. Table 클래스는 레코드를 처리하기 위해 사용된 클래스이다. Table 클래스에서 레코드를 읽거나 기록하기 위한 루틴들을 포함하고 있다. EmployeeDB 클래스는주로 GUI를 위한 코드가 들어 있다.

EmployeeDB.java 파일 1 import java.awt.*; 2 import java.awt.event.*; 3 import java.io.*; 4 5 6 public class EmployeeDB extends Frame implements ActionListener {

http://www.javastudy.co.kr/docs/jm/jm17.html (4 / 12)2006-09-01 오전 2:02:21

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

7 static final int NONE = 0; 8 static final int ADD = 1; 9 static final int TOTAL = 2; 10 static final int SEARCH = 3; 11 static final int REMOVE = 4; 12 static final int ESC = 5; 13 Panel left, bottom; 14 LabeledTextField name, number, dept, phone; 15 TextArea display; 16 Button addB, totalB, searchB, removeB, escB, exitB; 17 Table table; 18 int action; 19 20 21 public EmployeeDB() { 22 setLayout(new BorderLayout()); 23 action = NONE; 24 left = new Panel(); 25 bottom = new Panel(); 26 display = new TextArea(); 27 display.setEditable(false); 28 name = new LabeledTextField("이 름"); 29 name.setEditable(false); 30 number = new LabeledTextField("사 번"); 31 number.setEditable(false); 32 dept = new LabeledTextField("부 서"); 33 dept.setEditable(false); 34 phone = new LabeledTextField("전 화"); 35 phone.setEditable(false); 36 left.setLayout(new GridLayout(4,1)); 37 left.setSize(400, 300); 38 left.add(name); 39 left.add(number); 40 left.add(dept); 41 left.add(phone); 42 43 addB = new Button("추 가"); 44 addB.addActionListener(this); 45 addB.setActionCommand("add"); 46 totalB = new Button("전체 보기"); 47 totalB.addActionListener(this); 48 totalB.setActionCommand("total"); 49 searchB = new Button("검 색"); 50 searchB.addActionListener(this); 51 searchB.setActionCommand("search"); 52 removeB = new Button("삭 제"); 53 removeB.addActionListener(this); 54 removeB.setActionCommand("remove"); 55 escB = new Button("취 소"); 56 escB.addActionListener(this); 57 escB.setActionCommand("esc"); 58 exitB = new Button("종 료"); 59 exitB.addActionListener(this); 60 exitB.setActionCommand("exit"); 61 exitB.setBackground(Color.red); 62 bottom.setLayout(new GridLayout(1,6)); 63 bottom.add(addB); 64 bottom.add(totalB); 65 bottom.add(searchB); 66 bottom.add(removeB); 67 bottom.add(escB); 68 bottom.add(exitB);

http://www.javastudy.co.kr/docs/jm/jm17.html (5 / 12)2006-09-01 오전 2:02:21

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

69 70 add("Center", display); 71 add("West", left); 72 add("South", bottom); 73 74 table = new Table(); 75 } 76 77 public void initialize() { 78 action = NONE; 79 addB.enable(); 80 totalB.enable(); 81 searchB.enable(); 82 removeB.enable(); 83 name.setText(""); 84 number.setText(""); 85 dept.setText(""); 86 phone.setText(""); 87 name.setEditable(false); 88 number.setEditable(false); 89 dept.setEditable(false); 90 phone.setEditable(false); 91 } 92 93 public void actionPerformed(ActionEvent e) { 94 int index = 0; 95 String cmd = e.getActionCommand(); 96 String nameString, num, part, tel; 97 boolean found = false; 98 String msg = ""; 99 100 if(cmd.equals("add")) { 101 if(action != ADD) { 102 action = ADD; 103 name.setEditable(true); 104 number.setEditable(true); 105 dept.setEditable(true); 106 phone.setEditable(true); 107 totalB.disable(); 108 searchB.disable(); 109 removeB.disable(); 110 return; 111 } 112 nameString = name.getText().trim(); 113 if(nameString == null || nameString.length() == 0) 114 return; 115 num = number.getText().trim(); 116 if(num == null || num.length() == 0) 117 return; 118 part = dept.getText().trim(); 119 if(part == null || part.length() == 0) 120 return; 121 tel = phone.getText().trim(); 122 123 display.setText(nameString + num + part + tel); 124 table.add(nameString, num, part, tel); 125 display.appendText("₩n 등록을 성공적으로 마쳤습니다."); 126 initialize(); 127 } else if(cmd.equals("total")) { 128 action = TOTAL; 129 initialize(); 130 index = table.getIndex();

http://www.javastudy.co.kr/docs/jm/jm17.html (6 / 12)2006-09-01 오전 2:02:21

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

131 display.setText("₩n 검색 건수 : 총 " + Integer.toString(index+1)+ " 건₩n"); 132 display.appendText("₩n============================================"); 133 display.appendText("₩n 순번 ₩t성명 ₩t사번 ₩t부서명 ₩t전화번호 "); 134 display.appendText("₩n--------------------------------------------₩n₩n"); 135 if(index < 0) { 136 display.appendText(" 등록된 자료가 없습니다. ₩n"); 137 return; 138 } 139 for(int i = 0; i <= index; i++) { 140 Record rec = table.readRec(i); 141 msg = " " + Integer.toString(i+1) + " ₩t "; 142 msg += rec.getName() + " ₩t"; 143 msg += Integer.toString(rec.getNum()) + " ₩t"; 144 msg += rec.getPart() + " ₩t"; 145 msg += rec.getTel() + "₩n"; 146 display.appendText(msg); 147 } 148 } else if(cmd.equals("search")) { 149 if(action != SEARCH) { 150 action = SEARCH; 151 name.setEditable(true); 152 addB.disable(); 153 totalB.disable(); 154 removeB.disable(); 155 return; 156 } 157 Record rec; 158 index = table.getIndex(); 159 nameString = name.getText().trim(); 160 if(nameString == null || nameString.length() == 0) 161 return; 162 display.setText("₩n ## 개인 조회 ###########₩n"); 163 display.appendText("₩n============================================"); 164 display.appendText("₩n 순번 ₩t성명 ₩t사번 ₩t부서명 ₩t전화번호 "); 165 display.appendText("₩n--------------------------------------------₩n₩n"); 166 for(int i = 0; i <= index; i++) { 167 rec = table.readRec(i); 168 if(nameString.equals(table.readName(i, nameString.length()))) { 169 found = true; 170 } 171 if(found) { 172 msg = " " + Integer.toString(i+1) + " ₩t "; 173 msg += rec.getName() + " ₩t"; 174 msg += Integer.toString(rec.getNum()) + " ₩t"; 175 msg += rec.getPart() + " ₩t"; 176 msg += rec.getTel() + "₩n"; 177 display.appendText(msg); 178 msg = ""; 179 break; 180 } 181 } 182 if (!found) { 183 display.setText(" 조회하신 성명이나 사번의 직원이 없습니다..."); 184 } 185 initialize(); 186 } else if(cmd.equals("remove")) { 187 if(action != REMOVE) { 188 action = REMOVE;

http://www.javastudy.co.kr/docs/jm/jm17.html (7 / 12)2006-09-01 오전 2:02:21

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

189 name.setEditable(true); 190 addB.disable(); 191 totalB.disable(); 192 searchB.disable(); 193 return; 194 } 195 index = table.getIndex(); 196 nameString = name.getText().trim(); 197 if(nameString == null || nameString.length() == 0) 198 return; 199 display.setText("₩n ## 삭제 ###########₩n"); 200 display.appendText("₩n============================================"); 201 display.appendText("₩n 순번 ₩t성명 ₩t사번 ₩t부서명 ₩t전화번호 "); 202 display.appendText("₩n--------------------------------------------₩n₩n"); 203 for(int i = 0; i <= index; i++) { 204 Record rec = table.readRec(i); 205 if(nameString.equals(table.readName(i, nameString.length()))) { 206 found = true; 207 } 208 if(found) { 209 msg = rec.getName(); 210 msg += Integer.toString(rec.getNum()); 211 msg += rec.getPart(); 212 msg += rec.getTel(); 213 display.appendText(msg); 214 msg = ""; 215 found = true; 216 display.appendText("₩n 위의 자료를 삭제하였습니다...."); 217 for(int j=i+1; j <= index; j++) { 218 rec = table.readRec(j); 219 table.writeRec(rec.getName(),rec.getNum(),rec.getPart(),rec.getTel(),j-1); 220 } 221 table.remove(--index); 222 break; 223 } 224 } 225 if(!found) { 226 display.appendText("조회하신 성명의 직원이 없습니다..."); 227 } 228 initialize(); 229 } else if(cmd.equals("esc")) { 230 action = NONE; 231 initialize(); 232 } else if(cmd.equals("exit")) { 233 table.close(); 234 setVisible(false); 235 dispose(); 236 System.exit(0); 237 } 238 } 239 240 241 242 class Table { 243 private RandomAccessFile myRAFile; 244 private int recordCount; 245 private int recordLength = 50; 246 private int recordOffset = 4; 247 248 public Table() {

http://www.javastudy.co.kr/docs/jm/jm17.html (8 / 12)2006-09-01 오전 2:02:21

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

249 try { 250 myRAFile = new RandomAccessFile("employee.db", "rw"); 251 if(myRAFile.length() ==0) { 252 recordCount = -1; 253 } else { 254 recordCount = myRAFile.readInt(); 255 } 256 } catch(IOException e) { 257 System.out.println("Can't access employee.dat"); 258 } 259 } 260 261 262 public int getIndex() { 263 return recordCount; 264 } 265 266 public void add(String name, String num, String part, String tel) { 267 writeRec(name, Integer.parseInt(num), part, tel, ++recordCount); 268 } 269 270 public void close() { 271 try { 272 myRAFile.close(); 273 } catch(IOException ioe) { 274 System.out.println("IOException during close file"); 275 } 276 } 277 278 public Record readRec(int index) { 279 String name="", part="", tel="" ; 280 int num = -1 ; 281 282 try { 283 myRAFile.seek(index * recordLength + recordOffset); 284 for(int i = 0; i < 5;i++) { 285 name += myRAFile.readChar(); 286 } 287 num = myRAFile.readInt(); 288 for(int i = 0; i < 6;i++) { 289 part += myRAFile.readChar(); 290 } 291 for(int i = 0; i < 8;i++) { 292 tel += myRAFile.readChar(); 293 } 294 295 } catch(IOException ioe) { 296 System.out.println("IOException during read file.."); 297 } 298 return (new Record(name, num, part, tel)); 299 } 300 301 public String readName(int index, int len) { 302 String name=""; 303 try { 304 myRAFile.seek(index * recordLength + recordOffset); 305 for(int i = 0; i < len;i++) { 306 name += myRAFile.readChar(); 307 } 308 } catch (IOException ioe) { 309 System.out.println("IOException :"+ioe.toString()); 310 }

http://www.javastudy.co.kr/docs/jm/jm17.html (9 / 12)2006-09-01 오전 2:02:22

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

311 return (name); 312 } 313 314 315 public void remove(int i) { 316 recordCount = i; 317 } 318 319 320 public void writeRec(String name, int num, String part, String tel, int index) {

321 int len = 0; 322 323 try { 324 myRAFile.seek(index * recordLength + recordOffset); 325 len = name.length(); 326 for(int i =0;i < 5;i++) { 327 myRAFile.writeChar((i < len ? name.charAt(i) : ' ')); 328 } 329 myRAFile.writeInt(num); 330 331 len = part.length(); 332 for(int i =0;i < 6;i++) { 333 myRAFile.writeChar((i < len ? part.charAt(i) : ' ')); 334 } 335 336 len = tel.length(); 337 for(int i =0;i < 8;i++) { 338 myRAFile.writeChar((i < len ? tel.charAt(i) : ' ')); 339 } 340 myRAFile.seek(0); 341 myRAFile.writeInt(recordCount); 342 } catch(IOException ioe) { 343 System.out.println("IOException while writing.."); 344 } 345 } 346 347 } 348 349 350 class Record { 351 private String name; 352 private int num; 353 private String part; 354 private String tel; 355 356 public Record(String na, int n, String p, String t) { 357 name = na; 358 num = n; 359 part = p; 360 tel = t; 361 } 362 363 public String getName() { 364 return(name); 365 } 366 367 public int getNum() { 368 return(num); 369 } 370 371 public String getPart() {

http://www.javastudy.co.kr/docs/jm/jm17.html (10 / 12)2006-09-01 오전 2:02:22

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

372 return(part); 373 } 374 375 public String getTel() { 376 return(tel); 377 } 378 } 379 380 public static void main(String agrs[]) { 381 EmployeeDB db = new EmployeeDB(); 382 db.setSize(550, 300); 383 db.setVisible(true); 384 } 385 }

LabeledTextField.java 파일 1 import java.awt.*; 2 3 public class LabeledTextField extends Panel{ 4 private Label label; 5 private TextField field; 6 private String labelPosition; 7 private String fieldPosition; 8 9 public LabeledTextField(String labelString) { 10 this(labelString, "1%, 5%, 25%, 95%", "27%, 5%, 98%, 95%"); 11 } 12 13 14 public LabeledTextField(String labelString, String labelPosition, String fieldPosition) { 15 super(); 16 setLayout(new PositionLayout()); 17 this.labelPosition = labelPosition; 18 this.fieldPosition = fieldPosition; 19 label = new Label(labelString); 20 field = new TextField(20); 21 add(labelPosition, label); 22 add(fieldPosition, field); 23 } 24 25 public String getText() { 26 return field.getText(); 27 } 28 29 public void setText(String m) { 30 field.setText(m); 31 } 32 33 public void setEditable(boolean t) { 34 boolean able = field.isEditable(); 35 if(t != able) 36 field.setEditable(t); 37 } 38 39 public static void main(String args[]) { 40 Frame f = new Frame(); 41 LabeledTextField lt = new LabeledTextField("Name:"); 42 f.add("South", lt); 43 f.setSize(400, 200); 44 f.setVisible(true); 45 }

http://www.javastudy.co.kr/docs/jm/jm17.html (11 / 12)2006-09-01 오전 2:02:22

최종명님의 자바 강좌 17. - 자바 입출력 (예제를 통해본)

46 }

결과% java EmployeeDB

설명 250 myRAFile = new RandomAccessFile("employee.db", "rw");employee.db 파일을 읽기/쓰기로 오픈한다.

251 if(myRAFile.length() ==0) {파일의 길이가 0 이면, 즉 파일에 내용이 없으면..

254 recordCount = myRAFile.readInt();파일로부터 정수를 하나 읽어온다.

283 myRAFile.seek(index * recordLength + recordOffset);입출력 포인터를 특정 위치로 이동 시킨다.

327 myRAFile.writeChar((i < len ? name.charAt(i) : ' '));문자를 파일에 기록한다.

http://www.javastudy.co.kr/docs/jm/jm17.html (12 / 12)2006-09-01 오전 2:02:22

http://www.javastudy.co.kr/docs/jm/jm18.html

<%@ Language=VBScript %>

색/폰트/커서

- 최종명

java.awt.Color 클래스는 프로그래머가 많이 사용하는 색은 상수로 만들어 놓고, 많이 사용되지 않는 색은 RGB 값을 이용해서 만들어 사용하도록하고 있다.

Color 클래스의 상수로 정의된 색Color.black Color.green Color.redColor.blue Color.lightGray Color.whiteColor.cyan Color.magenta Color.yellowColor.darkGray Color.orangeColor.gray Color.pink

Color 클래스의 상수를 이용하지 않는 경우에는 여러 형태의 생성자를 이용해서 원하는 색을 만들어사용할 수 있다. new Color(int r, int g, int b);r, g, b 는 0 ~ 255 사이의 값을 갖는다.

new Color(float r, float g, float b)r, g, b 는 0.0 ~ 1.0 사이의 값을 갖는다.

폰트

자바에서는 모든 시스템에서 사용될 만한 대표적인 폰트를 자바 독자적인 이름을 붙여서 사용하고 있다. 폰트는 다음과 같은 생성자를 이용해서 만들어 사용할 수 있다. new Font(String fontname, int style, int size);

다음 표는 자바에서 사용되는 폰트 이름들이다.

자바 폰트 이름 X 윈도우 폰트 이름 윈도우즈 폰트 이름

Helvetica adobe-hevetica Arial

TimesRoman adobe-times Times New Roman

Courier adobe-courier Courier New

Dialog b&h-lucida MS Sans Serif

DialogInput b&h-lucidatypewriter MS Sans Serif

ZapfDingbats itc-zapfdingbats WingDings

default misc-fixed Arial

다음 표는 폰트의 스타일을 나타낸다.

http://www.javastudy.co.kr/docs/jm/jm18.html (1 / 5)2006-09-01 오전 2:03:15

http://www.javastudy.co.kr/docs/jm/jm18.html

Font 클래스 상수 스타일

Font.PLAIN 일반 문자

Font.ITALIC 이탤릭체

Font.BOLD 볼드체

Font.BOLD+Font.ITALIC 이탤릭 볼드체

마우스 커서

마우스 커서는 프레임에서 setCursor(int cursorType) 메소드를 이용해서 변경할 수 있다.다음은 자바에서 지원하는 마우스 커서들이다.

Frame.DEFAULT_CURSOR Frame.S_RESIZE_CURSOR

Frame.CROSSHAIR_CURSOR Frame.E_RESIZE_CURSOR

Frame.TEXT_CURSOR Frame.W_RESIZE_CURSOR

Frame.WAIT_CURSOR Frame.NE_RESIZE_CURSOR

Frame.HAND_CURSOR Frame.NW_RESIZE_CURSOR

Frame.MOVE_CURSOR Frame.SE_RESIZE_CURSOR

Frame.N_RESIZE_CURSOR Frame.SW_RESIZE_CURSOR

AppletMenu.java 파일 1 import java.awt.*; 2 import java.applet.*; 3 4 public class AppletMenu extends Applet { 5 Panel bottom; 6 Button ok, cancel; 7 Component c; 8 9 public void init() { 10 setBackground(Color.white); 11 MenuBar menubar = new MenuBar(); 12 Menu menu = new Menu("File");

http://www.javastudy.co.kr/docs/jm/jm18.html (2 / 5)2006-09-01 오전 2:03:15

http://www.javastudy.co.kr/docs/jm/jm18.html

13 Menu submenu1 = new Menu("Open"); 14 MenuItem item1 = new MenuItem("File"); 15 MenuItem item2 = new MenuItem("URL"); 16 submenu1.add(item1); 17 submenu1.add(item2); 18 menu.add(submenu1); 19 20 Menu submenu2 = new Menu("Save As"); 21 MenuItem item3 = new MenuItem("text"); 22 MenuItem item4 = new MenuItem("html"); 23 subsubmenu2.add(item3); 24 submenu2.add(item4); 25 menu.add(submenu2); 26 menubar.add(menu); 27 28 c = this; 29 while (c != null && !(c instanceof Frame)) { 30 c = c.getParent(); 31 } 32 ((Frame)c).setMenuBar(menubar); 33 34 bottom = new Panel(); 35 ok = new Button("OK"); 36 cancel = new Button("CANCEL"); 37 bottom.add(ok); 38 bottom.add(cancel); 39 setLayout(new BorderLayout()); 40 add("South", bottom); 41 } 42 43 public void paint(Graphics g) { 44 Color fg = new Color(123, 230, 10); 45 g.setColor(fg); 46 g.drawRect(25, 25, 100, 100); 47 Font fn = new Font("Helvetica", Font.ITALIC, 24); 48 g.setFont(fn); 49 g.drawString("hello", 30, 150); 50 } 51 52 public boolean mouseMove(Event e, int x, int y) { 53 if(25 <= x && x <="125" && 25 <="y" && y <="125)" { 54 if(c instanceof Frame) { 55 ((Frame)c).setCursor(Frame.WAIT_CURSOR); 56 return true; 57 } 58 } 59 if(c instanceof Frame) { 60 ((Frame)c).setCursor(Frame.DEFAULT_CURSOR); 61 } 62 return super.mouseMove(e, x, y); 63 } 64 }

결과% appletviewer AppletMenu.html

http://www.javastudy.co.kr/docs/jm/jm18.html (3 / 5)2006-09-01 오전 2:03:15

http://www.javastudy.co.kr/docs/jm/jm18.html

% netscape

설명 10 setBackground(Color.white);Color 클래스의 상수를 이용해서 애플릿의 배경을 바꿀 수 있다.

http://www.javastudy.co.kr/docs/jm/jm18.html (4 / 5)2006-09-01 오전 2:03:15

http://www.javastudy.co.kr/docs/jm/jm18.html

11 MenuBar menubar = new MenuBar();애플릿에 붙일 메뉴바를 만든다.

28 c = this; 29 while (c != null && !(c instanceof Frame)) { 30 c = c.getParent(); 31 } 32 ((Frame)c).setMenuBar(menubar);메뉴바는 프레임에만 붙일 수 있다. 그러나 애플릿에는 프레임이 없기 때문에 편법을 사용해서메뉴바를 붙일 수 있다. 애플릿을 보기 위한 애플릿뷰어나 웹브라우저는 프레임이라는 것을 이용해서프레임을 얻어낸다. 얻어낸 프레임을 이용해서 메뉴바를 붙인다. 그러나, 넷스케입으로 보는 경우에메뉴바가 잘 나타나지 않는 것에 주의하라.

44 Color fg = new Color(123, 230, 10);상수가 아닌 R, G, B 값을 이용해서 Color 클래스를 만들 수 있다.

47 Font fn = new Font("Helvetica", Font.ITALIC, 24);원하는 폰트를 만들어 사용할 수 있다.

55 ((Frame)c).setCursor(Frame.WAIT_CURSOR);프레임을 이용해서 커서의 모양을 변경할 수 있다.

http://www.javastudy.co.kr/docs/jm/jm18.html (5 / 5)2006-09-01 오전 2:03:15

최종명님의 자바강좌 19 - JAVA CGI #1

<%@ Language=VBScript %>

자바와 CGI

- 글 & 코딩: 최종명

9.6.1 자바 CGI

C, Perl 언어를 이용해서 CGI 응용 프로그램을 나드는 것처럼, 자바를 이용해서 CGI 응용프로그램을 만들 수도 있다. 자바를 이용해서 CGI 응용 프로그램을 작성하기 위해서는 Durante 가 작성한 cgi_lib 클래스를 이용하는 것이 편리하다. 다음에 나와 있는 cgi_lib 클래스는 Durante 가 작성한 코드에서 "'" 문자를 사용하지 못하던 버그를 저자가 수정한 클래스이다.

cgi_lib.java 파일 1 import java.util.*; 2 import java.io.*; 3 4 class cgi_lib { 5 6 public static Hashtable ReadParse(InputStream inStream) { 7 Hashtable form_data = new Hashtable(); 8 9 String inBuffer = &quot;&quot;; 10 11 if (MethGet()) { 12 inBuffer = System.getProperty(&quot;cgi.query_string&quot;); 13 } else { 14 DataInput d = new DataInputStream(inStream); 15 String line; 16 try { 17 while((line = d.readLine()) != null) { 18 inBuffer = inBuffer + line; 19 } 20 } 21 catch (IOException ignored) { } 22 } 23 24 StringTokenizer pair_tokenizer = new StringTokenizer(inBuffer,&quot;&amp;&quot;); 25 26 while (pair_tokenizer.hasMoreTokens()) { 27 String pair = pair_tokenizer.nextToken(); 28 StringTokenizer keyval_tokenizer = new StringTokenizer(pair,&quot;=&quot;); 29 String key = new String(); 30 String value = new String(); 31 if (keyval_tokenizer.hasMoreTokens()) 32 key = urlDecode(keyval_tokenizer.nextToken()); 33 else { 34 System.out.println(&quot;cgi_lib error...&quot;); 35 } 36 if (keyval_tokenizer.hasMoreTokens()) 37 value = urlDecode(keyval_tokenizer.nextToken()); 38 else { 39 System.out.println(&quot;cgi_lib error...&quot;); 40 }

http://www.javastudy.co.kr/docs/jm/jm19.html (1 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

41 form_data.put(key,value); 42 } 43 44 return form_data; 45 } 46 47 public static String urlDecode(String cgi_msg) { 48 String msg = &quot;&quot;; 49 50 cgi_msg = cgi_msg.replace('+', ' '); 51 int len = cgi_msg.length(); 52 char c; 53 for(int i=0; i<len; i++) { 54 c="cgi_msg.charAt(i);" 55 if(cgi_msg.charAt(i)="=" '%') { 56 c="(char)" Integer.parseInt(cgi_msg.substring(i+1, i+3), 16); 57 i +="2;" 58 } 59 msg +="c;" 60 } 61 return msg; 62 } 63 64 public static String Header() { 65 return "Content-type: text/html; charset="ks_c_5601_1987₩n₩n&quot;;" 66 } 67 68 public static String HtmlTop(String Title) { 69 String Top="new" String(); 70 Top="&lt;html&gt;₩n" ; 71 Top+="&lt;head&gt;₩n" ; 72 Top+="&lt;title&gt;₩n" ; 73 Top+="Title;" 74 Top+="₩n" ; 75 Top+="&lt;/title&gt;₩n" ; 76 Top+="&lt;/head&gt;₩n" ; 77 Top+="&lt;body&gt;₩n" ; 78 79 return Top; 80 } 81 82 public static String HtmlBot() { 83 return "</body>₩n</html>₩n&quot;; 84 } 85 86 public static boolean MethGet() { 87 String RequestMethod = System.getProperty(&quot;cgi.request_method&quot;); 88 boolean returnVal = false; 89 90 if (RequestMethod != null) { 91 if (RequestMethod.equals(&quot;GET&quot;) || 92 RequestMethod.equals(&quot;get&quot;)) 93 { 94 returnVal=true; 95 } 96 } 97 return returnVal; 98 } 99 100 public static boolean MethPost() { 101 String RequestMethod = System.getProperty(&quot;cgi.request_method&quot;); 102 boolean returnVal = false; 103 104 if (RequestMethod != null) { 105 if (RequestMethod.equals(&quot;POST&quot;) || 106 RequestMethod.equals(&quot;post&quot;)) 107 { 108 returnVal=true; 109 } 110 } 111 return returnVal; 112 } 113 114 public static String MyBaseURL() { 115 String returnString = new String(); 116 returnString = &quot;http://&quot; + 117 System.getProperty(&quot;cgi.server_name&quot;); 118 if (!(System.getProperty(&quot;cgi.server_port&quot;).equals(&quot;80&quot;)))

http://www.javastudy.co.kr/docs/jm/jm19.html (2 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

119 returnString += &quot;:&quot; + System.getProperty(&quot;cgi.server_port&quot;); 120 returnString += System.getProperty(&quot;cgi.script_name&quot;); 121 122 return returnString; 123 } 124 125 public static String MyFullURL() { 126 String returnString; 127 returnString = MyBaseURL(); 128 returnString += System.getProperty(&quot;cgi.path_info&quot;); 129 String queryString = System.getProperty(&quot;cgi.query_string&quot;); 130 if (queryString.length() &gt; 0) 131 returnString += &quot;?&quot; + queryString; 132 return returnString; 133 } 134 135 public static String Environment() { 136 String returnString; 137 138 returnString = &quot;<dl compact>₩n&quot;; 139 returnString += &quot;<dt><b>CONTENT_TYPE</b> <dd>:<i>&quot; + 140 System.getProperty(&quot;cgi.content_type&quot;) + 141 &quot;</i>:<br>₩n&quot;; 142 returnString += &quot;<dt><b>CONTENT_LENGTH</b> <dd>:<i>&quot; + 143 System.getProperty(&quot;cgi.content_length&quot;) + 144 &quot;</i>:<br>₩n&quot;; 145 returnString += &quot;<dt><b>REQUEST_METHOD</b> <dd>:<i>&quot; + 146 System.getProperty(&quot;cgi.request_method&quot;) + 147 &quot;</i>:<br>₩n&quot;; 148 returnString += &quot;<dt><b>QUERY_STRING</b> <dd>:<i>&quot; + 149 System.getProperty(&quot;cgi.query_string&quot;) + 150 &quot;</i>:<br>₩n&quot;; 151 returnString += &quot;<dt><b>SERVER_NAME</b> <dd>:<i>&quot; + 152 System.getProperty(&quot;cgi.server_name&quot;) + 153 &quot;</i>:<br>₩n&quot;; 154 returnString += &quot;<dt><b>SERVER_PORT</b> <dd>:<i>&quot; + 155 System.getProperty(&quot;cgi.server_port&quot;) + 156 &quot;</i>:<br>₩n&quot;; 157 returnString += &quot;<dt><b>SCRIPT_NAME</b> <dd>:<i>&quot; + 158 System.getProperty(&quot;cgi.script_name&quot;) + 159 &quot;</i>:<br>₩n&quot;; 160 returnString += &quot;<dt><b>PATH_INFO</b> <dd>:<i>&quot; + 161 System.getProperty(&quot;cgi.path_info&quot;) + 162 &quot;</i>:<br>₩n&quot;; 163 166 return returnString; 167 } 168 169 public static String Variables(Hashtable form_data) { 170 String returnString = &quot;<dl compact>₩n&quot;; 171 172 for (Enumeration e = form_data.keys() ; e.hasMoreElements() ;) { 173 String key = (String)e.nextElement(); 174 String value = (String)form_data.get(key); 175 returnString += &quot;<dt><b>&quot; + key + &quot;</b> <dd>:<i>&quot; +

http://www.javastudy.co.kr/docs/jm/jm19.html (3 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

176 value + &quot;</i>:<br>₩n&quot;; 177 } 178 179 returnString += &quot;</dl>₩n&quot;; 180 return returnString; 181 } 182 183 public static void main( String args[] ) { 184 System.out.println(Header()); 185 System.out.println(HtmlTop(&quot;Hello World&quot;)); 186 System.out.println(&quot;<hr>&quot;); 187 188 if (MethGet()) 189 System.out.println(&quot;REQUEST_METHOD=GET&quot;); 190 if (MethPost()) 191 System.out.println(&quot;REQUEST_METHOD=POST&quot;); 192 System.out.println(&quot;<hr>&quot;); 193 194 System.out.println(&quot;Base URL: &quot; + MyBaseURL()); 195 System.out.println(&quot;<hr>&quot;); 196 197 System.out.println(&quot;Full URL: &quot; + MyFullURL()); 198 System.out.println(&quot;<hr>&quot;); 199 200 System.out.println(Environment()); 201 System.out.println(&quot;<hr>&quot;); 202 203 Hashtable form_data = ReadParse(System.in); 204 205 System.out.println(Variables(form_data)); 206 System.out.println(&quot;<hr>&quot;); 207 208 String name = (String)form_data.get(&quot;name&quot;); 209 System.out.println(&quot;Name=&quot; + name); 210 System.out.println(&quot;<hr>&quot;); 211 212 System.out.println(HtmlBot()); 213 } 214 }

이 cgi_lib 클래스를 이용해서 "Hello World"를 출력하는 간단한 CGI 프로그램을 작성해보자.자바를 CGI로 이용하기 위해서는 원하는 작업을 수행하는 자바 클래스와 웹서버의 요청에 의해서자바 클래스를 실행시키는 부분이 필요하다. 우선적으로 "Hello World"를 출력하는 자바 클래스를 만들어보자.

HelloCGI.java 파일 1 public class HelloCGI { 2 public static void main(String agrs[]) { 3 System.out.println(cgi_lib.Header()); 4 System.out.println("Hello World"); 5 System.out.println(cgi_lib.HtmlBot()); 6 } 7 }

http://www.javastudy.co.kr/docs/jm/jm19.html (4 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

HelloCGI.java 파일을 작성한 뒤에 javac를 이용해서 컴파일한다. 이제는 웹서버가 요청하는 경우에HelloCGI 클래스를 실행시켜줄 프로그램이 필요하다. 이러한 구동 프로그램은 보통 간단한 쉘 스크립트를이용하는 것이 보통이다. HelloCGI 클래스를 구동시키는 쉘 스크립트를 javacgi.pl 이라는 파일에 작성해보자.

javacgi.pl 파일 1 #!/bin/sh 2 /usr/local/java/bin/java ₩ 3 -Dcgi.content_type=$CONTENT_TYPE ₩ 4 -Dcgi.content_length=$CONTENT_LENGTH ₩ 5 -Dcgi.request_method=$REQUEST_METHOD ₩ 6 -Dcgi.query_string=$QUERY_STRING ₩ 7 -Dcgi.server_name=$SERVER_NAME ₩ 8 -Dcgi.server_port=$SERVER_PORT ₩ 9 -Dcgi.script_name=$SCRIPT_NAME ₩ 10 -Dcgi.path_info=$PATH_INFO ₩ 11 HelloCGI

결과CGI를 지원하는 웹서버에서 javacgi.pl 파일을 웹브라우저를 이용해 방문한다.

9.6.2 정보 검색

과학 논문을 검색하기 위해 1940년대 부터 발달하기 시작한 정보 검색은, 대학교/연구소/도서관 등에서엄청난 문서들 속에서 원하는 정보를 검색하도록 도와주고 있다. 또한 정보 검색은 인터넷이 발달하면서그 중요성은 더욱 가중되고 있다. 정보 검색은 사용자의 질의어에 매치되는 적절한 문서들을 사용자에게제공하는 역할을 한다. 다음 그림은 일반적인 정보 검색 시스템의 작업을 보여준다. 인터넷 서치 엔진인경우에는 인터넷에서 문서들을 가져올 수도 있을 것이다. 문서들은 문서 번호를 부여받고, 문서의 내용은단어로 처리된다. 각 단어들은 불용어 처리 단계를 거치면 불용어들이 제거되고 의미 있는 단어들만남게 된다. 불용어란 전치사, 관사 등 많이 사용되지만 정보 검색에서 별로 의미가 없는 단어를 말한다.의미있는 단어들은 다시 어근 처리 단계를 거쳐 어근 형태로 가중치 값을 가지고 데이타베이스에 저장된다. 데이타 베이스는 꼭 DBMS 일 필요는 없다. 데이타베이스는 역파일(inverted file),시그니쳐(signiture), 팻트리(Pat trees), 그래프, 해슁 등의 형태로 저장될 수 있다. 정보 검색에

http://www.javastudy.co.kr/docs/jm/jm19.html (5 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

관한 자세한 내용은 Williams B. Frakes의 "Information Retrieval Data Structures & Algorithms" 책을참조하기 바란다.

http://www.javastudy.co.kr/docs/jm/jm19.html (6 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

이 장에서는 정보 검색에서 가장 간단한 역파일을 만들어서 사용자의 질의어에 맞는 정보를 추출하는방법을 알아보자. 문서 번호가 할당된 여러 개의 문서들이 있고, 각 문서에 키워드들이 있다고 가정하자.각 키워드는 소속된 문서 번호 정보를 가지고 있다. 키워드를 알파벳 순으로 정렬하면 사용자 질의어에따라 키워드만 찾으면 키워드가 소속된 문서를 쉽게 찾을 수 있다. 이 알파벳순으로 정렬된 키워드파일을 역파일이라고 한다. 역파일은 배열/B 트리/trie/해슁 구조 등 다양한 자료 구조를 이용해서작성할 수 있다. 이곳에서는 배열을 이용하는 방법을 알아보자. 배열을 이용해서 역파일을 만드는절차는 다음 그림과 같다. 먼저 입력된 파싱 과정을 통해 문서는 문서에서 위치에 따라 단어의 연속으로분리된다. 파싱 과정을 통과한 단어는 문서내에서 단어의 위치 순으로 정렬되어 있다. 이것을 역파일로 만들기 위해서는 단어의 알파벳 순으로 정렬해야 한다. 정렬과정을 통과한 단어들은 중요도에따라 가중치 값을 갖을 수 있다.

배열을 이용해서 역파일을 효과적으로 만드는 방법이 버지니아 공대에서 Edward A. Fox 에 의해FAST-INV라 불리는 알고리즘이 개발되었다. 각 페이지의 중요한 단어들은 컨섭 넘버(concept number)라는 유일한 번호로 표현된다. FAST-INV의 입력은 문서 번호와 문서에 포함된 컨셉넘버의 쌍으로된 도규먼트 벡터 파일(document vector file)이다. 도큐먼트 벡터 파일은 컨셉넘버 순으로 정렬되어있다. HCN은 컨셉 넘버에서 가장 큰 수라고 정의하자. 다음 그림은 FAST-INV가 작동하는 모습을 그림으로 보여주고 있다.

http://www.javastudy.co.kr/docs/jm/jm19.html (7 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

FAST-INV는 도큐먼트 벡터 파일을 입력으로 받아서 Preparation 단계를 거쳐 LOADTABLE 과 CONPTR 파일을만든다. Preparation 단계는 다음과 절차를 수행된다. 1. HCN 크기의 cont_entries_cnt[] 배열을 만들고 값을 모두 0으로 초기화 한다. 2. 도큐먼트 벡터 파일에서 이 나올 때 마다, con_entries_cnt[cont#]의 값을 하나 증가 시킨다.

http://www.javastudy.co.kr/docs/jm/jm19.html (8 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

3. con_entries_cnt[] 배열을 CONPTR 파일에 저장한다. 4. 적당한 크기의 로드를 결정하고, LOADTABLE 파일을 작성한다. 적당한 로드의 크기는 메모리에서 한번에 처리될 만큼의 데이타 양이다. 그림에서는 로드의 크기를 4,3,3 으로 정했다.Preparation 단계의 산출물인 LOADTABLE 은 Splitting 단계를 거쳐 DVL 파일을 만든다. DVL 파일은각 로드마다 의 쌍을 갖는 파일이다. Inverting 단계에서는 DVL 파일과 LOADTABLE,CONPTR 파일을 이용해서 각 로드별로 컨셉 넘버 순으로 정렬이된 역파일(INVERT)을 생성한다.FAST-INV 알고리즘이 작동되는 방법을 살펴보았으니, 이제 도큐먼트 벡터 파일을 작성하는 방법을알아보자. 도큐먼트 벡터 파일은 perl 언어를 이용한 dvf라는 프로그램을 통해서 만들 수 있다.dvf는 문서를 읽고 단어를 추출해서 common_word라는 파일에 기록된 불용어 인가를 판단해서불용어가 아닌 경우에 ndbm 파일에 <단어, 컨셉 넘버> 데이타 베이스를 만든다. dvf는 또한 도큐먼트 벡터 파일을 만들어서 의 데이터를 저장한다.

dvf 파일 1 #!/usr/local/bin/perl 2 3 # 4 # Read a series of documents (separated by newlines) from a document 5 # database, split each document into words, remove the common words 6 # (specified in the stoplist), assign a unique identifier to each 7 # word (if an identifier has not already been assigned), and save 8 # the (word, identifier) pair to an ndbm file. Also, write out the 9 # (document, word id) pairs in binary, integer tuples. 10 # 11 # 12 # Usage: dvf <document database filename> 13 # <common words filename> 14 # <ndbm file name> 15 # <dvf file name> 16 # 17 18 $docDatabase = $ARGV[0]; 19 $commonWords = $ARGV[1]; 20 $dbmFile = $ARGV[2]; 21 $dvfFile = $ARGV[3]; 22 23 24 # 25 # Subroutine used for comparisons in sort 26 # 27 sub numerically { $a <=> $b; } 28 29 30 31 # 32 # Read the stoplist into an associative array 33 # 34 open(COMMONWORDS, $commonWords) || die(&quot;ERROR: Couldn't open common words₩n&quot;); 35 36 while ($word = <commonwords>) 37 { 38 $word =~ s/₩s+//g; 39 $common{$word} = $word; 40 } 41

http://www.javastudy.co.kr/docs/jm/jm19.html (9 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

42 close(COMMONWORDS); 43 44 45 # 46 # Set the record separator to &quot;₩n₩n&quot;. This allows us to read in 47 # an entire document at a time. 48 # 49 $/ = &quot;₩n₩n&quot;; 50 51 52 # 53 # Open the document database 54 # 55 open(DOCDATABASE, &quot;<$docdatabase") || die("Couldn't open document database₩n"); 56 57 58 # 59 # Open the DVF output file 60 # 61 open(DVF, ">$dvfFile&quot;) || die(&quot;Couldn't open DVF file₩n&quot;); 62 63 # 64 # Open the ndbm file and bind it to the associative array %db 65 # 66 dbmopen(%DB, $dbmFile, 0666); 67 68 69 # Write a dummy HCN as first integer in the file 70 $hcn = 0; 71 print(DVF pack(&quot;i&quot;, $hcn)); 72 73 74 # 75 # Read a document, split it into individual words, remove the common 76 # words, and save it to the dbm file if it isn't already saved 77 # 78 $docId = 0; 79 $uniqueId = 0; 80 81 while ($doc = <docdatabase>) 82 { 83 # translate all characters to lower case 84 $doc =~ tr/A-Z/a-z/; 85 86 # remove all HTML commands 87 $doc =~ s/<[^>]*&gt;//g; 88 89 # remove the whitespace at the beginning of the document 90 $doc =~ s/^₩W+//; 91 92 # perform the split and process each word 93 @doc = split(/₩W+/, $doc); 94 foreach $word (@doc) 95 { 96 if ((!defined($common{$word})) &amp;&amp; (!defined($DB{&quot;$word&quot;}))) 97 { 98 $DB{&quot;$word&quot;} = pack(&quot;i&quot;, $uniqueId); 99 100 print(&quot;Adding: $word (id = $uniqueId)₩n&quot;);

http://www.javastudy.co.kr/docs/jm/jm19.html (10 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

101 $uniqueId++; 102 } 103 104 if (!defined($common{$word})) 105 { 106 @dvf[$#dvf + 1] = unpack(&quot;i&quot;, $DB{&quot;$word&quot;}); 107 } 108 } 109 110 # Sort and write the dvf file for this document 111 @dvf = sort(numerically @dvf); 112 foreach $element (@dvf) 113 { 114 print(DVF pack(&quot;i&quot;, $docId)); 115 print(DVF pack(&quot;i&quot;, $element)); 116 117 print(&quot;<$docid, $element>₩n&quot;); 118 } 119 120 $docId++; 121 @dvf = (); 122 print(&quot;------------------------------₩n&quot;); 123 } 124 125 126 # 127 # Write the real HCN in the first integer of the DVF file 128 # 129 $uniqueId--; 130 seek(DVF, 0, 0); 131 print(DVF pack(&quot;i&quot;, $uniqueId)); 132 print(&quot;₩n₩nHCN = $uniqueId₩n&quot;); 133 134 # 135 # Close the files 136 # 137 dbmclose(DB); 138 close(DVF); 139 close(DOCDATABASE);

% dvf documents common_words documents documents.dvf % lscommon_words documents documents.dir documents.dvf documents.pag dvf

dbm 은 유닉스에서 제공되는 key/content 의 쌍으로 되어 있는 데이타 베이스로서 키값을 가지고값을 가져올 수 있는 일련의 라이브러리 함수들이다. dbm을 이용해서 데이타 베이스를 만들면.dir 파일과 .pag 파일이 생성된다. dbm 에 관련된 간단한 프로그램 소개는 이 장의 마지막에서소개 하도록하자.

이제 도큐먼트 벡터 파일이 만들어 졌으니 FAST-INV 알고리즘을 이용해서 역파일(INVERT)을만들어 보자. 다음의 FastInv.java 파일은 도큐먼트 벡터 파일을 입력으로 받아서 CONPTR,LOADTABLE, INVERT 파일을 만드는 프로그램이다.

http://www.javastudy.co.kr/docs/jm/jm19.html (11 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

FastInv.java 파일 1 import java.util.*; 2 import java.io.*; 3 4 public class FastInv { 5 final int DEBUG_DVF = 0; 6 final int DEBUG_CONPTR = 1; 7 final int DEBUG_LOADTABLE = 1; 8 final int DEBUG_DVL = 1; 9 final int DEBUG_IN = 1; 10 RandomAccessFile dvf; 11 RandomAccessFile LOADTABLE; 12 RandomAccessFile CONPTR; 13 RandomAccessFile DVL; 14 RandomAccessFile INV; 15 int hnc = 0; // total # of concepts 16 int start = 0; // start concept # (used in LOADTABLE) 17 int end = 0; // end concept # (used in LOADTABLE) 18 int loadSize = 10; // load file size 19 int loadNum = 0; 20 int cntptr[], conOffset[]; 21 String dvfName = null; 22 23 public FastInv(String s) { 24 try { 25 dvf = new RandomAccessFile(s, &quot;r&quot;); 26 dvfName = s; 27 } catch(IOException e) { System.out.println(&quot;IOException: 24&quot;); } 28 prepare(); 29 splitNinvert(); 30 } 31 32 33 public void prepare() { 34 int doc; 35 int con; 36 37 try { 38 hnc = dvf.readInt(); 39 if(DEBUG_DVF != 0) 40 System.out.println(&quot;HNC:&quot;+hnc); 41 cntptr = new int[hnc+1]; 42 conOffset = new int[hnc+1]; 43 for(int i=0; i <= hnc; i++) 44 cntptr[i]="0;" 45 int olddoc="-1;" 46 int oldcon="-1;" 47 while((doc="dvf.readInt())" !="-1)" { 48 con="dvf.readInt();" 49 if((olddoc !="doc)||(oldcon" !="con))" { //중복되는 내용 삭제 50 if(DEBUG_DVF !="0)" { 51 System.out.print("<"+doc+","); 52 System.out.println(con+">&quot;); 53 } 54 cntptr[con]++; 55 olddoc = doc; 56 oldcon = con; 57 } 58 } 59 } catch(IOException e) { ;} 60

http://www.javastudy.co.kr/docs/jm/jm19.html (12 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

61 // cntptr[] 테스트 62 if(DEBUG_CONPTR != 0) 63 for(int i=0; i <= hnc; i++) 64 System.out.println("cntptr["+i+"]:₩t"+cntptr[i]); 65 66 // CONPTR & Load Table 만들기 67 int offset="0;" 68 loadNum="0;" 69 int conN="0;" // # of concepts 70 int conO="0;" // # of occurrence of concepts 71 try { 72 CONPTR="new" RandomAccessFile("CONPTR","rw"); 73 LOADTABLE="new" RandomAccessFile("LOADTABLE", "rw"); 74 75 for(int i="0;" i <="hnc;" i++) { 76 // CONPTR 만들기 77 loadNum="(int)i/loadSize;" 78 if(DEBUG_CONPTR !="0)" 79 System.out.println("CONPTR:₩t"+i+"₩t"+offset+"₩t"+cntptr[i]+"₩t"+ loadNum); 80 CONPTR.writeInt(i); // concept # 81 CONPTR.writeInt(offset); // Offset 82 CONPTR.writeInt(cntptr[i]); // Document Number 83 CONPTR.writeInt(loadNum); // Load Number 84 conOffset[i]="offset;" // 각 concept의 offset을 저장 85 offset +="cntptr[i];" 86 conO +="cntptr[i];" 87 88 // LoadTable 만들기 89 if((i !="0" && ((i+1)%loadSize="=" 0))||(i="=" hnc)) { 90 if(i="=" hnc) { 91 end="i;" 92 conO +="cntptr[i];" 93 } else 94 end="i" ; 95 conN="end" start + 1; 96 if(DEBUG_LOADTABLE !="0)" 97 System.out.println("LoadTable:₩t"+loadNum+"₩t"+start+"₩t"+end+"₩t"+conN+"₩t "+conO); 98 LOADTABLE.writeInt(loadNum); 99 LOADTABLE.writeInt(start); 100 LOADTABLE.writeInt(end); 101 LOADTABLE.writeInt(conN); 102 LOADTABLE.writeInt(conO); 103 start="end+1;" 104 conO="cntptr[i];" 105 } 106 } 107 } catch(IOException e) { ; } 108 finally { 109 try { 110 CONPTR.close(); 111 LOADTABLE.close(); 112 dvf.seek(0); 113 } catch(IOException e) { ; } 114 } 115 } 116 117 118 119 public void splitNinvert() { 120 int conN="-1;" 121 int docN="-1;" 122 try { 123 INV="new" RandomAccessFile("INVERT", "rw"); 124 DVL="new" RandomAccessFile("DVL", "rw"); 125 LOADTABLE="new" RandomAccessFile("LOADTABLE", "rw"); 126 } catch(IOException ioe) { System.out.println("118"); } 127 128 if(DEBUG_DVL !="0)" { 129 System.out.println("₩nDoc Vectors Loads Files: <doc#, con#>&quot;); 130 } 131 132 int ntuple = 0; 133 int countingTuple = 0; 134 int dvlInCore[][]; 135 136 try { 137 for(int i=0; i <= loadNum; i++) { // 모든 load에 대해 138 LOADTABLE.readInt(); // load number를 읽는다. 139 start="LOADTABLE.readInt();" // start concept #를 읽는다. 140 end="LOADTABLE.readInt();" // end concept #를 읽는다. 141 LOADTABLE.readInt(); // concept의 갯수를 읽는다. 142 ntuple="LOADTABLE.readInt();" // 튜플의 갯수를 읽는다. 143 dvlInCore="new" int[ntuple][2]; // 한 load의 DVL 파일 in-core 버전 144 dvf.readInt(); // HNC를 읽는다. 145 146 if(DEBUG_DVL !="0)" 147 System.out.println("Load Number:₩t"+ i+"₩t:"+ ntuple+" tuples"); 148 149 try { 150 countingTuple="0;" 151 int olddoc="-1;" 152 int oldcon="-1;" 153 154 // DVL 파일 만들기 155 while((docN="dvf.readInt())" !="-1)" { 156 conN="dvf.readInt();" 157 if(((start <="conN)" && (conN <="end))" && ((olddoc !="docN)||(oldcon" !="conN)))" { 158 if(DEBUG_DVL !="0)" { 159 System.out.println("DVL:₩t<"+docN+","+conN+">&quot;); 160 } 161 DVL.writeInt(docN); 162 DVL.writeInt(conN); 163 dvlInCore[countingTuple][0] = docN; 164 dvlInCore[countingTuple][1] = conN; 165 countingTuple++; 166 } 167 168 if(countingTuple == ntuple) 169 break; 170 olddoc = docN; 171 oldcon = conN; 172 173 } // END of WHILE 174 } catch (IOException ioe) { ; } 175

http://www.javastudy.co.kr/docs/jm/jm19.html (13 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

176 if(DEBUG_DVL != 0) 177 System.out.println(&quot; &quot;); 178 179 // Inverted File 만들기 180 int kk = 0; 181 int inv[][] = new int[ntuple][2]; 182 int startOffset = conOffset[start]; 183 while(kk <countingtuple) { 184 int d="dvlInCore[kk][0];" 185 int c="dvlInCore[kk][1];" 186 //System.out.print("start: "+start+"₩tconOffset["+c+"]:"+conOffset[c]+"₩tinv["+ (conOffset[c]-startOffset)+"]:₩t"+c); 187 //System.out.println(","+d); 188 inv[conOffset[c]-startOffset][0]="c;" 189 inv[conOffset[c]-startOffset][1]="d;" 190 conOffset[c]++; 191 kk++; 192 } 193 //System.out.println("₩nEND of LOAD: " + i +":₩t"+kk+" items₩n"); 194 195 for(int hh="0;" hh < kk; hh++) { // 역 파일을 저장한다. 196 INV.writeInt(inv[hh][0]); 197 INV.writeInt(inv[hh][1]); 198 } 199 200 if(DEBUG_IN !="0)" { 201 countingTuple="kk;" 202 kk="0;" 203 while(kk < countingTuple) { 204 System.out.println("inv["+(kk+start)+"]:₩t"+inv[kk][0] +" , "+inv[kk][1]); 205 kk++; 206 } 207 System.out.println(" "); 208 } 209 210 dvf.seek(0); 211 } // End of FOR 212 213 LOADTABLE.close(); 214 dvf.close(); 215 DVL.close(); 216 INV.close(); 217 } catch (IOException e){ System.out.print("196"); } 218 } 219 220 public static void main(String[] args) { 221 FastInv p="new" FastInv(args[0]); 222 } 223 }

% java FastInv documents.dvf% lsCONPTR DVL INVERT LOADTABLE ......

이제 역파일을 만들었으니 사용자 질의어를 받아서 정보를 검색하는프로그램을 만들어야 겠다.역 파일을 이용해서 키워드가 속한 문서를 찾기 위해서는 다음 그림과 같은 절차의 작업이필요하다.

사용자의 질의어는 토큰으로 분리되서 각 각 dbm 파일에서 단어에 해당되는 컨셉 넘버를 받아온다.CONPTR 파일은 컨셉 넘버 순으로 정렬되어 있기 때문에 컨셉 넘버를 알면 쉽게 offset을 알 수 있다.

http://www.javastudy.co.kr/docs/jm/jm19.html (14 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

offset은 컨셉 넘버가 역파일(INVERT)에 존재하는 위치를 가리킨다. offset 을 이용해 역파일의내용을 읽으면 키워드가 속한 문서들의 번호를 알 수 있다. 문서의 번호를 안 다음에는 각 문서의시작 위치를 .ind 파일에서 알아보아야 한다.다음은 .ind 파일을 만드는 perl 프로그램이다.

makeIndex 파일 1 #!/usr/local/bin/perl 2 3 # 4 # Creates a binary index for the document database. Each document ends with 5 # two carriage returns. 6 # 7 # usage: makeIndex inFile outFile 8 # 9 10 11 $sizeofInt = 4; 12 13 14 $/ = &quot;₩n₩n&quot;; 15 16 $inFile = @ARGV[0]; 17 $outFile = @ARGV[1]; 18 19 print(&quot;inFile = $inFile₩n&quot;); 20 print(&quot;outFile = $outFile₩n&quot;); 21 22 open(INFILE, &quot;$inFile&quot;); 23 open(OUTFILE, &quot;&gt;$outFile&quot;); 24 25 $currentPos = 0; 26 while ( $line = <infile> ) 27 { 28 print(&quot;line = $line&quot;); 29 print(OUTFILE pack(&quot;i&quot;, $currentPos)); 30 $currentPos += length($line); 31 } 32 33 print(OUTFILE pack(&quot;i&quot;, $currentPos)); 34 35 close(OUTFILE); 36 close(INFILE);

% makeIndex documents documents.ind

다음은 .ind 파일의 내용을 확인하는 perl 프로그램이다.readIndex 파일 1 #!/usr/local/bin/perl 2 3 # 4 # Reads the document database index file. 5 # 6 # Usage: readIndex <index> 7 #

http://www.javastudy.co.kr/docs/jm/jm19.html (15 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

8 9 $sizeofInt = 4; 10 $filename = @ARGV[0]; 11 12 13 open(INDEX, $filename) || die(&quot;Couldn't open $filename₩n&quot;); 14 15 $docNum = 0; 16 while(read(INDEX, $byteOffset, $sizeofInt)) 17 { 18 $byteOffset = unpack(&quot;i&quot;, $byteOffset); 19 20 print(&quot;Document $docNum begins at byte $byteOffset₩n&quot;); 21 $docNum++; 22 }

다음은 질의어 토큰을 잘라서 정보를 검색하는 프로그램이다. dbm 파일을 접근하기 위해서네이티브 메소드를 사용했다.

getQuery.java 파일 1 import java.util.*; 2 import java.io.*; 3 4 class getQuery { 5 6 public native int lookupConceptWord(String dbm, String key); 7 8 static { 9 System.loadLibrary(&quot;lookup&quot;); 10 } 11 12 public getQuery() { 13 14 } 15 16 public static void main( String args[] ) 17 { 18 getQuery q = new getQuery(); 19 int id = -1, offset = 0; 20 int numOfDoc = 0; // 도큐먼트의 갯수 21 int docNum = -1; // 도큐먼트 번호 22 int docBase = -1; // 도큐먼트의 시작 주소 23 int len = 0; // 도큐먼트의 길이 24 Date date = null; 25 Date date2 = null; 26 long timeOld = 0; 27 long timeNew = 0; 28 int base[] = new int[15]; 29 int docList[] = new int[14]; 30 Vector tokenList = new Vector(); 31 RandomAccessFile CONPTR = null; 32 RandomAccessFile INV= null; 33 RandomAccessFile IND= null;

http://www.javastudy.co.kr/docs/jm/jm19.html (16 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

34 RandomAccessFile DOC= null; 35 try { 36 CONPTR = new RandomAccessFile(&quot;CONPTR&quot;, &quot;r&quot;); 37 INV= new RandomAccessFile(&quot;INVERT&quot;, &quot;r&quot;); 38 IND= new RandomAccessFile(&quot;documents.ind&quot;, &quot;r&quot;); 39 DOC= new RandomAccessFile(&quot;documents&quot;, &quot;r&quot;); 40 for(int i =0; i <base.length; i++) 41 base[i]="IND.readInt();" 42 } catch (IOException ioe) { ; } 43 44 date="new" Date(); 45 timeOld="date.getTime();" 46 for(int i="0;" i<14; i++) 47 docList[i]="-1;" 48 49 System.out.println(cgi_lib.Header()); 50 Hashtable form_data="cgi_lib.ReadParse(System.in);" 51 52 String query_field="(String)form_data.get(&quot;query_field&quot;);" 53 System.out.println("<body bgcolor="#ffffff">&quot;); 54 55 if(query_field == null) { 56 System.out.println(&quot;There is no Query!!&quot;); 57 System.out.println(cgi_lib.HtmlBot()); 58 System.exit(0); 59 } 60 61 StringTokenizer st = new StringTokenizer(query_field,&quot; ₩t₩n.!?&gt;+-=&quot;); 62 String token = null; 63 System.out.println(&quot;<table border="1"><tr><td>Query String<td>&quot;+query_field+&quot;</tr></table>&quot;); 64 65 System.out.println(&quot;<table>&quot;); 66 while(st.hasMoreTokens()) { 67 token = st.nextToken(); 68 tokenList.addElement(token); 69 id = q.lookupConceptWord(&quot;documents&quot;, token); 70 if(id <0) { 71 System.out.print("<br>&quot; + token + &quot; : We don't have it.&quot;); 72 continue; 73 } 74 try { 75 CONPTR.seek(id*4*4+4); 76 offset = CONPTR.readInt(); 77 numOfDoc = CONPTR.readInt(); 78 System.out.print(&quot;<tr bgcolor="#bbaaaa"><td>&quot;+token+&quot;<td>Con #&quot;+id+&quot;<td># of Docs<td>&quot;+numOfDoc); 79 INV.seek(offset*4*2+4); 80 docNum = INV.readInt(); 81 docList[docNum] = 1; 82 for(int i = 1; i <numofdoc; i++) { 83 INV.readInt(); 84 docNum="INV.readInt();" 85 docList[docNum]="1;" 86 } 87 } catch(IOException ioe) { System.out.println("IOException!!"); } 88 System.out.print("</tr>&quot;); 89 } 90 System.out.print(&quot;</table><hr>&quot;); 91 92 for(int i=0; i<14; i++) { 93 if(docList[i]="=" 1) { 94 continue; 95 } 96 //System.out.println("doc#:₩t"+i); 97 byte b[]="new" byte[1]; 98 docBase="base[i];" 99 len="base[i+1]" docBase; 100 byte contents[]="new" byte[len]; 101 int l="0;" 102 try { 103 DOC.seek(docBase); 104 System.out.print("<table border="1"><tr bgcolor="#aabbaa"><td>doc #<td>&quot;+i+&quot;<td> length<td>&quot;+len+&quot;</tr></table>&quot;); 105 DOC.read(contents); 106 String s = new String(contents, 0); 107 StreamTokenizer stkn = new StreamTokenizer(new StringBufferInputStream(s)); 108 stkn.ordinaryChars(1, 8);

http://www.javastudy.co.kr/docs/jm/jm19.html (17 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

109 stkn.ordinaryChars(33, 47); 110 stkn.ordinaryChars(58, 64); 111 String word = null; 112 int c = 0; 113 boolean isWordtype = false; 114 boolean isAmper = false; 115 EOF: 116 while(true) { 117 try { 118 c = stkn.nextToken(); 119 } catch (IOException e) { System.out.println(&quot;IOException&quot;); } 120 switch(c) { 121 case StreamTokenizer.TT_EOF: 122 break EOF; 123 case StreamTokenizer.TT_WORD: 124 word = stkn.sval; 125 isWordtype = true; 126 break; 127 default: 128 word = new Character((char)stkn.ttype).toString(); 129 //System.out.print(word); 130 isWordtype = false; 131 if(word.equals(&quot;<") || word.equals(">&quot;)) 132 isAmper = true; 133 } 134 for(int ii =0; ii<tokenlist.size(); ii++) { 135 if(isWordtype && word.equalsIgnoreCase((String)tokenList.elementAt(ii))) { 136 word="&lt;strong&gt;&lt;u&gt;" + word + "</u></strong>&quot;; 137 break; 138 } 139 } 140 if(isWordtype &amp;&amp; (!isAmper)) { 141 System.out.print(&quot; &quot;+word); 142 isAmper = false; 143 } else if(isWordtype) { 144 System.out.print(word); 145 isAmper = false; 146 }else { 147 System.out.print(word); 148 } 149 } 150 } catch(IOException ioe) { 151 System.out.print(&quot;IOException&quot;); 152 } catch(Exception e) { 153 System.out.print(&quot;Exception&quot;); 154 } 155 } 156 date2 = new Date(); 157 timeNew = date2.getTime(); 158 float elapsed = (float)(timeNew - timeOld)/1000; 159 System.out.println(&quot;<hr><center>It takes &quot;+elapsed+&quot; seconds.</center>&quot;); 160 System.out.println(cgi_lib.HtmlBot()); 161 } 162 }

http://www.javastudy.co.kr/docs/jm/jm19.html (18 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

설명 28 int base[] = new int[15]; 29 int docList[] = new int[14];도큐먼트의 수가 14개인 프로그램을 테스트하기 위해 배열의 크기를 15/14로 했다. 도큐먼트의수가 달라지면 이부분을 수정해야 한다.

lookupConcept.c 파일 1 #include <stdio.h> 2 #include <fcntl.h> 3 #include <string.h> 4 #include <ndbm.h> 5 #include &quot;getQuery.h&quot; 6 #include <stubpreamble.h> 7 8 long getQuery_lookupConceptWord(struct HgetQuery *this, 9 struct Hjava_lang_String * dbmName, struct Hjava_lang_String * javaToken) { 10 11 char * token; 12 DBM * dbm; 13 datum key, content; 14 int i, id; 15 16 dbm = dbm_open(makeCString(dbmName), O_RDONLY, 0); 17 token = makeCString(javaToken); 18 19 for(i = 0; i <strlen(token); i++) 20 token[i]="tolower(token[i]);" 21 22 key.dptr="token;" 23 key.dsize="strlen(token);" 24 25 content="dbm_fetch(dbm," key); 26 if(content.dptr !="NULL)" { 27 memcpy(&id, content.dptr, sizeof(int)); 28 return (long)id; 29 } else 30 return (long)-1; 31 }

query.pl 파일 1 #!/bin/sh 2 LD_LIBRARY_PATH=/user2/ss/jmchoi/htdocs/ir/lab3:/usr/lib:/usr/openwin/lib:/usr/local/Minerva/lib 3 export LD_LIBRARY_PATH 4 5 /usr/local/java/bin/java ₩ 6 -Dcgi.content_type=$CONTENT_TYPE ₩ 7 -Dcgi.content_length=$CONTENT_LENGTH ₩ 8 -Dcgi.request_method=$REQUEST_METHOD ₩ 9 -Dcgi.query_string=$QUERY_STRING ₩ 10 -Dcgi.server_name=$SERVER_NAME ₩ 11 -Dcgi.server_port=$SERVER_PORT ₩ 12 -Dcgi.script_name=$SCRIPT_NAME ₩ 13 -Dcgi.path_info=$PATH_INFO ₩ 14 getQuery

query.html 파일 1 <html><head><title>Query Example</title></head> 2 <body bgcolor="#ffffff"> 3 4 <br> 5 <h3><tt>Welcome to My <u>Words Search</u> Engine</tt>.</h3> 6 <br>

http://www.javastudy.co.kr/docs/jm/jm19.html (19 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

7 <center> 8 <form ACTION="query.pl" method="POST"> 9 <table border="2"> 10 <tr align="center" bgcolor="#e7a068"> <td><b>Enter keyword query</b></tr> 11 <tr align="center" bgcolor="#eeeeee"><td><input name="query_field" type="text" size="50"> <br> </tr> 12 <tr align="center" bgcolor="#eeeeee"> <td><input name="submit_button" type="submit" value=" Submit Query "> 13 <input name="reset_button" type="reset" value=" Reset Form to Initial Values "> </tr> 14 </table> 15 </form> 16 </center> 17 </body> 18 </html>

http://www.javastudy.co.kr/docs/jm/jm19.html (20 / 21)2006-09-01 오전 2:04:24

최종명님의 자바강좌 19 - JAVA CGI #1

http://www.javastudy.co.kr/docs/jm/jm19.html (21 / 21)2006-09-01 오전 2:04:25

최종명님의 자바강좌 20 - JAVA CGI #2

<%@ Language=VBScript %>

자바와 CGI(2)

- 글 & 코딩: 최종명

1. HTTP와 CGI 이해

인터넷 웹에서 가장 많이 이용되는 클라이언트/서버 형태는 웹 브라우저와 CGI를 이용하는 방법이다. HTTP 프로토콜은 TCP/IP 상위 계층에서 RPC와 유사한 형태의 간단한 기능들을 제공한다. 웹서버는 웹브라우저로부터 요청을 받으면 CGI(Common Gateway Interface) 프로토콜을 이용해서 서버측의 프로그램에 파라메타를 전달한다. HTTP 프로토콜은 상태를 유지하지 않는(stateless) 간단한 프로토콜이다. 즉, 웹브라우저가 웹문서를 요청하는 경우에 웹브라우저는 웹서버와 TCP로 네트워크를 연결한다. 네트워크가 연결되면 브라우저는 요청을 서버측에 전달하고, 서버는 요청에 맞는 응답을 브라우저에 전달한다. 서버에서 응답이 전달이 끝나면 TCP 연결을 끊어진다. HTTP 프로토콜은 간단하지만 비효율적이다. HTTP 프로토콜은 한번에 한가지 작업만 지원하기 때문에 웹문서에 그림이 3장 포함되어 있다면 최소 4번 TCP 연결이 있어야한다. 각 그림을 위해 TCP 연결을 해야 되고 웹문서를 위해 TCP 연결이 필요한 것이다. HTTP 프로토콜에서 전송되는 데이터에는 내용은 물론 데이터 자신에 관한 정보도 포함되어 있다. 이러한 특성은 HTTP의 상태를 유지하지 않는 특성을 가능하게 하였다. HTTP에서 클라이언트와 서버의 인터랙션은 요청(request)/응답(reply)으로 이루어진다. 다음은 요청에 사용되는 HTTP 포맷이다.

<method><resource identifier><HTTP version><crlf> [<Header>: <value>] <crlf> ......... [<Header>: <value>] <crlf> <crlf> [Entity body]

예제: GET /index.html HTTP/1.1 Accept: text/html Accept: audio/x User-agent: CHOI

웹브라우저의 요청에 응답하는 서버의 HTTP 포맷은 다음과 같은 형태를 취한다.

<HTTP> <result code> [<explanation>]<crlf> [<Header>: <value>]<crlf> ...... [<Header>: <value>]<crlf> <crlf> [Entity body]

http://www.javastudy.co.kr/docs/jm/jm20.html (1 / 7)2006-09-01 오전 2:05:25

최종명님의 자바강좌 20 - JAVA CGI #2

예제: HTTP 200 Document follows Date: Sat, 07 Mar 1998 09:59:15 GMT Server: NCSA/1.5.2 Last-modified: Sun, 07 Dec 1997 12:09:04 GMT Content-type: text/html Content-length: 388

% telnet it.soongsil.ac.kr 80 Trying 203.253.23.3...Connected to it.Escape character is '^]'.GET /index.html HTTP/1.1Accept: text/htmlAccept: audio/xUser-agent: CHOI

HTTP 200 Document followsDate: Sat, 07 Mar 1998 09:59:15 GMTServer: NCSA/1.5.2Last-modified: Sun, 07 Dec 1997 12:09:04 GMTContent-type: text/htmlContent-length: 388

<html><head><title>숭실대학교:정보과학대학:웹신문</title></head>

<frameset frameborder=0 border=0 bordercolor=white cols="110, *"><frame src="menu.html" noresize marginheight=0 marginwidth=0 bordercolor="#FFFFFF" scrolling=auto><frameset frameborder=0 border=0 name="main" bordercolor=white><frame src="body.shtml" name=main marginheight=20 marginwidth=0></frameset></frameset>

Connection closed by foreign host.

2. 서버측 CGI 응용프로그램

웹서버측에 다음과 같은 CGI 프로그램을 자바를 이용하여 작성하였다.

http://www.javastudy.co.kr/docs/jm/jm20.html (2 / 7)2006-09-01 오전 2:05:25

최종명님의 자바강좌 20 - JAVA CGI #2

CGIName.java 파일 1 import java.util.*; 2 3 public class CGIName { 4 public static void main(String args[]) { 5 System.out.println(cgi_lib.Header()); 6 Hashtable form_data = cgi_lib.ReadParse(System.in); 7 String name = (String)form_data.get("name"); 8 System.out.println("<body bgcolor=#ffffff>"); 9 System.out.println("문자열 길이:"+ name.length()); 10 System.out.println("<hr>Hello ~~ "+ name); 11 System.out.println(cgi_lib.HtmlBot()); 12 } 13 }

% telnet it.soongsil.ac.kr 80Trying 203.253.23.3...Connected to it.Escape character is '^]'.POST /~jmchoi/classes/cgi/cgi.pl HTTP/1.0ACCEPT: */*Content-type: application/x-www-form-urlencodedContent-length:12

name=최종명HTTP 200 Document followsDate: Sat, 07 Mar 1998 11:11:07 GMTServer: NCSA/1.5.2Content-type: text/html;

<body bgcolor=#ffffff>문자열 길이:6<hr>Hello ~~ 최종명</body></html>

Connection closed by foreign host.

3. CGI 클라이언트 프로그램

대부분의 CGI 클라이언트는 HTML의 FORM 태그를 이용한다. FORM은 HTML 2.0 이상에서지원되는 태그이다. FORM 태그에는 METHOD 와 ACTION 두개의 어트리뷰트를 반드시

http://www.javastudy.co.kr/docs/jm/jm20.html (3 / 7)2006-09-01 오전 2:05:25

최종명님의 자바강좌 20 - JAVA CGI #2

기술해주어야 한다. METHO는 POST나 GET을 사용할 수 있다. 이것은 파라메터의 값이웹서버측의 CGI 응용프로그램에 어떻게 전송되는가를 결정한다. ACTION은 FORM에서기입된 값들이 전송되서 처리되는 CGI 응용프로그램을 나타낸다. 다음은 HTML의 FORM태그를 사용해서 CGI를 이용할 수 있는 파일이다.

form.html 파일 1 FORM 을 이용한 CGI 클라이언트 2 <FORM METHOD="POST" ACTION="http://it.soongsil.ac.kr/~jmchoi/classes/cgi/cgi.pl"> 3 이름을 넣으세요<br> 4 <INPUT NAME="name" TYPE="TEXT" VALUE=""> 5 <INPUT NAME="전송" TYPE="SUBMIT" VALUE="전송"> 6 </FORM>

FORM 태그를 사용하는 것이 CGI를 이용하기에 편리하지만 자바를 이용해서도 CGI 응용프로그램과작업할 수 있다. 이것은 위에서 텔넷 프로그램을 이용하는 방법과 동일하다. 즉, 소켓을 이용해서웹서버와 직접 통신하는 방식이다. 다음 CGIsocket.java 프로그램은 소켓을 이용해서 웹서버와통신해서 CGI 프로그램을 구동시킨다.

CGIsocket.java 파일 1 import java.io.*; 2 import java.net.*; 3 4 public class CGIsocket { 5 public static void main(String args[]) { 6 Socket socket; 7 DataInputStream in; 8 DataOutputStream out; 9 String msg = "최종명"; 10 String urlmsg ; 11 String line; 12 13 try { 14 socket = new Socket("it.soongsil.ac.kr", 80); 15 in = new DataInputStream(socket.getInputStream()); 16 out = new DataOutputStream(socket.getOutputStream()); 17 18 urlmsg = URLEncoder.encode(msg); 19 out.writeBytes("POST /~jmchoi/classes/cgi/cgi.pl HTTP/1.1₩r₩n" 20 + "Content-type: application/x-www-form-urlencoded₩r₩n" 21 + "Content-length: " + urlmsg.length() + "₩r₩n₩r₩n"); 22 out.writeBytes("name=" + urlmsg); 23 24 while((line = in.readLine()) != null) { 25 System.out.println(line); 26 } 27 in.close();

http://www.javastudy.co.kr/docs/jm/jm20.html (4 / 7)2006-09-01 오전 2:05:26

최종명님의 자바강좌 20 - JAVA CGI #2

28 out.close(); 29 } catch(Exception ex) { 30 System.out.println(ex.toString()); 31 } 32 } 33 }

자바에서 GCI를 이용하는 또 다른 방법은 소켓대신에 JDK에서 지원하는 URLConnection 클래스를이용하는 방법이다. URLConnection 클래스를 사용하는 경우에 다음과 같은 CGI 클라이언트프로그램을 작성할 수 있다.

PostForm.java 파일 1 import java.net.*; 2 import java.io.*; 3 4 public class PostForm { 5 URL url; 6 7 void submitData() { 8 String name = "name=" +URLEncoder.encode("최종명"); 9 int n = name.length(); 10 11 try { 12 URLConnection uc = url.openConnection(); 13 uc.setDoOutput(true); 14 uc.setDoInput(true); 15 uc.setAllowUserInteraction(false); 16 DataOutputStream dos = new DataOutputStream(uc.getOutputStream()); 17 dos.writeBytes(name); 18 dos.close(); 19 20 DataInputStream dis = new DataInputStream(uc.getInputStream()); 21 String nextline; 22 while((nextline = dis.readLine()) != null) { 23 System.out.println(nextline); 24 } 25 dis.close(); 26 } catch (Exception e) { 27 System.err.println(e); 28 } 29 } 30 31 public static void main(String args[]) { 32 String s;

http://www.javastudy.co.kr/docs/jm/jm20.html (5 / 7)2006-09-01 오전 2:05:26

최종명님의 자바강좌 20 - JAVA CGI #2

33 try { 34 s = args[0]; 35 } catch (Exception e) { 36 s = "http://it.soongsil.ac.kr/~jmchoi/classes/cgi/cgi.pl"; 37 } 38 39 try { 40 PostForm pf = new PostForm(); 41 pf.url = new URL(s); 42 pf.submitData(); 43 } catch(Exception e) { 44 System.out.println(e); 45 } 46 } 47 }

CGI 클라이언트를 작성하는 또 다른 방법은 애플릿의 AppletContext 클래스를 이용하는 것이다.이 방법은 다른 방법보다 좀 수월하게 프로그램을 작성할 수 있을 뿐만 아니라, 웹브라우저의웹페이지를 다른 곳으로 이동시킬 수 있다는 장점이 있다.

CGIclient.java 파일 1 import java.applet.*; 2 import java.awt.*; 3 import java.net.*; 4 import java.io.*; 5 6 public class CGIclient extends Applet { 7 private Label label; 8 private TextField input; 9 private URL url; 10 11 12 public void init() { 13 setLayout(new BorderLayout()); 14 add("North", label = new Label("이름을 넣으세요")); 15 add("South", input = new TextField(10)); 16 } 17 18 19 public boolean action(Event e, Object arg) { 20 if(e.target == input) { 21 try { 22 String name = "name=" +URLEncoder.encode(input.getText()); 23 url = new URL("http://203.253.23.3/~jmchoi/classes/cgi/cgi.pl?"+name);

http://www.javastudy.co.kr/docs/jm/jm20.html (6 / 7)2006-09-01 오전 2:05:26

최종명님의 자바강좌 20 - JAVA CGI #2

24 getAppletContext().showDocument(url); 25 } catch(Exception ex) { } 26 return true; 27 } 28 return super.action(e, arg); 29 } 30 }

http://www.javastudy.co.kr/docs/jm/jm20.html (7 / 7)2006-09-01 오전 2:05:26

최종명님의 자바강좌 21 - JAVADOC사용법

<%@ Language=VBScript %>

javadoc 사용법

- 최종명

JDC의 Tech Tips에서 javadoc에 대해 나왔길래 조금 보강해서 정리합니다. javadoc는 JDK에서 제공되는 도구로서 자바 소스 파일을 이용해서 자동적으로 HTML형식의 도큐멘트를 작성해준다. javadoc을 이용하기 위해서는 /** */ 형태의 주석을 이용한다. 주석안에서는 @태그를 사용할 수 있다.

Sort.java 1 package sort; 2 3 /** 4 * Class Sort implements some common sorting algorithms. 5 */ 6 public class Sort { 7 /** 8 * Sorts a Vector of objects. 9 * 10 * @param vec the vector 11 * @param dir true for ascending order, false for descending 12 * @exception SortArgumentException if vec is null 13 */ 14 15 public void sort_vec(Vector vec, boolean dir) 16 throws SortArgumentException 17 { 18 ...... 19 } 20 }

% javadoc Sort.javaGenerating packages.htmlGenerating Package-sort.htmlGenerating sort.Sort.htmlGenerating Index.htmlGenerating tree.html

http://www.javastudy.co.kr/docs/jm/jm21.html (1 / 2)2006-09-01 오전 2:05:32

최종명님의 자바강좌 21 - JAVADOC사용법

@ 태그

@see class_name : "See also"라는 항목을 만들어 해당 클래스와 연결해준다.@see class_name#method_name : "See also"라는 항목을 만들어 특정 메소드와 연결해준다.@version text : HTML 파일의 버전을 표시하는 항목을 만들어 준다.@author text : HTML 파일의 저자를 표시하는 항목을 만들어 준다.@param name description : 특정 메소드가 취하는 파라메터를 기술할 때 사용된다.@return description : 특정 메소드의 리턴값을 기술할 때 사용된다.@exception class_name : 특정 메소드가 발생시킬 수 있는 에외상황을 기술할 때 사용된다.

http://www.javastudy.co.kr/docs/jm/jm21.html (2 / 2)2006-09-01 오전 2:05:32

최종명님의 자바강좌 22 - JACL (TCL + JAVA)

<%@ Language=VBScript %>

Java + Tcl = Jacl

- 최종명

현재 썬에서는 Jacl, Tcl Blend, Java Package, Tcl Bean 네개의 도구를 지원하고 있다.Jacl은 100% 자바로 구현한 Tcl 인터프리터이다. 1. Jacl은 http://sunscript.sun.com/java/ 사이트에서 무료로 다운로드 받을 수 있다.

2. Jacl을 다운로드 받은 다음에 인스톨한다. 소스코드를 다운로드 받은 경우에는% configure% make를 하면 컴파일 및 인스톨이 된다.

3. Jacl 이 인스톨되면 CLASSPATH 환경 변수에 Jacl의 클래스들이 있는 디렉토리를추가시켜준다. 유닉스 C-shell 사용자를 예를 들면% setenv CLASSPATH ${CLASSPATH}:/home/user/jacl1.0/unix/jacl

4. tcl 파일을 생성한다.hello.tcl 파일 1 set f [java::new java.awt.Frame] 2 $f setTitle "Hello World" 3 set button [java::new java.awt.Button] 4 $button setLabel "Hello Button" 5 $f {add java.awt.Component} $button 6 7 $f setLocation 100 100 8 $f pack 9 $f toFront

5. 이제 자바로 작성된 Tcl 인터프리터를 실행시킨다.% java tcl.lang.Shell% source hello.tcl% exit

다른 프로그램 예제를 알아보자.button.tcl 파일 1 set f [java::new java.awt.Frame]

http://www.javastudy.co.kr/docs/jm/jm22.html (1 / 2)2006-09-01 오전 2:05:37

최종명님의 자바강좌 22 - JACL (TCL + JAVA)

2 set b [java::new java.awt.Button " Exit "] 3 4 java::bind $b actionPerformed { set done yes} 5 6 $f {add java.awt.Component} $b 7 $f setLocation 100 100 8 $f pack 9 $f toFront 10 11 set done "no" 12 vwait done 13 $f dispose

text.tcl 파일 1 set f [java::new java.awt.Frame] 2 $f setTitle "TextArea" 3 set text [java::new java.awt.TextArea] 4 $text setText "Hello World...." 5 $f {add java.awt.Component} $text 6 7 $f setLocation 100 100 8 $f pack 9 $f toFront

http://www.javastudy.co.kr/docs/jm/jm22.html (2 / 2)2006-09-01 오전 2:05:37

최종명님의 자바강좌 23 - 자바 폴리머피즘

자바 폴리머피즘

- 최종명

객체지향에서 폴리머피즘이라는 말이 많이 나오는데, 이것은 poly-(많다)는 뜻의 접두어와 morphism(형태)라는 뜻이 결합된 합성어이다. 따라서 폴리모피즘은 형태가 많다는 뜻이 되는데 , 폴리모피즘이 다형성으로 번역되는 것도 이 때문이다. 형태가 많다는 말은 무슨 뜻일까 ? 이것은 의미(semantics)는 하나지만 실제 형태는 여러 가지가 될 수 있다는 말이다. 예를 들면, "밥을 먹다"는 우리는 충분히 이해할 수 있다. 그러나, 실제적으로 "밥을 먹는 형태"는 많다. 개가 밥먹는 형태, 한국 사람이 밥먹는 형태, 미국 사람이 밥먹는 형태 등 등 의미는 하나지만 실제적인 형태는 상당히 많을 수 있는 것이다.

폴리머피즘이 프로그래밍에서는 어떻게 나타나게될까 ? 폴리모피즘은 프로그램에서 특별한 연산자나 키워드가 있는 것이 아니다. 폴리모피즘은 객체지향 프로그래밍 언어에서 "오버로딩 (overloading)", "오버라이딩 (overriding)"의 형태로 나타난다.

다음 예들은 자바의 오버라이딩 폴리모피즘을 구현한 예이다.

다음은 PolyA 클래스와 PolyB 클래스를 정의하였다. PolyB클래스는 PolyA 클래스로부터 상속 받았고 두 클래스 모두 work()라는 메소드를 정의하므로서 서브클래스 PolyB는 슈퍼클래스 PolyA의 work() 메소드를 오버라이드했다. 따라서 main() 함수에서 PolyB클래스를 생성하고 work() 메소드를 호출하는 경우에 PolyB클래스의 work() 메소드가 호출된다. PolyB클래스를 PolyA 클래스 타입으로 형 변환을 하여도 PolyB클래스의 work() 메소드가 호출되는 것에 주의하라.

예제: PolyA.java 1 public class PolyA { 2 String msg; 3 4 public PolyA() { 5 msg = "I am PolyA!!"; 6 } 7 8 public void work() { 9 System.out.println("PolyA is working."); 10 System.out.println("PolyA:work:msg="+msg); 11 } 12 }

예제: PolyB.java

http://www.javastudy.co.kr/docs/jm/jm23.html (1 / 5)2006-09-01 오전 2:05:45

최종명님의 자바강좌 23 - 자바 폴리머피즘

1 public class PolyB extends PolyA { 2 public PolyB() { 3 msg = "I am PolyB.."; 4 } 5 6 public void work() { 7 System.out.println("PolyB:work:msg="+msg); 8 } 9 10 public static void main(String args[]) { 11 PolyB b = new PolyB(); 12 b.work(); 13 14 System.out.println(); 15 PolyA a = new PolyB(); 16 a.work(); 17 } 18 }

% java PolyBPolyB:work:msg=I am PolyB..

PolyB:work:msg=I am PolyB..

PolyB2는 PolyA2 클래스로부터 상속 받았고, work() 메소드를 오버라이드 했다. PolyA2에는 init() 메소드가 정의되어 있고, 이 메소드는 work() 메소드를 호출한다. PolyB2는 PolyA2로부터 상속받았기 때문에 init() 메소드를 호출할 수 있다. PolyB2 클래스가 init() 메소드를 호출하는 경우에, init()은 PolyA2와 PolyB2의 work() 메소드들 중에서 어느 것을 호출할 것인가 ? 다음 예제에서 보듯이 PolyB2 클래스의 work() 메소드가 호출된다.

예제: PolyA2.java 1 public class PolyA2 { 2 String msg; 3 4 public PolyA2() { 5 msg = "I am PolyA2!!"; 6 } 7 8 public void init() {

http://www.javastudy.co.kr/docs/jm/jm23.html (2 / 5)2006-09-01 오전 2:05:45

최종명님의 자바강좌 23 - 자바 폴리머피즘

9 work(); 10 } 11 12 public void work() { 13 System.out.println("PolyA2:work:msg="+msg); 14 } 15 }

예제: PolyB2.java 1 public class PolyB2 extends PolyA2 { 2 public PolyB2() { 3 msg = "I am PolyB2.."; 4 } 5 6 public void work() { 7 System.out.println("PolyB2:work:msg="+msg); 8 } 9 10 public static void main(String args[]) { 11 PolyB2 b = new PolyB2(); 12 b.init(); 13 14 System.out.println(); 15 PolyA2 a = new PolyB2(); 16 a.init(); 17 } 18 }

% java PolyB2PolyB2:work:msg=I am PolyB2..

PolyB2:work:msg=I am PolyB2..

PolyA2와 PolyB2의 예는 생성자에 적용될 수도 있다. 다음 PolyA3와 PolyB3는 상속 관계이고, PolyA3의 생성자는 초기화를 위해 init() 메소드를 호출한다. 그런데, PolyB3 클래스가 자신의 멤버 필드를 초기화하기 위해 init() 메소드를 오버라이드한 것이다. 이런 경우에 PolyA3 클래스의 멤버필드는 프로그래머의 의도와는 다르게 초기화 안될 수도 있다. 다음 예에서 PolyA3의 msg 멤버 필드는 적절하게 초기화 안됐다.

예제: PolyA3.java

http://www.javastudy.co.kr/docs/jm/jm23.html (3 / 5)2006-09-01 오전 2:05:45

최종명님의 자바강좌 23 - 자바 폴리머피즘

1 public class PolyA3 { 2 String msg; 3 4 public PolyA3() { 5 init(); 6 } 7 8 public void init() { 9 msg = "I am PolyA3!!"; 10 System.out.println("PolyA3:init:msg = "+msg); 11 } 12 13 public void doing() { 14 work(); 15 System.out.println("PolyA3:doing:msg = "+msg); 16 } 17 18 public void work() { 19 System.out.println("PolyA3:work:msg = "+msg); 20 } 21 }

예제: PolyB3.java 1 public class PolyB3 extends PolyA3 { 2 String msg ; 3 public PolyB3() { 4 5 } 6 7 public void init() { 8 msg = "I am PolyB3.."; 9 System.out.println("PolyB3:init:msg = " +msg); 10 } 11 12 public void work() { 13 System.out.println("PolyB3:work:msg = "+msg); 14 } 15 16 public static void main(String args[]) { 17 PolyB3 b = new PolyB3(); 18 b.doing(); 19

http://www.javastudy.co.kr/docs/jm/jm23.html (4 / 5)2006-09-01 오전 2:05:45

최종명님의 자바강좌 23 - 자바 폴리머피즘

20 System.out.println(); 21 PolyA3 a = new PolyB3(); 22 a.doing(); 23 } 24 }

% java PolyB3PolyB3:init:msg = I am PolyB3..PolyB3:work:msg = I am PolyB3..PolyA3:doing:msg = null

PolyB3:init:msg = I am PolyB3..PolyB3:work:msg = I am PolyB3..PolyA3:doing:msg = null

http://www.javastudy.co.kr/docs/jm/jm23.html (5 / 5)2006-09-01 오전 2:05:45

최종명님의 자바강좌 24 - 자바에서 Cut & Paste

<%@ Language=VBScript %>

Cut & Paste

-최종명

java.awt.datatransfer 패키지에서 클립보드를 지원하기 위한 클래스들이 정의되어 있다.현재 JDK 1.1버전에서 지원되는 클립보드는 아직 초보적인 수준이어서 문자열의 cut, copy, paste 기능만 지원한다. 다른 타입을 위한 기능은 추후에 첨가될 예정이다.

전송될 데이타를 가지고 있는 클래스는 Tansferable 인터페이스를 임플리멘츠해주어야 한다.

DataFlavor 클래스는 클립보드로 전송될 데이타의 MIME 타입을 제공하기 위해 사용된다.

Clipboard 클래스는 cut, copy, paste 기능을 제공한다.

COPY 절차

1. java.awt.Toolkit 클래스의 getSYstemClipboard() 메소드를 이용해서 클립보드를생성한다.

2. Tansferable 인터페이스를 임플리멘츠한 클래스(ex, StringSelection)를 생성한다.

3. Tansferable 인터페이스를 임플리멘츠한 클래스를 클립보드에 setContents() 메소드를이용해서 붙인다.예: public void copy(TextField tf) { StringSelection data = new StringSelection(tf.getText()); Clipboard clipboard = Toolkit().getDefaultToolkit().getSystemClipboard(); clipboard.setContents(data, data); }

PASTE 절차

1. java.awt.Toolkit 클래스의 getSystemClipboard() 메소드를 이용해서 클립보드를

http://www.javastudy.co.kr/docs/jm/jm24.html (1 / 4)2006-09-01 오전 2:05:51

최종명님의 자바강좌 24 - 자바에서 Cut & Paste

생성한다.

2. 클립보드의 getContents() 메소드를 이용해서 클립보드의 내용을 얻는다.

3. getTransferData() 메소드를 이용해서 원하는 데이타를 얻는다.

4. 얻어진 데이타를 적당한 타입으로 변환한다.예: public void paste(TextField tf) { Clipboard clipboard = Toolkit().getDefaultToolkit().getSystemClipboard(); Transferable data = clipboard.getContents(this); String s; try { s = (String) (data.getTransferData(DataFlavor.stringFlavor)); } catch (Exception e) { s = data.toString(); } tf.setText(s); }

예제: CutNPaste.java 파일

1 import java.io.*; 2 import java.awt.*; 3 import java.awt.datatransfer.*; 4 import java.awt.event.*; 5

http://www.javastudy.co.kr/docs/jm/jm24.html (2 / 4)2006-09-01 오전 2:05:51

최종명님의 자바강좌 24 - 자바에서 Cut & Paste

6 7 public class CutNPaste extends Frame implements ActionListener { 8 TextField tf; 9 TextArea ta; 10 String selection = ""; 11 12 public static void main (String args[]) { 13 new CutNPaste().show(); 14 } 15 16 public CutNPaste() { 17 super("Cut & Paste Example"); 18 add(tf = new TextField("클립보드 예제 프로그램입니다."), "North"); 19 add(ta = new TextArea(), "Center"); 20 MenuBar mb = new MenuBar(); 21 mb.add(makeEditMenu()); 22 setMenuBar(mb); 23 setSize(250, 250); 24 } 25 26 Menu makeEditMenu() { 27 Menu editMenu = new Menu("Edit"); 28 MenuItem mi = new MenuItem("Cut"); 29 mi.addActionListener(this); 30 editMenu.add(mi); 31 mi = new MenuItem("Copy"); 32 mi.addActionListener(this); 33 editMenu.add(mi); 34 mi = new MenuItem("Paste"); 35 mi.addActionListener(this); 36 editMenu.add(mi); 37 mi = new MenuItem("Clear"); 38 mi.addActionListener(this); 39 editMenu.add(mi); 40 41 return editMenu; 42 } 43 44 public void actionPerformed (ActionEvent evt) { 45 Clipboard clipboard = getToolkit().getSystemClipboard(); 46 String cmd = evt.getActionCommand(); 47 if (cmd.equalsIgnoreCase("copy")) { 48 selection = tf.getSelectedText();

http://www.javastudy.co.kr/docs/jm/jm24.html (3 / 4)2006-09-01 오전 2:05:52

최종명님의 자바강좌 24 - 자바에서 Cut & Paste

49 if(selection == null || selection.length() == 0) 50 selection = tf.getText(); 51 StringSelection data = new StringSelection(selection); 52 clipboard.setContents(data, data); 53 } else if (cmd.equalsIgnoreCase("clear")) { 54 tf.setText(""); 55 } else if (cmd.equalsIgnoreCase("paste")) { 56 Transferable clipData = clipboard.getContents(this); 57 String s; 58 try { 59 s = (String)(clipData.getTransferData(DataFlavor.stringFlavor)); 60 } catch (Exception e) { 61 s = e.toString(); 62 } 63 ta.append(s+"₩n"); 64 } else if (cmd.equalsIgnoreCase("cut")) { 65 StringSelection data = new StringSelection(tf.getText()); 66 clipboard.setContents(data, data); 67 tf.setText(""); 68 } 69 } 70 }

http://www.javastudy.co.kr/docs/jm/jm24.html (4 / 4)2006-09-01 오전 2:05:52

최종명님의 자바강좌 25 - 자바스크립트를 이용한 애플릿 제어

<%@ Language=VBScript %>

자바스크립에서 자바 애플릿 함수 호츨

- 최종명

자바스크립을 이용하는 경우에 자바 애플릿의 public 함수를 자바스크립트에서 호출할 수 있다. 다음은 자바스크립트를 이용해서 자바애플릿의 함수를 호출해서 애플릿의 메시지와 폰트 색, 배경 색을 변경하는 예제 프로그램이다.

예제: JSApplet.java 파일 1 import java.awt.*; 2 import java.applet.*; 3 4 public class JSApplet extends Applet { 5 String msg = "Hello ~ javascript"; 6 Color fg = Color.black; 7 Color bg = Color.lightGray; 8 9 public void init() { 10 setBackground(bg); 11 } 12 13 public void paint(Graphics g) { 14 g.setColor(fg); 15 g.drawString(msg, 25, 25); 16 } 17 18 public void setMessage(String msg) { 19 this.msg = msg; 20 repaint(); 21 } 22 23 public String getMessage() { 24 return msg; 25 } 26 27 public String getFG() { 28 int r = fg.getRed(); 29 int g = fg.getGreen(); 30 int b = fg.getBlue();

http://www.javastudy.co.kr/docs/jm/jm25.html (1 / 4)2006-09-01 오전 2:05:59

최종명님의 자바강좌 25 - 자바스크립트를 이용한 애플릿 제어

31 String color= "#"; 32 if(r < 16) 33 color += "0" + Integer.toHexString(r); 34 else 35 color += Integer.toHexString(r); 36 37 if(g < 16) 38 color += "0" + Integer.toHexString(g); 39 else 40 color += Integer.toHexString(g); 41 42 if(b < 16) 43 color += "0" + Integer.toHexString(b); 44 else 45 color += Integer.toHexString(b); 46 47 return color; 48 } 49 50 public void setFG(String fgColor) { 51 try { 52 if(fgColor.startsWith("#")) { 53 int r = Integer.parseInt(fgColor.substring(1,3), 16); 54 int g = Integer.parseInt(fgColor.substring(3,5), 16); 55 int b = Integer.parseInt(fgColor.substring(5), 16); 56 fg = new Color(r, g, b); 57 } else { 58 int r = Integer.parseInt(fgColor.substring(0,2), 16); 59 int g = Integer.parseInt(fgColor.substring(2,4), 16); 60 int b = Integer.parseInt(fgColor.substring(4), 16); 61 fg = new Color(r, g, b); 62 } 63 repaint(); 64 } catch(Exception e) { 65 System.out.println(e); 66 } 67 } 68 69 public String getBG() { 70 int r = bg.getRed(); 71 int g = bg.getGreen(); 72 int b = bg.getBlue(); 73 String color= "#";

http://www.javastudy.co.kr/docs/jm/jm25.html (2 / 4)2006-09-01 오전 2:05:59

최종명님의 자바강좌 25 - 자바스크립트를 이용한 애플릿 제어

74 if(r < 16) 75 color += "0" + Integer.toHexString(r); 76 else 77 color += Integer.toHexString(r); 78 79 if(g < 16) 80 color += "0" + Integer.toHexString(g); 81 else 82 color += Integer.toHexString(g); 83 84 if(b < 16) 85 color += "0" + Integer.toHexString(b); 86 else 87 color += Integer.toHexString(b); 88 89 return color; 90 } 91 92 public void setBG(String bgColor) { 93 try { 94 if(bgColor.startsWith("#")) { 95 int r = Integer.parseInt(bgColor.substring(1,3), 16); 96 int g = Integer.parseInt(bgColor.substring(3,5), 16); 97 int b = Integer.parseInt(bgColor.substring(5), 16); 98 bg = new Color(r, g, b); 99 } else { 100 int r = Integer.parseInt(bgColor.substring(0,2), 16); 101 int g = Integer.parseInt(bgColor.substring(2,4), 16); 102 int b = Integer.parseInt(bgColor.substring(4), 16); 103 bg = new Color(r, g, b); 104 } 105 setBackground(bg); 106 } catch(Exception e) { 107 System.out.println(e); 108 } 109 } 110 }

예제: JSApplet.html 1 <head> 2 <script> 3 function change(form) {

http://www.javastudy.co.kr/docs/jm/jm25.html (3 / 4)2006-09-01 오전 2:05:59

최종명님의 자바강좌 25 - 자바스크립트를 이용한 애플릿 제어

4 document.js.setBG(form.bg.value); 5 document.js.setFG(form.fg.value); 6 document.js.setMessage(form.msg.value); 7 document.jsform.msg.value = document.js.getMessage(); 8 form.fg.value = document.js.getFG(); 9 form.bg.value = document.js.getBG(); 10 } 11 </script> 12 </head> 13 14 <body bgcolor=lightgreen> 15 <applet name="js" code=JSApplet.class width=200 height=150> 16 </applet> 17 18 <form name="jsform" onSubmit="return true;"> 19 배경색 : <input type=text name=bg value="#cccccc"> <br> 20 글자색 : <input type=text name=fg value="#000000"> <br> 21 메시지 : <input type=text name=msg value="Hello ~ javascript"> <br> 22 <center> 23 <input type=button value="적 용" onClick="change(this.form);"> 24 <input type=reset value="초기값"> 25 </center> 26 </form> 27 </body>

데모

http://www.javastudy.co.kr/docs/jm/jm25.html (4 / 4)2006-09-01 오전 2:05:59

최종명님의 자바강좌 26 - 스윙 1편

<%@ Language=VBScript %>

자바 스윙(1)

이글은 숭실대학교 최종명님의 강좌에서 발최한 내용입니다. 최종명

스윙은 JFC의 일부로서 개발되고 있는며, 앞으로 JDK 1.2 버전에서는 스윙을 포함할 예정이다. 현재 JDK 1.2 베타 버전들이 발표되었으며, 곧 정식 버전이 발표될 예정이다. 스윙은 현재 1.02버전이 발표된 상태이다. JDK1.6 혹은 그 이전 버전을 사용하시는 분은 스윙 부분을 다운 로드 받아서 사용할 수 있다.

JDK 1.2에 포함된 스윙과 스윙 1.02를 사용하는 경우에 스윙 패키지가 다르기 때문에 프로그램이 약간 달라질 수도 있다.

!!! 편집자주 : 아래 소스코드중에 import 하는 부분에서 com.sun.을 JDK1.2이상에서는 java.swingx.로 입력하셔야 결과가 제대로 나옵니다.

1. 다운로드 받는 곳http://java.sun.com/products/jfc/swingdoc-current/

2. 자바 스윙 튜토리얼http://java.sun.com/Series/Tutorial/ui/swing/index.html

3. 환경 맞추기유닉스 환경 맞추기% setenv JDKHOME /home/me/jdk1.1.5% setenv SWINGHOME /home/me/swing-1.0% setenv CLASSPATH $SWINGHOME/swingall.jar:$CLASSPATH

Windows NT 환경 맞추기컨트롤패널에서 시스템 아이콘을 더블클릭하고, 프라퍼티란에 다음 사항을기재한다. JAVA_HOME C:₩JDK1.1.5 SWING_HOME C:₩swing-1.0 CLASSPATH .;%JAVA_HOME%₩lib₩classes.zip PATH %PATH%;%JAVA_HOME%₩bin

Windows 95 환경 맞추기윈도우즈 95에서는 AUTOEXEC.BAT 파일에 다음 사항들을 기재한다.

set JAVA_HOME=C:₩JDK1.1.5 set SWING_HOME=C:₩swing-1.0 set CLASSPATH=.;%JAVA_HOME%₩lib₩classes.zip set PATH=%PATH%;%JAVA_HOME%₩bin

예제 프로그램

http://www.javastudy.co.kr/docs/jm/jm26.html (1 / 3)2006-09-01 오전 2:06:06

최종명님의 자바강좌 26 - 스윙 1편

예제: HiSwing.java 파일 1 import java.awt.*; 2 import com.sun.java.swing.*; 3 import com.sun.java.swing.border.*; 4 5 public class HiSwing extends JFrame { 6 JButton textB, iconB; 7 JLabel label; 8 9 public HiSwing() { 10 super("Hi~ Swing~"); 11 getContentPane().setLayout(new FlowLayout()); 12 13 Icon logo = new ImageIcon("logo.gif"); 14 label=new JLabel("Soongsil Univ. Logo", logo, JLabel.RIGHT); 15 getContentPane().add(label); 16 label.setBorder(new EtchedBorder()); 17 label.setToolTipText("Label with icon"); 18 19 getContentPane().add(textB = new JButton("Swing Button~ ^_*" )); 20 textB.setBorder(new BevelBorder(BevelBorder.LOWERED)); 21 textB.setToolTipText("text button"); 22 23 Icon project = new ImageIcon("pproject.gif"); 24 getContentPane().add(iconB = new JButton("", project)); 25 iconB.setBorder(new BevelBorder(BevelBorder.RAISED)); 26 iconB.setToolTipText("PIE chart"); 27 } 28 29 public static void main(String args[]) { 30 HiSwing hi = new HiSwing(); 31 hi.setSize(300, 200); 32 hi.setVisible(true); 33 } 34 }

결과% java HiSwing

설명 2 import com.sun.java.swing.*; 3 import com.sun.java.swing.border.*;JFC의 스윙을 따로 설치한 경우에는 스윙의 패키지는 com.sun.으로 시작한다. 그러나 JDK 1.2에포함된 스윙을 사용하는 경우에는 com.sun.부분은 없어진다. 현재 스윙은 개발단계이기 때문에앞으로 당분간은 JFC버전을 사용하는 것이 좋겠다.

5 public class HiSwing extends JFrame { 6 JButton textB, iconB;스윙에는 모든 자바 AWT에 해당되는 스윙 컴포넌트를 가지고 있으며, 항상 이름은 J자로 시작한다.

13 Icon logo = new ImageIcon("logo.gif");모든 스윙 컴포넌트에는 Icon을 설정할 수 있다. 따라서, 라벨/버튼 등에 아이콘을 설정할 수 있는

http://www.javastudy.co.kr/docs/jm/jm26.html (2 / 3)2006-09-01 오전 2:06:06

최종명님의 자바강좌 26 - 스윙 1편

것이다.

16 label.setBorder(new EtchedBorder());컴포넌트의 보더(border) 부분을 조금 장식해주기 위해서 setBorder() 메소드를 사용했다.보더에 관련된 클래스들은 com.sun.java.swing.border 패키지에 들어있다.

17 label.setToolTipText("Label with icon");마우스 커서를 컴포넌트위에 오랫동안 위치시켜 놓는 경우에 도움말 기능이 나타나도록하는 것이ToolTip 기능이다.

스윙 애플릿

예제: HiSwingApplet.java 1 import java.awt.*; 2 import com.sun.java.swing.*; 3 import com.sun.java.swing.border.*; 4 5 public class HiSwingApplet extends JApplet { 6 JButton textB, iconB; 7 JLabel label; 8 9 public void init() { 10 getContentPane().setLayout(new FlowLayout()); 11 12 ImageIcon logo = new ImageIcon(getImage(getDocumentBase(), "logo.gif")); 13 label=new JLabel("Soongsil Univ. Logo", logo, JLabel.RIGHT); 14 getContentPane().add(label); 15 label.setBorder(new EtchedBorder()); 16 label.setToolTipText("Label with icon"); 17 18 getContentPane().add(textB = new JButton("Swing Button~ ^_*" )); 19 textB.setBorder(new BevelBorder(BevelBorder.LOWERED)); 20 textB.setToolTipText("text button"); 21 22 ImageIcon project = new ImageIcon(getImage(getDocumentBase(), "pproject.gif")); 23 getContentPane().add(iconB = new JButton("", project)); 24 iconB.setBorder(new BevelBorder(BevelBorder.RAISED)); 25 iconB.setToolTipText("PIE chart"); 26 } 27 }

설명 5 public class HiSwingApplet extends JApplet {스윙 애플릿은 JApplet 클래스로부터 상속 받는다.

12 ImageIcon logo = new ImageIcon(getImage(getDocumentBase(), "logo.gif"));애플릿인 경우에는 getImage()메소드를 이용해서 ImageIcon 클래스를 생성해서 아이콘으로 사용한다.

-계 속...

http://www.javastudy.co.kr/docs/jm/jm26.html (3 / 3)2006-09-01 오전 2:06:07

최종명님의 자바강좌 27 - 스윙 2편

<%@ Language=VBScript %>

자바 스윙(2)

이글은 숭실대학교 최종명님의 강좌에서 발최한 내용입니다. 최종명

!!! 편집자주 : 아래 소스코드중에 import 하는 부분에서 com.sun.을 JDK1.2이상에서는 java.swingx.로 입력하셔야 결과가 제대로 나옵니다.

스윙 컴포넌트 주위에 다양한 형태의 보더를 만들어 줄 수 있다. 스윙에서 보더는com.sun.java.swing.border 패키지에 들어있다. JComponent 클래스에는 보더를 설정할 수 있는setBorder() 메소드를 정의하고 있기 때문에 모든 스윙 컴포넌트들은 보더를 사용할 수 있다.현재 스윙에는 다음과 같은 보더 클래스들을 정의하고 있다. BevelBorder - 3D 형태의 양각/음각의 보더 CompoundBorder - 2개의 보더가 네스팅(nesting)되서 하나의 보더를 형성한다. EmptyBorder - 보더 자리는 차지하지만 보이지 않는 투명한 보더 EtchedBorder - 홈 형태의 보더 LineBorder - 선 모양의 보더 MatteBorder - 색이나 아이콘을 사용하는 보더 SoftBevelBorder - 모서리가 둥근 형태의 BevelBorder TitledBorder - 텍스트가 있는 보더

이제 간단히 보더에 대해 알아보았다. 다음의 BorderSwing.java 프로그램을 보고, 보더의 사용법을 알아보자.

예제: BorderSwing.java 1 import java.awt.*; 2 import com.sun.java.swing.*; 3 import com.sun.java.swing.border.*; 4 5 public class BorderSwing extends JFrame { 6 JLabel noborder, raised, etched, title1; 7 JLabel title2, lowered, line, matte; 8 9 public BorderSwing() { 10 super("Good Swing Borders"); 11 getContentPane().setLayout(new GridLayout(0, 2, 10, 10)); 12 noborder = new JLabel("No Border"); 13 raised = new JLabel("Raised Border"); 14 raised.setBorder(new BevelBorder(BevelBorder.RAISED)); 15 lowered = new JLabel("Lowered Border"); 16 lowered.setBorder(new SoftBevelBorder(SoftBevelBorder.LOWERED)); 17 line = new JLabel("Line Border"); 18 line.setBorder(new LineBorder(Color.blue)); 19 etched = new JLabel("Etched Border"); 20 etched.setBorder(new EtchedBorder()); 21 title1 = new JLabel("Title Border"); 22 title1.setBorder(new TitledBorder("Hello")); 23 title2 = new JLabel("Title Border");

http://www.javastudy.co.kr/docs/jm/jm27.html (1 / 2)2006-09-01 오전 2:06:30

최종명님의 자바강좌 27 - 스윙 2편

24 title2.setBorder(new TitledBorder(new TitledBorder("Hello"), "World", TitledBorder.RIGHT, TitledBorder.BOTTOM)); 25 matte = new JLabel("Matte Border"); 26 matte.setBorder(new MatteBorder(5, 10, 5, 10, Color.green)); 27 28 getContentPane().add(noborder); 29 getContentPane().add(line); 30 getContentPane().add(raised); 31 getContentPane().add(lowered); 32 getContentPane().add(etched); 33 getContentPane().add(title1); 34 getContentPane().add(title2); 35 getContentPane().add(matte); 36 } 37 38 public static void main(String args[]) { 39 BorderSwing border = new BorderSwing(); 40 border.setSize(450, 400); 41 border.setVisible(true); 42 } 43 }

http://www.javastudy.co.kr/docs/jm/jm27.html (2 / 2)2006-09-01 오전 2:06:30

http://www.javastudy.co.kr/docs/jm/jsp1.html

JSWDK 사용법

이글은 숭실대학교 최종명님의 강좌에서 발최한 내용입니다. 최종명

JSWDK는 JavaServer Web Development Kit의 약자로서 자바 서블릿과 JSP를 이용한 홈페이지 제작에 사용된다. JSWDK는 다음 사이트에서 다운로드 받을 수 있다. http://developer.java.sun.com/developer/earlyAccess/jsp/

JSWDK를 설치한 다음에 서버를 실행시키기 위해서는 <jswdk-home>/startserver 명령어를 실행시킨다. 기본적으로 이 서버는 8080 포트를 사용한다. 따라서 웹브라우저로 http://host:8080/ 하면 웹서버로 사용할 수 있다. HTML 문서는 <jswdk-home>/webpages 디렉토리에서 작성할 수 있다. 서버의 구성을 변경하기 위해서는 <jswdk-home>/default.cfg 파일을 변경하면 가능하다. http://host:8080/를 처음 방문하면 기본적인 JSP와 서블릿 예제들을 실행볼 수 있고, 이것들의 소스를 볼 수 있다. 예제 프로그램들은 <jswdk-home>/examples 디렉토리에 저장되어 있다.

<jswdk-home>/examples 디렉토리를 방문하면 jsp 디렉토리와 WEB-INF 디렉토리가 있다. jsp 디렉토리에는 다른 많은 디렉토리들이 있는 데 이것은 예제 프로그램들을 위한 디렉토리들이다. 각 디렉토리에는 html 파일과 jsp 파일들이 존재한다. 예제에 소개된 jsp들은 대부분 자바 빈을 사용하고 있는데, 이 자바 빈들은 WEB-INF 디렉토리에 저장되어 있다. WEB-INF 디렉토리에 가면 다시 jsp 디렉토리와 servlets 디렉토리가 존재한다. jsp 디렉토리에 가면 beans 디렉토리가 있고, 이 디렉토리 아래에 자바 빈 소스 프로그램들이 존재하게 된다.

간단한 HelloBean.java 프로그램을 작성해보자. HelloBeans.java 프로그램은 컴파일해서 <jswdk-home>/examples/WEB-INF/jsp/beans 디렉토리에 가져다 놓는다.

예제: HelloBean.java 1 package hello; 2 3 public class HelloBean { 4 private String name = "World 입니다."; 5 6 public void setName(String name) { 7 this.name = name;

http://www.javastudy.co.kr/docs/jm/jsp1.html (1 / 2)2006-09-01 오전 2:06:41

http://www.javastudy.co.kr/docs/jm/jsp1.html

8 } 9 10 public String getName() { 11 return name; 12 } 13 }다음은 JSP 페이지를 작성해보자. helloBean.jsp 파일을 작성해서 <jswdk-home>/webpages 에 저장한다. 예제: helloBean.jsp 1 <%@ page import="hello.HelloBean" %> 2 <jsp:useBean id="hello" class="hello.HelloBean" scope="page" /> 3 4 <html> 5 <head><title>HelloBean Test</title></head> 6 <body> 7 hello... 8 <%= hello.getName() %> 9 <hr> 10 useBaen을 이용하는 JSP 테스트입니다. 11 </body> 12 </html>작성된 JSP는 웹브라우저를 이용해서 방문한다. http://host:8080/helloBean.jsp

http://www.javastudy.co.kr/docs/jm/jsp1.html (2 / 2)2006-09-01 오전 2:06:41

최종명님의 자바 강좌 - 자카르타 프로젝트

자카르타 프로젝트

자카르타는 아파치의 JServ 프로젝트 멤버들과 Sun및 IBM의 엔지니어들과 함께 개발되고 있는 자바 서블릿과 JSP을 위한 엔진이다. 1999년 11월 15일 현재 자카르타 프로젝트는 베타 테스트 중에 있으며, 올해 말에 정식으로 발표될 예정이다. 현재 자카르타는 Servlet 2.2와 JSP 1.1을 지원하고 있으며, 아파치 웹서버 혹은 다른 웹서버와 같이 사용될 수 있을 것이다. 자카르타에 관한 자세한 사항은 http://jakarta.apache.org/ 사이트에서 얻을 수 있다.

자카르타를 설치하기 위해서는 http://jakarta.apache.org/ 사이트에서 프로그램 소스를 받아온다. 압축 파일을 풀고, build를 한다. build를 하기 위해서는 build.sh (유닉스용)이나 build.bat (윈도우용)를 실행시킨다.

build를 하면 build라는 디렉토리가 생성된다. build 디렉토리의 tomcat 서브 디렉토리로 이동해서 startup.sh (유닉스)나 startup.bat(윈도우용)를 실행시킨다. startup을 실행시키면 8080 포트의 웹서버가 실행된다. 웹브라우자를 이용해서 8080 포트를 방문한다.

tomcat의 webpages 디렉토리에 다음과 같은 hello_ko.jsp 파일을 넣고, 테스트해본다.

예제: hello_ko.jsp 1 <HTML> 2 <BODY> 3 <% 4 String msg = new String("Hello... 안녕하세요 <br>"); 5 out.println(msg); 6 %> 7 JSP 입니다 !!! 8 </BODY> 9 </HTML>이글은 숭실대학교 최종명님이 작성하신 글입니다.

http://www.javastudy.co.kr/docs/jm/jm28.html2006-09-01 오전 2:06:47

최종명님의 자바강좌 - JPEG 프로그래밍 예제

<%@ Language=VBScript %>

jpeg ?

- 최종명

예제: JPEGTest.java 1 import java.io.*; 2 import java.awt.*; 3 import java.awt.image.*; 4 import com.sun.image.codec.jpeg.*; 5 6 public class JPEGTest { 7 8 public static void main(String args[]) { 9 System.err.println("Preparing BufferedImage"); 10 BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); 11 Graphics2D g = img.createGraphics(); 12 System.err.println("Drawing"); 13 g.setColor(Color.white); 14 g.fillRect(0, 0, 100, 100); 15 g.setColor(Color.gray); 16 for (int i = 0; i < 50; i += 2) { 17 g.drawLine(i, i, i, 100 - i); 18 g.drawLine(i, 100 - i, 100 - i, 100 - i); 19 g.drawLine(100 - i, 100 - i, 100 - i, i); 20 g.drawLine(100 - i, i, i, i); 21 } 22 g.setFont(new Font("Serif", Font.PLAIN, 30)); 23 g.setColor(Color.red); 24 g.drawString("JPEG", 15, 35); 25 g.setFont(new Font("Serif", Font.PLAIN, 20)); 26 g.setColor(Color.black); 27 g.drawString("Test", 12, 62); 28 g.setColor(Color.green); 29 g.drawString("~~~", 10, 60); 30 g.setFont(new Font("SansSerif", Font.PLAIN, 18)); 31 g.setColor(Color.blue); 32 g.drawString("!!!", 5, 85); 33 34 System.err.println("Writing to file"); 35 try { 36 FileOutputStream out = new FileOutputStream("out.jpg"); 37 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 38 encoder.encode(img); 39 out.close(); 40 } 41 catch (Exception e) {

http://www.javastudy.co.kr/docs/jm/jpeg1.html (1 / 2)2006-09-01 오전 2:06:53

최종명님의 자바강좌 - JPEG 프로그래밍 예제

42 e.printStackTrace(); 43 } 44 45 System.err.println("Finished"); 46 } 47 }

% java JPEGTest....

% xv out.jpg

http://www.javastudy.co.kr/docs/jm/jpeg1.html (2 / 2)2006-09-01 오전 2:06:53

최종명님의 자바강좌 - 더블 버퍼링

<%@ Language=VBScript %>

더블 버퍼링

- 최종명

더블 버퍼링은 이미지를 화면에 바로 그리는 것이 아니라, 메모리(버퍼)에 먼저 그리고 화면에 나중에 그리는 방법이다. 더블 버퍼링은 화면의 깜빡임을 줄이고, 자연스러운 애니메이션을 위해서 많이 사용된다. 더블 버퍼링을 하기 위해서는 다음과 같은 절차를 거쳐야 한다.

1. Image 객체를 만들어서 이곳에 그림을 그린다. 2. update() 함수는 오버라이드해서 paint() 함수를 호출하도록한다. 3. paint() 함수에서는 1번에서 생성한 이미지를 그린다.

예: Clock.javaimport java.awt.*; import java.awt.image.*; import java.applet.*; import java.util.*;

public class Clock extends Applet implements Runnable { Date day; Thread runner; Image img; Graphics gc; Font font; int w, h, d; boolean stop = false;

public void start() { day = new Date(); font = new Font("TimesRoman", Font.BOLD, 24); FontMetrics metrics = getFontMetrics(font); d = metrics.getDescent(); w = metrics.stringWidth(day.toString())+10; h = metrics.getHeight()+10;

img = createImage(w , h); gc = img.getGraphics(); gc.setFont(font); runner = new Thread(this); runner.start();

http://www.javastudy.co.kr/docs/jm/dbuffer.html (1 / 2)2006-09-01 오전 2:07:05

최종명님의 자바강좌 - 더블 버퍼링

}

public void stop() { if(runner != null) { stop = true; runner = null; } }

public void run() { while(!stop) { day = new Date(); gc.setColor(Color.lightGray); gc.fillRect(0, 0, w + 10, h+10); gc.setColor(Color.black); gc.drawString(day.toString(),5, h -d); repaint(); try { Thread.sleep(1000); } catch(Exception ex) { System.out.println("Exception:" + ex.toString()); } } }

public void update(Graphics g) { paint(g); }

public void paint(Graphics g) { g.drawImage(img, 10, 50, this); } }

http://www.javastudy.co.kr/docs/jm/dbuffer.html (2 / 2)2006-09-01 오전 2:07:05

최종명님의 자바강좌 - 이미지 크기 변환

<%@ Language=VBScript %>

이미지 스케일

- 최종명

자바 2D를 이용하면 이미지를 원하는 형태로 변경할 수 있다. 자바 2D는 JDK 1.2에서 부터 지원되는 기능으로 각종 2D 그래픽 처리에 사용될 수 있는 클래스들과 이미지들로 구성되어 있다. 스윙이나 AWT와는 다르게 자바 2D는 하나의 패키지에 속한 것이 아니라 여러개의 패키지에 분산되어 있다. 자바 2D는 보다 세밀한 그래픽 기능을 지원하므로서 자바를 이용한 CAD 시스템 개발, 새로운 컴포넌트의 개발등에 사용될 수 있다.

자바 2D에서는 Graphics2D 클래스를 이용해서 그림을 그릴 수 있으며, Graphics2D 클래스는 Graphics 클래스를 타입 캐스팅해서 얻을 수 있다. 자바 2D에 대한 자세한 사항은 자바 2D 홈페이지를 참조하기 바란다.

예제: ScaleImage.java 1 import java.awt.*; 2 import java.awt.event.*; 3 4 public class ScaleImage extends Canvas { 5 Image img; 6 double scale = 1.0; 7 8 public ScaleImage() { 9 img = getToolkit().getImage("bird.gif"); 10 setBackground(Color.lightGray); 11 } 12 13 public void setScale(double d) { 14 scale = d; 15 } 16 17 public void paint(Graphics g) { 18 Graphics2D g2 = (Graphics2D) g; 19 g2.scale(scale, scale); 20 g2.drawImage(img, (int)(10/scale), (int)(10/scale), this); 21 } 22 23 public static void main(String [] args) { 24 Frame f = new Frame(); 25 final ScaleImage s = new ScaleImage();

http://www.javastudy.co.kr/docs/jm/scale1.html (1 / 2)2006-09-01 오전 2:07:13

최종명님의 자바강좌 - 이미지 크기 변환

26 f.add("Center", s); 27 Choice c = new Choice(); 28 c.add("50%"); 29 c.add("100%"); 30 c.add("150%"); 31 c.add("200%"); 32 c.add("250%"); 33 c.add("300%"); 34 c.select(1); 35 c.addItemListener(new ItemListener() { 36 public void itemStateChanged(ItemEvent e) { 37 Choice ch = (Choice) e.getSource(); 38 s.setScale(ch.getSelectedIndex()*0.5 + 0.5); 39 s.repaint(); 40 } 41 }); 42 f.add("South", c); 43 f.setSize(300, 400); 44 f.setVisible(true); 45 } 46 }

http://www.javastudy.co.kr/docs/jm/scale1.html (2 / 2)2006-09-01 오전 2:07:13

http://www.javastudy.co.kr/docs/jm/jm29.html

<%@ Language=VBScript %>

텍스트 필드 글자를 오른쪽으로

- 최종명 텍스트 필드에서 글자를 오른쪽에 취우치게 출력되도록 하는 함수가 자바에서는 지원되고 있지 않다(?). 따라서, 이러한 문제를 해결하기 위해서 두가지 편법을 이용할 수 있는데 하나는 텍스트 필드에서 문자열 앞에 적당한 길이의 공백 문자를 추가하는 방법이고, 두번째 방법은 컨테이너를 텍스트 필드 모양으로 만들고 라벨을 이 컨테이너에 붙이는 방법이다. 여기에서는 첫번째 방법을 간단하게 구현해보았다. 예제: RightTextField.java 1 import java.awt.*; 2 import java.awt.event.*; 3 4 public class RightTextField extends TextField { 5 private boolean isAligned; 6 private String msg; 7 8 public RightTextField() { 9 super(); 10 setEditable(false); 11 } 12 13 public RightTextField(int c) { 14 super(c); 15 setEditable(false); 16 } 17 18 public void paint(Graphics g) { 19 alignRight(); 20 if(isAligned) 21 super.paint(g); 22 } 23 24 protected void alignRight() { 25 if(isAligned) 26 return; 27 int w = getSize().width; 28 FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(getFont()); 29 while(true) { 30 if(w < fm.stringWidth(msg)+20) 31 break;

http://www.javastudy.co.kr/docs/jm/jm29.html (1 / 2)2006-09-01 오전 2:07:20

http://www.javastudy.co.kr/docs/jm/jm29.html

32 msg = " " + msg; 33 } 34 super.setText(msg); 35 isAligned = true; 36 } 37 38 public void setText(String m) { 39 isAligned = false; 40 msg = m; 41 repaint(); 42 } 43 } 44 45 class RightTextFieldTest { 46 static RightTextField t; 47 static TextField tt; 48 49 public static void main(String args[]) { 50 Frame f = new Frame(); 51 f.setLayout(new FlowLayout()); 52 t = new RightTextField(20); 53 tt = new TextField(20); 54 tt.addActionListener(new ActionListener() { 55 public void actionPerformed(ActionEvent e) { 56 t.setText(tt.getText()); 57 tt.setText(""); 58 } 59 }); 60 f.add(t); 61 f.add(tt); 62 t.setText("$100,000"); 63 f.setSize(400, 300); 64 f.setVisible(true); 65 } 66 }

http://www.javastudy.co.kr/docs/jm/jm29.html (2 / 2)2006-09-01 오전 2:07:20

http://www.javastudy.co.kr/docs/jm/jm30.html

메뉴 숏컷

- 최종명 AWT의 메뉴에서 숏컷은 MenuShortcut 클래스를 이용한다. 스윙에서는 자바 튜토리얼 부분

을 참조하기 바란다. 예제: Memo.java 1 import java.awt.*; 2 import java.awt.event.*; 3 4 public class Memo extends Frame implements ActionListener { 5 MenuBar mb; 6 TextArea text; 7 MenuItem fileNew, fileOpen, fileSave, fileExit; 8 MenuItem editCopy, editCut, editPaste; 9 10 public Memo() { 11 super("Memo"); 12 mb = new MenuBar(); 13 setMenuBar(mb); 14 Menu file = new Menu("File"); 15 fileNew = new MenuItem("New"); 16 fileNew.addActionListener(this); 17 MenuShortcut N = new MenuShortcut(KeyEvent.VK_N, false); 18 fileNew.setShortcut(N); 19 fileOpen = new MenuItem("Open"); 20 fileOpen.addActionListener(this); 21 MenuShortcut O = new MenuShortcut(KeyEvent.VK_O, false); 22 fileOpen.setShortcut(O); 23 fileSave = new MenuItem("Save"); 24 fileSave.addActionListener(this); 25 MenuShortcut S = new MenuShortcut(KeyEvent.VK_S, false); 26 fileSave.setShortcut(S); 27 fileExit = new MenuItem("Exit"); 28 fileExit.addActionListener(this); 29 MenuShortcut x = new MenuShortcut(KeyEvent.VK_X, true); 30 fileExit.setShortcut(x); 31 file.add(fileNew); 32 file.add(fileOpen); 33 file.add(fileSave); 34 file.addSeparator(); 35 file.add(fileExit);

http://www.javastudy.co.kr/docs/jm/jm30.html (1 / 3)2006-09-01 오전 2:07:28

http://www.javastudy.co.kr/docs/jm/jm30.html

36 Menu edit = new Menu("Edit"); 37 editCopy = new MenuItem("Copy"); 38 editCopy.addActionListener(this); 39 MenuShortcut C = new MenuShortcut(KeyEvent.VK_C, false); 40 editCopy.setShortcut(C); 41 editCut = new MenuItem("Cut"); 42 editCut.addActionListener(this); 43 MenuShortcut X = new MenuShortcut(KeyEvent.VK_X, false); 44 editCut.setShortcut(X); 45 editPaste = new MenuItem("Paste"); 46 editPaste.addActionListener(this); 47 MenuShortcut V = new MenuShortcut(KeyEvent.VK_V, false); 48 editPaste.setShortcut(V); 49 edit.add(editCopy); 50 edit.add(editCut); 51 edit.add(editPaste); 52 53 Menu help = new Menu("Help"); 54 mb.add(file); 55 mb.add(edit); 56 mb.add(help); 57 mb.setHelpMenu(help); 58 59 text = new TextArea(); 60 add("Center", text); 61 62 setSize(250,250); 63 setVisible(true); 64 } 65 66 public void actionPerformed(ActionEvent e) { 67 Object o = e.getSource(); 68 if(o == fileNew) { 69 System.out.println("New"); 70 } else if(o == fileOpen) { 71 System.out.println("Open"); 72 } else if(o == fileSave) { 73 System.out.println("Save"); 74 } else if(o == fileExit) { 75 System.exit(0); 76 } else if(o == editCopy) { 77 System.out.println("Copy"); 78 } else if(o == editCut) {

http://www.javastudy.co.kr/docs/jm/jm30.html (2 / 3)2006-09-01 오전 2:07:28

http://www.javastudy.co.kr/docs/jm/jm30.html

79 System.out.println("Cut"); 80 } else if(o == editPaste){ 81 System.out.println("Paste"); 82 } 83 } 84 85 public static void main(String args[]) { 86 new Memo(); 87 } 88 }

http://www.javastudy.co.kr/docs/jm/jm30.html (3 / 3)2006-09-01 오전 2:07:28