자바강좌 - itfind - it 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측...

513
-1- 자바 강좌 컴퓨터 소프트웨어기술연구소 ETRI 재 한국소프트웨어진흥원 ( )

Upload: vudat

Post on 05-Sep-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 1 -

자바 강좌

컴퓨터 소프트웨어기술연구소ETRI ㆍ

재 한국소프트웨어진흥원( )

Page 2: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 2 -

차 례< >

제 장 자바란1 . ?

자바 란1.1 ?

자바 관련 서적1.2

자바 관련 사이트1.3

자바 언어 맛보기1.4

자바 애플릿 만들어보기1.5

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

제 장 자바 언어 소개2 .

자바 식별자와 키워드2.1

자료 타입2.2

기본 자료 타입2.2.1

레퍼런스 타입2.2.2

문자열과 배열2.2.3

제어 구조2.4

제 장 객체지향 프로그래밍3 .

객체지향 개념3.1

실세계의 객체와 컴퓨터상의 클래스 객체3.2 /

생성자3.3

객체간의 의사소통 메시지 패싱3.4 :

가시성3.5

오버로딩3.6

추상클래스3.7

상속3.8

인터페이스3.9 (Interface)

클래스3.10 Inner

내재된 톱레벨 클래스 인터페이스3.10.1 / (Nested top-level class / Interfaces)

멤버 클래스3.10.2 (Member classes)

지역 클래스3.10.3 (local classes)

무명 클래스3.10.4 (Anonymous classes)

Page 3: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 3 -

자바에서 중요한 클래스들3.11

클래스3.11.1 Object

데이터 타입 클래스3.11.2

클래스3.11.3 Math

클래스3.11.4 String

클래스3.11.5 Vector

클래스3.11.6 StringTokenizer

제 장 프로그래밍4 . AWT

프로그래밍4.1 AWT

의 각 컴포넌트 알아보기4.1 AWT

컴포넌트 붙이기4.2 AWT

레이아웃 매니저4.2.1

메뉴 만들기4.2

다이얼로그4.3

제 장 자바 애플릿 프로그래밍5 .

간단한 자바 애플릿5.1

애플릿 소개5.1.1

애플릿 메소드들5.1.2

이미지 그리기5.2

오디오 파일5.3

자바 애니메이션5.4

중 코드5.5 2

자바와 자바스크립트5.7

자바스크립트에서 자바 애플릿 호출5.7.1

자바 애플릿에서 자바스크립트 호출5.7.2

색 폰트 커서5.8 / /

색5.8.1

폰트5.8.2

마우스 커서5.8.3

애플릿을 이용한 홈페이지 이동5.9

제 장 이벤트 프로그래밍6 .

모델6.1 Delegation (JDK 1.1)

제 장 예외처리7 .

언어에서 예외처리7.1 C

Page 4: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 4 -

자바에서 예외처리7.2

예외 클래스 만들기7.2.1

7.2.2 throws

7.2.3 throw

7.2.4 try-catch-finally

에서 제공되는 예외7.3 JDK

제 장 자바 쓰레드 프로그래밍8 .

쓰레드 기초8.1

제 장 네이티브 메소드 파일 입출력9 . /

네이티브 메소드9.1

네이티브 메소드 소개9.1.1

자바와 네이티브 메소드의 데이터 타입 매칭9.1.2

네이티브 메소드에서 자바 함수 및 필드 접근9.1.3

기타9.1.4

응용프로그램9.1.5

사용법9.1.6 JNI 1.0

파일 입출력9.2

클래스9.2.1 InputStream

클래스9.2.2 FileOutputStream

클래스9.2.3 DataInputStream/DataOutputStream

클래스9.2.4 InputStreamReader

클래스9.2.5 BufferedReader/BufferedWriter

클래스9.2.6 RandomAccessFile

제 장 네트워크 프로그래밍10 .

이해10.1 TCP/IP

소켓10.2

소켓 소개10.2.1

화이트보드 작성10.2.2

간단한 소켓 프로그램들10.3

프로그램10.3.1 ping

뉴스 읽기10.3.2 : Network News Transfer Protocol(NNTP)

10.3.3 SMTP(Simple Mail Transfer Protocol)

10.3.4 Post Office Protocol - Version 3 (POP3)

10.4 DatagramSocket

자바를 이용한 응용 프로그램10.5 CGI

를 이용한 정보 검색10.6 CGI

자바를 이용한 클라이언트10.7 CGI

Page 5: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 5 -

와 이해10.7.1 HTTP CGI

서버측 응용프로그램10.7.2 CGI

클라이언트 프로그램10.7.3 CGI

제 장 프로그램11 . JDBC

기본11.1 SQL

문장들11.1.1 DDL(Data Definition Language)

문장들11.1.2 DML(Data Manipulation Language)

기초11.2 JDBC

란11.2.1 JDBC ?

간단한 프로그램 작성11.2.2 JDBC

프로그래밍11.3 JDBC

와11.3.1 JDBC DBMS

와 모델11.3.2 2-tier 3-tier

커넥션 열기11.3.3

문장 전송하기11.3.5 SQL

결과 검색하기11.3.6

트랜잭션11.3.7

자바 자료형과 자료형11.3.8 SQL

응용 프로그램11.4 JDBC

클래스 애플릿을 이용한 동문회 주소록11.4.1 Alumna :

11.4.2 JDBC + CGI = 3-tier ?

제 장12 . Java RMI

기초12.1 RMI

자바 예제12.2 RMI

콜백12.4 RMI (callback)

12.5 JDBC + RMI = 3 tier ?

코바 개요13.1 (CORBA)

코바란13.1.1

코바 예제 프로그램13.1.2 (CORBA)

코바 애플릿 예제 프로그램13.1.3 (CORBA)

비지브로커13.1.4 (Visibroker)

문법과 자바 언어로의 매핑13.2 IDL

응용 프로그램13.3

은행 프로그램13.3.1

콜백13.3.2 (callback)

13.3.3 CORBA + JDBC = 3-tier ?

코바 응용 프로그램13.3.4 : WebPostIt

Page 6: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 6 -

제 장 자바란1 . ?

자바 란1.1 ?

간단하고(simple)

객체지향적이고(object-oriented)

분산처리되고(distributed)

인터프리트 되고(interpreted)

강건하고(robust)

컴퓨터 하드웨어에 영향을 받지 않고(architecture-neutral)

보안성이 있으며(secure)

포팅하기 쉽고(portable)

성능이 우수하고(hight-performance)

멀티쓰레드를 사용하고(multithreaded)

동적인(dynamic)

언어이다.

썬에서는 자바언어를 이용해 프로그램을 개발할 수 있는 개발 환경 을 무료로 계속(JDK)⋆지원하고 있으며 이것은 자바의 개념을 점차 확대시키는 계기가 되었다 자바는 이제 단순, .

한 언어가 아니라 개발 환경으로 확대된 것이다 썬에서는 개발 환경을 지원하는 차원을 넘.

어서 점차 자바를 이용할 수 있는 분야를 확대시켜 나가고 있다 자바를 이용해 개발한 핫.

자바 브라우저 핫자바 뷰어 등의 사용자 응용프로그램에서부터 등의 각종 지, swing, JMF

원 클래스 등의 시스템 프로그램 자바 반지 자바 카드 피코 자바 등의 하드웨어, javaOS , , ,

까지 응용 분야를 넓히고 있다 자바는 언어 개발 환경의 개념을 넘어서 이제는 하나의 컴. ,

퓨팅 환경으로 자리 잡아가고 있는 것이다.

Page 7: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 7 -

자바 관련 서적1.2

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 .

Java Network Programming

저자는 이고 출판사에서 출간되었다 네트워크 및 스트림에 대해 자세Hughes , Manning . I/O

히 설명하고 있다 자바 네트워크 프로그래머에게 권장할만한 책이다. .

Page 8: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 8 -

Java Network Programming

저자는 이고 출판사에서 출간되었다 자바 네트워크 프로그래밍 팁을 중심Elliotte O'Reilly .

으로 서술되어 있어서 네트워크 프로그래머에게 권할만한 책이다.

Java Threads

과 가 공동으로 저술한 책으로 자바 쓰레드를 이용하는 방법들이 기술되어 있Scott Henry

다 출판사에서 출간되었다. O'Reilly .

Concurrent Programming in Java

가 집필한 이 책은 자바의 쓰레드를 이용해서 병행응용프로그램을 작성하는 사람Doug Lea

에게 권장할 만하다 책은 출판사에서 출간되었고 웹에서도 무료로 제공. Addison Wesley ,

하고 있다.

Modern compiler implementation in Java

가 쓴 이 책은 출판사에서 출판되었고 자바를 이용해서 컴파일러를 작Andrew Cambridge ,

성하는 사람들에게 권할 만 하다.

Page 9: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 9 -

자바 관련 사이트1.3

java. sun. com

자바를 개발한 썬 사의 공식 자바 사이트이다 자바와 관련된 각종 문서와 각종 도구(SUN) .

및 를 얻을 수 있는 사이트이다 디렉토리에는 자바 프로그JDK . http://java.sun.com/tutorial/

래밍을 설명해 주는 온라인 책이 있다.

www.gamelan.com

세계의 수많은 자바 프로그램을 모아놓은 곳이다 다양한 자바 프로그램들을 분류해서 사용.

자에게 제공한다 많은 자바 프로그램들이 소스를 공개해 놓고 있기 때문에 프로그램을 작.

성하기 전에 이곳에 있는 프로그램들을 참조하는 것이 바람직하다.

www.javaworld.com

자바 월드는 온라인상에서 발행되는 자바관련 잡지이다 년부터 발행되는 이 잡지는 각종. 96

자바 프로그래밍 기법을 설명해준다 각종 프로그래밍 기법들을 소개하기 때문에 전문 프로.

그래머는 반드시 보아두어야할 사이트이다.

Page 10: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 10 -

자바 언어 맛보기1.4

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

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

% javac HelloWorld.java

를 이용하여 컴파일하면 라는 파일이 생성된다3. javac HelloWorld.class .

생성된 파일은 라는 자바 인터프리터에 의해 실행된다HelloWorld.class java .

결과

% java HelloWorld

Hello World

설명

자바 프로그램의 확장자는 이고 실행 파일의 확장자다.java .

1 class HelloWorld {

자바는 객체지향 언어이다 따라서 자바에서는 모든 래스 되어 있다 번 문장은. . 1

라는 클래스를 정의하는 것이다 를 이용하면 각 클래스는 확장자를HelloWorld . .javac .class

갖는 파일로 저장된다.

주석 부분3 //

스타일 주석 여러 줄에 걸쳐서 사용할 수 있다/* */ : C , .

스타일 주석 한 줄을 주석으로 사용할 때 편리하다// : C++ , .

을 이용하여 도큐먼트할 때 사용된다/** */ :javadoc .

Page 11: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 11 -

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("Hel1o");

자바가 제공하는 클래스 이름System :

클래스의 멤버필드의 라로서 화면에 문자를 출력하는데System.out.print : System out print

사용된다.

라는 문자열"Hello" : Hello

9 System.out.println(msg);

이라는 뜻이다 문자열을 출력하고 라인을 바꾼다println : print line . .

타입의 변수msg : String

10 }

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

11 }

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

과 유사하다PASCAL .

Page 12: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 12 -

자바 애플릿 만들어보기1.5

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

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

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

% javac Hello.java

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

% appletviewer Hello.html

Page 13: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 13 -

설명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 .

Page 14: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 14 -

클래스의 메소드paint : Hello

그림을 그리는데 필요한 정보를 가지고 있는 자료 구조 타입Graphics :

l0 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 .

Page 15: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 15 -

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

자바는 대소문자를 구별한다1. .

도스에서는 대소문자를 구별하지 않기 때문에 자바 파일 이름도 대소문자 구별 없이 사용,

하는 경우가 많이 있는데 유감스럽게도 자바는 프로그램 내에서는 물론 파일 이름도 대소,

문자를 구별한다.

한글이름으로 된 디렉토리에서는 잘 안 된다2. .

도스에서 한글 이름의 디렉토리를 사용하는 경우에도 자바에서는 문제가 될 수 있다 이것.

은 주로 클래스 패스를 찾는 동안에 한글 이름의 디렉토리는 자바가 잘 인식하지 못하기 때

문이다.

자바 소스 파일은 로 끝나고 텍스트 형태로 저장해야한다3. .java , .

윈도우 에서 자바 소스 파일을 편집하는데 많이 사용되는 편집기는 메모장이나 워드95 MS

등이다 메모장이나 워드를 사용하는 경우에 자바 소스 파일의 이름이 로 끝나는지 확. java

인해 봐야한다 특히 워드로 작성하는 경우에는 워드 포맷이 아닌 텍스트 형태로 저장하는.

것을 잊어서는 안 된다.

자바 실행 파일 패스와 클래스 패스가 제대로 설정되어야 한다4.

파일에 다음 변수가 설정되어 있어야한다.autoexec.bat .

만약 가 디렉토리에 설치되어 있다면JDK c:₩java ,

set JAVA_HOME=c: java\

set CLASSPATH=;%JAVA_HOME% lib classes. zip\ \

PATH=%PATH%;%JAVA HOME% bin  \

이 있는 클래스를 실행시켜야 한다5. main() .

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

이 없는 클래스는 인터프리터로 실행시킬 수 없다main() java .

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

애플릿으로 작성한 클래스는 항상 이다7. public .

한 파일에 클래스는 개를 초과할 수 없다8. public 1 .

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

지를 보여준다.

Page 16: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 16 -

으로 선언된 클래스가 있는 경우에 파일 이름은 클래스 이름과 동일해야 한다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 .ꡒ ꡓ리지 않도록 조심해야한다.

Page 17: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 17 -

에서 컴포넌트를 붙이는 경우16. BorderLayout "East", "South", "West", "North",

의 대소문자 구별 및 철자에 유의해야한다"Center" .

철자가 틀리는 경우에 컴포넌트가 화면에 안보일 수 있다.

애플릿에서 나 을 읽어올 때 와17. Image AudioClip getCodeBase()

는 다르다getDocumentBase() .

는 애플릿 클래스가 있는 곳의 을 리턴하고 는getCodeBase() URL , getDocumentBase()

파일 있는 곳의 을 리턴 한다HTML URL .

자바 언어의 수많은 클래스들과 메소드를 모두 기억한다는 것은 불가능하다18. .

사용하는 에 맞는 문서를 에서 다운로드받아서 필요할 때마다 참조JDK API java.sun.com

하라.

19. Button a[] = new Button[10];

위의 문장은 버튼을 만드는 것이 아니라 버튼이 들어갈 배열을 만드는 것이다

이 문장을 통해 배열을 만들면 배열 안에는 내용이 없을 것이다 버튼을 따로 만들어서 배.

열 안에 넣어주어야 한다 배열을 생성하는 것과 배열 안에 들어갈 객체를 혼동하지 마라. .

자바 언어에서는 대소문자를 구별할 뿐만 아니라 클래스나 메소드에 이름을 붙이는20.

규칙이 있다 클래스 이름은 영어 명사형으로 붙이고 대문자로 시작한다. .

여러 단어를 사용할 때는 새로 시작하는 단어는 를 사용하지 않고 대문자로 시작한, ꡒ ꡓ다 예를 들면 처럼 클래스 이름을 붙인다 메소드 이름은 동사형으로. , Car, ChattingServer .

소문자로 시작한다 여러 단어를 사용할 때는 마찬가지고 시작하는 단어를 대문자로 한다. .

예를 들면 등은 좋은 메소드 이름의 예이다 멤버 필드의 이름은 의, getName(), setLabel() .

미에 맞게 붙이고 소문자로 시작한다.

Page 18: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 18 -

제 장 자바 언어 소개2 .

자바 식별자와 키워드2.1

자바 식별자 는 클래스 이름 메소드 이름 변수 이름 등에 사용된다 자바 식별자(identifier) , , .

는 길이에 제한이 없고 자바 문자로 시작하는 자바 문자와 자바 숫자의 연속이다 자바 문, .

자와 자바 숫자란 유니코드 문자를 의미한다 자바 식별자는 키워드나. "true", "false", "null"

과 동일한 철자인 경우에는 사용할 수 없다 자바 식별자는 등으로 시작할 수 있. ' ', '$' 

다.

다음은 올바른 식별자의 예이다.

id

userName

user_name

_userName

$userName

이름

다음은 틀린 식별자의 예이다.

user name 자바 식별자 내에 등의 문자가 올 수 없다// ' ', ' t', ' n' .\ \

3d studio  자바 식별자는 숫자로 시작할 수 없다// .

this 키워드는 자바 식별자로 사용할 수 없다// .

#arg 자바 식별자는 으로 시작할 수 없다// # .

다음은 키워드로 예약된 예약어들이다.

abstract default if private throw

boolean do implements protected throws

break double import public transient

byte else instanceof return try

case extends int short void

catch final interface static volatile

char finally long super while

class float native switch

const for new synchronized

continue goto package this

와 는 예약어로 지정됐지만 현재 자바에서는 사용되지 않는다1) const goto .

은 상수로서 예약어처럼 사용할 수 있다2) "true", "false", "null" boolean/null .

문자가 자바 문자나 숫자인가를 알아보기 위해서는 메소3) Character.isJavaLetterOrDigit()

드를 이용할 수 있다.

Page 19: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 19 -

유니코드에 관한 정보는 에서 얻을 수 있다4) http://www.unicode.org/ .

Page 20: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 20 -

자료 타입2.2

자바는 크게 기본 자료 타입 과 레퍼런스 타입 의 두 가(primitive data type) (reference type)

지 타입을 가지고 있다.

기본 자료 타입2.2.1

유형 값 디폴트값 크기 최소 값 최대 값

boolean true /false false 비트1 없음 없음

char 유니코드 문자 u0000\ 비트16 u0000\ uFFFF\

byte 부호 있는 정수 0 비트8 -128 127

short 부호 있는 정수 0 비트16 -32768 32767

int 부호 있는 정수 0 비트32 -2147483648 2147483647

long 부호 있는 정수 0 비트64 -9223372036854775808 9223372036854775807

float 플로팅 포인트 0.0 비트32 +(-)3.40282347E+38 +(-)1.40239846E-45

double 플로팅 포인트 0.0 비트64+(-)1.79769313486231570E+308

+(-)4.94065645841246544E-324

자바에서는 언어의 기본 자료 타입에 과 라는 타입을 추가했다1) C boolean byte .

각 자료타입은 클래스의 멤버필드 배열의 컴포넌트는 처음 생성될 때 초기화된다 지역2) / .

변수인 경우에는 초기화되지 않는다.

Page 21: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 21 -

타입int

타입은 비트 정수 타입으로 사이의 값을 가진다 타입에서 계산은int 32 -231 231-1 . int∼

정수 타입의 값을 리턴한다 .

설명

이 아니라 라는 것에 주의하기 바란다 원래 실수형 계산에서 는28 / 5 = 5.6 5 . 28 / 5 5.6

이지만 정수형 계산에서는 의 정수부분인 만 취한다, 5.6 5 .

타입byte, short

와 도 와 마찬가지로 정수 타입이다 차이점은 는 비트 길이이고byte short int . byte 8 , short

는 비트라는 것이 다를 뿐이다 따라서 는 사이의 값을 가질 수 있고16 . byte -27 27-1 ,∼

는 사이의 값을 가질 수 있다short -215 215-1 .∼

Page 22: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 22 -

Page 23: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 23 -

타입float, double

플로팅포인트 타입에서는 표준을 따라 표현된다 이 표준에 따르면 플로팅IEEE 754-1985 .

포인트 타입은 과 개의 을 가지고 있다 또한 무한대로 오버플로가 발생할 수-0.0 +0.0, 2 0.0 .

있고 으로 언더플로우가 발생할 수 있다 표준에는 유효하지 않은 연산 으로 나누기, 0.0 . (0.0

등 결과를 위해 을 가지고 있다) NaN(Not a Number) .

다음 테이블은 두 실수 를 이용해서 연산할 수 있는 예를 보여준다x, y .

자바에서 플로팅포인트 타입은 타입과 타입이 있다 타입은 비트인데float double . float 32

비해 타입은 비트이다 기본적으로 프로그램에서 사용되는 플로팅포인트 리터럴은double 64 .

예 모두 타입으로 간주된다 따라서 특별히 타입으로 사용해야 하는 경( , 3.14) double . float

우에는 이를 명시적으로 밝혀두어야 한다 예( , 3.14f)

설명

는 기본적으로 타입으로 간주되기 때문에 컴파일시에 위와 같은 에러가 발생한3.14 double

다 번째 줄의 문장은 로 변경해야 한다. 5 float1 = 3.14f; .

Page 24: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 24 -

타입char

타입은 비트의 부호가 없는 유니코드로 정의되어 있다 타입은char 16 . char 0 ∼ 2 16 - 1

사이의 값을 가질 수 있으며 타입으로 타입 변경이 가능하다 유니코드는, int . 0x0000 ∼

까지는 아스키 문자가 까지는 문자0x007F , 0x0080 0x00FF ISO-8859-1 , 0xAC00∼

까지는 현대 한글음절 자가 있고 기타 중국어 일본어 등 각 국의 문자0xD7A3 11172 , ,∼

들을 포함하고 있다.

설명

3 char c = 'a';

타입에 값을 할당할 때는 따움표 를 사용한다char (’) .

6 intl = c;

타입에 타입의 값을 할당할 수 있다 따라서 타입은 정수 연산이 가능하다int char . char .

11 System.out.println("(char)"+intl+"="+(char)intl);

타입을 타입으로 변경하기 위해서는 캐스트 연산자를 사용해야 한다int char .

Page 25: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 25 -

설명

한 글 형태로도 테스트해보기 바란다han =' '; gul=' '; .

Page 26: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 26 -

타입boolean

타입은 나 값만을 가질 수 있고 다른 타입 예 이 타입으로boolean true false , ( , int) boolean

변환은 불가능하다.

따라서 언어에서처럼C

.....

while( 1 ) {

.....

.....

}

형태의 프로그램은 작성할 수 없고 다음 아래와 같은 형식으로 작성해야 한다, .

.....

while( true ) {

.....

.....

}

리터럴(Literal)

프로그램의 소스에서 직접 값으로 표현된 것을 리터럴이라고 한다 기본 자료형과 문자열은.

리터럴로 직접 값을 표현할 수 있는 방법을 제공하고 있다.

예( )

a = 2; 는 형 리터럴// 2 int

x = 0xA; 는 진수로 표현된 형 리터럴// A 16 int

o = 055; 는 진수로 표현된 형 리터럴// 55 8 int

b = 5L; 는 형 리터럴// 5 long

f =2.0f; 는 형 리터럴// 2.0f float

d = 2.0; 은 형 리터럴// 2.0 double

e = 2.0E4; 형 리터럴// double

t = true; 는 형 리터럴// true boolean

c = 'd'; 는 문자형 리터럴// d

s = "Hello"; 는 문자열 리터럴// Hello

자바에서는 지원하지 않는 언어 자료 유형C

포인터 자바에서는 포인터를 지원하지 않는다: .

자바에서는 와 을 지원하지 않는다 사용자는 필요한 경우에 클struct / union : struct union .

래스를 정의해서 처럼 사용할 수 있다struct .

Page 27: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 27 -

레퍼런스 타입2.2.2

언어에서 트리의 노드 를 만들 때 함수를 이용해서 메모리의 힙 영역C (node) malloc() (heap)

에서 공간을 할당해서 사용한다 함수는 노드의 크기에 맞게 공간을 할당한 다음에. malloc

그 공간의 포인터를 리턴 한다.

자바에서도 클래스를 만들면 힙 영역에 적당한 크기의 공간이 할당되고 그곳의 레퍼런스가

리턴 된다 레퍼런스는 포인터와 같다고 생각해도 별 무리가 없을 것 같다 따라서 자바에서. .

는 포인터가 없다고 하지만 내부적으로는 포인터를 사용한다고 보면 이해하기 쉽다 이렇게, .

포인터를 사용하는 대표적인 예이다.

기본 자료 타입의 변수를 선언하면 메모리에 공간이 할당된다 그러나 레퍼런스 타입은. ,

를 이용해서 만들기 전까지는 공간이 할당되지 않는다new .

1. int a = 100;

변수 에 대한 메모리 공간이 할당되고 값으로 이 들어간다a , 100 .

2 Car mycar, yourcar;

타입의 레퍼런스를 위한 공간이 할당된다Car .

3 mycar = new Car();

힙 영역에서 클래스를 위한 공간이 할당되고 주소 값 이 라는 변수의 값으로Car , (300) mycar

들어간다.

4 yourcar = mycar;

라는 변수에 의 값 을 넣었다 따라서 와 는 동일한 장소를yourcar mycar (300) . , yourcar mycar

포인트하고 있다.

Page 28: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 28 -

문자열과 배열2.2.3

문자열과 배열은 기본 자료 유형이 아니라 클래스로 제공된다 자바에서는 문자열을 위해.

클래스를 제공하고 있으며 배열을 위해서는 사용자가 배열 클래스를 인식할 수 없String ,

도록 제공하고 있다.

문자열 클래스: String

변수 를 문자열 클래스 유형의 변수로 선언String message; // message .

.....

에 라는 값을 할당message = "hello "; // message "hello" .

와 를 결합해서 변수에 할당message += "world !";// "hello " "world !" message .

배열

자바에서 배열은 동적으로 생성할 수 있는 클래스이지만 언어에서와 유사하게 사용할 수C

있도록 만들어졌다.

다음은 배열을 선언하는 예이다.

배열을 선언 과 동일하다int k[]; //int . int[] k .

배열은 선언한 후에 연산자를 사용해서 만들어주어야 한다 위에서처럼 선언만new (allocate) .

한 경우에는 사용할 수 없다 따라서 사용하기 전에 반드시 연산자를 이용해서 배열 클. new

래스를 생성해야한다.

배열은 클래스이기 때문에 라는 멤버 필드를 가지고 있다 는 현재 배열의 크length . length

기를 나타낸다 배열의 인덱스는 까지 사용될 수 있고 언어와는 달리 배열. 0 length-1 , C∼

의 크기를 벗어나는 인덱스는 사용할 수 없다.

float[] yt = new float[7];

는 플로팅포인트를 개 가질 수 있는 배열로 선언되고 메모리에 장소가 만들어 졌다yt 7 .

int[] k = {1,2,3];

배열은 위와 같이 초기화 할 수 있다 이것은.

int k[]

k = new int[3];

k[0] = 1;

k[1] = 2;

k[2] = 3;

과 동일한 의미이다 그러나 첫 번째 방법을 이용하는 것이 배열을 초기화하는데 더 편리. ,

한다.

Page 29: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 29 -

Page 30: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 30 -

다차원 배열

자바에서는 특별하게 다차원 배열을 지원하지는 않는다 그러나 언어에서처럼 배열의 배. , C

열형태로 차원 혹은 차원 등의 다차원 배열을 사용할 수 있다2 3 .

int twoDarray[][];

String threeDarray[][][];

등의 형태로 다차원 배열을 선언할 수 있다.

다차원 배열을 선언한 뒤에 연산자를 이용해서 배열을 생성시켜준다 다차원 배열에서new .

언어와 다른 점은 언어에서는 차원 배열을 예로 들면 배열이 격자 모양으로 가로 세C C 2

로의 크기가 고정되어 있지만 자바에서는 다양한 형태의 배열을 갖을 수 있다, .

twoDarray = new int[4][5];

이것은 의 격자 모양의 배열을 만든 것이다4x5 .

twoDarray = new int[4][];

이것은 전체 배열의 크기는 로 만들고 배열의 각 컴포넌트는 필요한 경우에 동적으로 크4 ,

기를 결정해서 만들도록 한 예이다.

다음 그림은 배열과 그 내용의 관계를 보여준다stars .

Page 31: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 31 -

Page 32: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 32 -

연산자2.3

자바의 연산자는 대부분 나 의 연산자와 동일한 의미를 가진다C C++ .

연산자 우선순위

우선순위 연산자 연관성

1 캐스트++ -- + - ~ ! ( ) 오른쪽 왼쪽->

2 * / % 왼쪽 오른쪽->

3 +- 왼쪽 오른쪽->

4 << >> >>> 왼쪽 오른쪽->

5 <> <= >= instanceof 왼쪽 오른쪽->

6 == != 왼쪽 오른쪽->

7 & 왼쪽 오른쪽->

8 ^ 왼쪽 오른쪽->

9 | 왼쪽 오른쪽->

10 && 왼쪽 오른쪽->

11 || 왼쪽 오른쪽->

12 ?: 오른쪽 왼쪽->

13 = *= /= %= += -= <<= >>= >>>= &= ^= |= 오른쪽 왼쪽->

를 계산하는 경우에 정확한 답을 구하기 위해서는 적당한 계산 순서를 따-2 * 3 + 4 + 5

라야한다 이 경우에는 가 먼저 계산되고 와 의 곱셈이 이루어 질 것이다 따라서 이. -2 , -2 3 .

것은 괄호를 사용하는 경우에는 처럼 나타낼 수 있다 계산순서는 연산((((-2)*3) + 4) +5) .

자의 우선 순위에 따라 결정된다 의 단일 연산자는 우선 순위가 이기 때문에 가장. -2 - 1

먼저 수행된다 다음으로는 우선 순위 인 연산자가 수행되고 그 다음은 우선 순위 인. 2 * , 3

이항연산자가 수행된다 연산자가 수행될 때 연산자는 개가 있는데 왼쪽부터 수행하+ . + + 2

게 되는데 이것은 연관성 규칙을 따른다 연산자의 연관성은 왼쪽 오른쪽 으로 되어. + “ -> ”

있기 때문에 왼쪽에서부터 오른쪽으로 가면서 연산이 이루어진다.

Page 33: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 33 -

연산자++, --

변수의 값을 하나 증가시키거나 감소시키는 작업은 자주 발생하기 때문에 과 같i = i + 1

이 길게 쓰는 대신에 라는 짧은 형태로 사용할 수 있다 와 는 다른 결과 값을i++ . ++i i++

가질 수 있다.

i = 0;

System.out.println("++i = " + ++i);

이런 경우에 이 화면에 출력 될 것이다 즉 의 값이 하나 증가한 것이다++i = 1 . , i .

그렇지만,

i = 0;

System.out.println("i++ = " + i++);

인 경우에는 이 화면에 출력될 것이다 이것은 첫 번째 예제에서는 의 값이 증가하i++ = 0 . i

고 함수가 수행된 것이고 두 번째 예제에서는 함수가 수행되고 의 값이, println() , println() i

증가한 것이다.

Page 34: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 34 -

형 변환과 캐스트 연산자

형변환은 자동적으로 발생할 수도 있고 프로그래머가 명시적으로 형변환을 지정할 수도 있,

다 할당문 이나 함수의 아규먼트 패싱할 때 작은 타입 에서 큰 타입 으로 자동. (=) (type) (type)

적으로 변환되는 형 변환을 프로모선 이라고 한다 프로모션인 경우에는 정보를(promotion) .

잃어버리지 않기 때문에 자동적으로 이루어지지만 큰 타입에서 작은 타입으로의 형 변환은,

정보를 잃어버릴 수 있기 때문에 형 변환이 자동적으로 이루어지지 않는다 따라서 프로그.

래머는 명시적으로 캐스트 연산자를 사용해서 형 변환을 시켜주어야 한다.

결과에서 보는 바와 같이 큰 타입에서 작은 타입으로 형 변환 시에는 정보를 유실할 수 있

다 그리고 와 타입은 서로 값의 범위가 다르기 때문에 항상 캐스트 연산. , short, byte char

자를 사용해주어야 한다 타입에서 로 형 변환시 상위 가 없어져 버리는 것. short byte 8 bits

에 유의하라.

에서 상위 를 제거하면 이다-134(l0) = 1111111101111010(2) 8 bits 01111010(2) = 122(10) .

Page 35: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 35 -

쉬프트 연산자(>>, >>>, <<)

비트 연산자는 원하는 비트 만큼 오른쪽으로 쉬프트 하는 연산자다 따라서>> . 123 >> 2

라고 하면 에서 오른쪽으로 비트 쉬프트 하라는 뜻이다 연산을 하는 경우에는 부123 2 . >>

호 확장 이 발생한다 이고(sign extension) . 123(10) = 00000000000000000000000001111011(2)

오른쪽으로 비트 이동하는 경우에 맨 왼쪽 비트는 사인 값인 이 채워진다 이에 반해2 2 0 .

이다 이것을 오른쪽으로 비트 이동하는 경-l23(10) =11111111111111111111111110000101(2) . 2

우에 맨 왼쪽 비트는 사인 값인 이 채워진다2 1 .

비트 연산자는 과는 달리 사인 확장이 없고 항상 맨 왼쪽을 항상 으로 채워준다>>> >> 0 .

비트 연산자는 왼쪽으로 쉬프트하고 맨 오른쪽 비트는 항상 으로 채워준다<< , 0 .

주의

쉬프트 연산자는 정수형 에만 적용되고 연산이 수행되기 전에(byte, short, char, int, long) ,

와 타입으로 형 변환이 된 뒤에 연산이 이루어진다 주의할 점은 형은 비트이int long . int 32

Page 36: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 36 -

고 형은 비트이기 때문에 타입을 은 비트 비트 이상 쉬프트 시킨다는, long 64 int 32(long 64 )

것은 의미가 없다 따라서 타입에서 비트 은 비트 이상의 쉬프트는 로 모듈. int 32 (long 64 ) 32

라해서 나머지만 이용된다 예제에서 는 이기 때문에 쉬프트. Shift -123 <<<32 32%32 = 0

가 되지 않았다.

Page 37: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 37 -

논리 연산자(&&, )∥

는 논리 연산자 이고&& AND ,∥는 논리 연산자 이다 과OR . && ∥는 모두 숏써킷 로직

을 사용한다 예를 들어. ,

참if ( ∥??) { }

거짓if ( && ??) { }

에서 각 문의 부분은 값이 어떻든 간에 전체 결과에 영향을 미치지 않기 때문에 계산if ??

할 필요가 없다 이렇게 뒤는 계산할 필요가 없는 경우에 계산하지 않는 것을 숏써킷 로직.

이라 한다.

String msg = null;

if(mag != null) && (msg.equals("hello")) { ... }

가 일 때 숏써킷 로직을 사용하기 때문에 함수를 수행하지 않는다msg null , msg.equals() .

연산자instanceof

연산자의 왼쪽에 있는 객체가 연산자의 오른쪽에 있는 클래스의 인스턴스이면 를 아니true

면 를 리턴 하는 연산자이다false .

비트 연산자(&, , ^)︳

&, ∣ 연산자는 모두 정수 타입에 적용되면, ^ (byte, short, char, int, long) bitwise

연산이 수행된다 그리고 타입에 적용되면 논리AND, bitwise OR, bitwise XOR . , boolean

연산자 논리 연산자 논리 연산자 연산이 수행된다 과AND, OR, XOR . & ∣는 숏써킷 로직

을 사용하지 않기 때문에 논리 연산에서 숏써킷 로직을 사용하는 것을 원하지 않는 경우에

는 &&,∥대신에 &, ∣를 사용할 수 있다.

Page 38: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 38 -

제어 구조2.4

이제까지 자바의 연산자를 알아보았다 이제는 자바의 제어 구조에 대해 알아보자 자바의. .

제어구조는 나 와 거의 동일하다 따라서 자세한 설명은 생략하고 간단한 예제들을 살C C++ .

펴보도록 하자.

문IF

if (boolean) {

statements;

} else {

statements;

}

Page 39: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 39 -

문FOR

for(init_expr; test_expr2; increment_expr3) {

statements;

}

Page 40: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 40 -

문while

while(boolean) {

statements;

}

문do-while

문은 문과 동일 하지만 문은 최소 한번은 수행된다는 특징을 가지do-while while , do-while

고 있다.

do {

statements;

} while(boolean);

Page 41: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 41 -

Page 42: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 42 -

문switch

스위치문의 부분에는 을 제의한 정수형 타입 이 들어갈 수expr long (byte, short, char, int)

있다 따라서 문자열이나 실수형 및 등은 부분에 들어갈 수 없다. long expr .

switch(expr) {

case expr1:

statements;

break;

case expr2:

statements;

break;

default:

statements;

break;

}

설명

Page 43: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 43 -

8 char c = (char)System.in.read();

콘솔로부터 입력을 받을 때는 를 이용한다 리턴 타입은 바이트이기 때문에System.in.read() .

다른 타입으로 캐스트 연산자를 써서 변환해야 한다.

Page 44: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 44 -

문try - catch - finally

문은 예외 상황 이 발생했을 때 예외 상황을 처리하기 위한 문장이다try-catch (exception) .

try {

.....

예외 상황이 발생할 수 있는 코드들//

} catch(ExceptionName ex) {

....

예외 상황이 발생했을 때 처리하는 루틴//

} final1y {

....

항상 수행되는 부분//

}

Page 45: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 45 -

Page 46: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 46 -

문break

문은 가장 가까운 문에서 빠져나갈 때 사용된다 그러나 문break for, while, do, switch · break

다음에 레이블이 사용되면 레이블이 선언된 문장을 벗어난다 주의할 점은 레이블은. break

문을 이용해서 빠져나갈 블락 문장 바로 앞에 존재해야 한다.

라는 레이블을 선언했다job2: //job2 .

if((i < 10) {

for(int j=0; j < 10; j++) {

if(j > i)

문을 벗어난다break; // for .

if(a[i][j] == null)

가장 밖에 있는 문을 벗어나 부분을 실행한다break job2; // if A .}

}

for(int k=0; k <20; k++) {

....

}

....

}

//A

다음은 문을 사용하는 예제 프로그램이다break .

Page 47: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 47 -

문continue

문에서 문 다음은 수행하지 않고 반복문의 조건 부분을 실행한다while, do ,for continue , .

에서도 와 마찬가지로 레이블을 사용하는 경우에 레이블이 선언된 문장의 조continue break

건 부분을 테스트한다.

job2 :

while(!done) {

if(i<0)

지점으로 제어가 이동continue; // B .

for(int j=0; j<10; j ) {++

if[a[i] == null)

지점으로 제어가 이동continue; // A

else if(b[i] == null)

지점으로 제어가 이동continue job2; // B .

....

//A}

}

.....

//B

}

Page 48: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 48 -

함수 호출

자바에서 함수 호출은 방식을 사용한다 즉 아규먼트의 값을 복사해서 넘겨call-by-value . ,

주는 것이다 그러나 레퍼런스 타입의 아규먼트인 경우 레퍼런스 포인터 를 사용하기 때문. , ( )

에 의 효과가 발생한다call-by-reference .

Page 49: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 49 -

제 장 객체지향 프로그래밍3 .

객체지향 개념3.1

객체지향 기술은 원래 프로그래밍 방법의 일종인 객체지향 프로그래밍(Object-oriented

으로부터 시작되었다 그후에 좋은 프로그램은 좋은 설계 좋은 분석에 의해서programming) . ,

만 가능하다는 인식으로 객체지향 설계 분석 등의 기술들이 탄생하게 되었다, .

객체지향 기술의 가장 기본적인 원칙은 정보를 클래스라 불리는 추상화된 자료 형태로 표현

할 수 있다는 것이다 클래스는 단순한 자료뿐만 아니라 자료를 처리 할 수 있는 루틴들을. ,

포함한다 이렇게 자료와 루틴을 하나의 추상화된 클래스라는 개념에 포함시킨 것을 캡슐화.

라고 한다 클래스에 포함된 변수들을 클래스의 멤버 멤버 필드 혹은 어트리(encapsulation) . ,

뷰트 라고 부른다 클래스 내에 포함된 루틴은 행동 메소드 멤(attribute) . (behavior), (method),

버 함수라고 부른다.

프로그래머는 원하는 멤버 필드와 메소드는 클래스의 외부에서는 접근하지 못하도록 할 수

있다 이러한 기능을 정보 은폐라고 한다 상속이란 새로운 클래스를 정의할 때 처음부터 정. .

의하는 것이 아니라 이미 존재하는 클래스를 바탕으로 필요한 속성만 추가하여 정의하는,

방법이다 이때 새로 정되는 클래스를 서브 클래스 바탕이 되는 클래스를 슈퍼클래스라고. ,

한다 이렇게 하면 클래스들 사이에 공통적으로 가지는 특성들을 중복해서 정의하는 일을.

줄일 수 있을 뿐만 아니라 특성을 수정하거나 추가할 때 슈퍼클래스 정의만 고치면 서브클,

래스들은 변경된 속성을 자동적으로 상속하게 되므로 편리하다.

객체지향 프로그래밍의 장점

생산성 향상 : 객체지향 기술에서 추구하는 궁극적인 목표는 잘 설계된 클래스 라이브러리

를 재사용 하여 소프트웨어를 조립 생산하는 것이다 객체를 하드웨어 처럼 독립적이어서. IC

이를 재사용함으로써 생산성을 증가시킬 수 있다.

자연적인 모델링 : 객체 클래스 속성 상속 및 다형성 은 일상생활에서 보통, , (polymorphism)

사람들이 생각하는 방식을 그대로 프로그래밍 언어로 표현 할 수 있게 해준다 따라서 객체.

지향 방법은 자연스러운 모델링으로 쉽고 효율적인 프로그램을 개발케 해준다.

Page 50: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 50 -

재사용 : 객체지향 프로그래밍은 코드 재사용을 극대화한다 상속성을 이용하여 슈퍼클래스.

의 코드를 재사용하여 새로운 클래스를 생성하기도 하며 기존의 클래스를 통합하여 새로운,

클래스를 생성하기도 한다.

유지보수의 용이성 : 객체지향 프로그램은 기존의 기능을 수정하거나 새로운 기능을 추가

하기가 용이하다 기존의 기능을 수정할 기존의 함수를 새롭게 바꾸더라도 캡슐화와 정보은.

폐 때문에 주변에 미치는 영향을 최소화한다.

Page 51: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 51 -

실세계의 객체와 컴퓨터상의 클래스 객체3.2 /

실세계 혹은 인간의 생각속에 존재하는 사물을 객체라고 한다 보트 자동차는 실제로 만져. ,

볼 수 있는 형태의 객체이고 복소수나 은행 구좌 등은 인간의 관념 속에 존재하는 객체인,

것이다 이러한 객체들은 프로그래밍 언어로 표현할 때 클래스라는 것으로 표현하게 된다. .

클래스는 실세계에 존재하는 객체를 위한 자료 형태 인 것이다 이러한 클래스 타(data type) .

입으로 변수를 하나 선언했을 때 이 변수를 다시 객체라고 부른다 따라서 객체라고 했을.

때 그것이 어떤 의미로 사용됐는가는 문맥을 보고 판단해야된다.

객 체 : Object = Data + Methods

클래스의 인스턴스Object = (an instance of a class)

클래스 : 객체의 타입Class = (description of a type of Object)

프로그램 : 서로 협력하는 객체들의 집합Program = (a set of objects invoking each

others Methods)

자바 언어에서는 다음과 같은 형태로 클래스를 기술한다.

[classmodifier] class classname [extends classname] [implements interfacename] {

[variable declaration;]

[method declaration;]

}

는 클래스 정보 를 보여주기 위해서 사용되는데 중에classmodifier (?) public, abstract, final

하나를 사용할 수 있고 또한 는 옵션 부분이기 때문에 사용되지 않을 수도 있, classmodifier

다 사용자들은 부분에 나 를 사용할 수 있지 않을까 하고. C++ classmodifier protected private

생각할 수도 있겠지만 실제로 자바에서는 등은 존재하지 않는다protected class ... .

Page 52: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 52 -

다음 예제는 이라는 클래스를 기술해 놓은 것이다 이라는 클래스는 멤버 필드Circle . Circle

로 원의 반지름을 위한 변수 을 가지고 있고 메소드로는r , getCircumference(), getArea(),

를 가지고 있다 멤버 필드 은 메소드 어느 부분에서든지 자유롭게getRadius(), setRadius() . r

접근해서 사용할 수 있다.

클래스를 생성한 다음에 클래스가 다른 프로그램에서 어떻게 사용되는 지를 보여 주Circle

기 위해 라는 파일을 작성하였다 에서는 클래스를 만들고 원의CircleUser . CircleUser Circle ,

둘레를 구하거나 원의 면적을 구하는 프로그램이다 만약 을 타입으로 갖는 변수를 선. Circle

언해서 사용하고자 하면

Circle c = new Circle();

라고 기술한다.

Page 53: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 53 -

생성자3.3

클래스 이름과 동일한 이름을 갖는 메소드를 생성자라고 한다 언어에서 함수를. C malloc()

사용해서 동적으로 힙 영역에 레코드를 위한 공간을 할당하는 방식과 동일하게 클래스도 힙

영역에서 동적으로 메모리 공간을 할당받아야 한다 메모리 공간의 할당 및 클래스 멤버 필.

드의 초기화를 위해서 모든 클래스는 생성자를 갖는다 위에서 정의한 클래스는 생성. Circle

자를 기술하지 않았지만 내부적으로는 아규먼트가 없는 디폴트 생성자가 하나 있는 것이다

위의 예제에서는 두개의 생성자를 가지고 있다 첫번째 생성자는 아규먼트가 없는 경우에는.

멤버필드 의 값을 으로 한다 두번째 생성자는 아규먼트를 받아서 아규먼트의 값으로r 0 . r

값을 설정한다.

생성자는 다음과 같은 특징을 가지고 있다.

클래스의 이름과 동일하다1. .

생성자의 리턴 타입은 기술하지 않는다2. .

다음의 클래스는 생성자를 이용해서 클래스를 생성한다CircleUser Circle(int r) Circle .

Page 54: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 54 -

Page 55: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 55 -

this

는 클래스내에서 자기 자신을 가리키는 레퍼런스이다 레퍼런스는 주로 두가지 목this . this

적으로 사용된다 첫째는 자기 자신의 멤버 필드나 메소드를 명확히 지시하기 위해서 사용.

된다 이러한 예로는 클래스의 생성자에서 로 클래스의 켐버 필드 에 아. Circle this. r = r; r

규먼트 의 값을 할당하는 경우에 서로를 구별하기 위해서 레퍼런스를 사용했다 두번r this

째로 레퍼런스는 클래스 전체를 함수의 아규먼트로 전달해야 할 필요가 있을 때 사용this

될 수 있다.

Page 56: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 56 -

this()

생성자에서 사용되는 는 클래스의 다른 생성자를 호출하는 함수이다 생성자가 아규먼this() .

트를 필요로 하는 경우에는 함수에 아규먼트들을 기술해줄 수 있다 생성자가 많은this() .

경우에는 아규먼트의 수와 타입에 의해 호출되는 생성자가 결정된다 생성자에서 는. this()

맨 처음 부분에 나와야 된다.

메소드finalize()

메소드는 클래스의 메모리가 가비지 콜렉트되기 직전에 자동적으로 호출된다finalize() .

클래스에 로 아무 작업도 수행하지 않는 메소Object protected void finalize() { } finalize()

드가 정의되어 있기 때문에 프로그래머는 이 메소드를 오버라이드해서 메소드를 작성할 수

있다 메소드 호출은 특별한 순서대로 수행되지 않을 뿐만 아니라 병행적으로 호. finalize()

출될 수도 있다 메소드는 객체 제거를 최적화하는데 사용될 수 있다 예를 들어. finalize() . ,

다른 객체에 대한 참조를 제거하거나 객체가 수행한 작업들 정리 등을 메소드에, finalize()

서 수행될 수 있다 그러나 대부분의 프로그램에서 메소드는 거의 사용되지 않는. , finalize()

다.

Page 57: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 57 -

객체간의 의사소통 메시지 패싱3.4 :

객체지향 프로그래밍에서 프로그램은 객체들의 집합이다 따라서 프로그램이 적절한 작업을.

수행하기 위해서는 각 객체들간에 서로 적절히 의사소통을 하면서 협력해야한다 객체지향.

프로그래밍에서 객체들간의 의사소통은 메시지 패싱 방법을 사용한다 메시지 패싱은 각 객.

체지향 프로그래밍 언어마다 다양하게 구현할 수 있겠지만 대부분의 언어에서는 함수호출

방법을 사용한다.

위의 그림의 클래스는 페달 엔진 바퀴라는 객체들로 구성되어 있다 운전자가 페달 객Car , , .

체에 페달을 밟았다 라는 메시지를 전달했다 페달 객체는 다시 엔진 객체에 힘 좀 더 내“ ” . “

봐 라고 메시지를 전달한다 엔진 객체는 다시 바퀴 객체에 빨리 돌아라 라는 메시지를” . “ ”

전달하고 있다 객체지향 프로그래밍에서는 이렇게 객체들간에 메시지를 전달함으로서 협력.

해서 작업을 수행할 수 있다.

위의 그림은 객체들 간의 메시지 전달이 자바 언어에서 구현되는 모습을 보여주고 있다 자.

바에서는 객체들 간에 메시지 패싱을 위해 함수 호출 방법을 사용하고 있다 객체는. Driver

Page 58: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 58 -

클래스의 객체에게 메시지를 전달하기 위해 클래스의 함수를 호출한Car pedal Pedal push()

다 객체는 다시 객체의 함수를 호출한다 함수 호출을 통한 메시지. pedal engine powerUp() .

패싱은 간단하고 효과적이기 때문에 대부분의 언어에서 사용되고 있다.

Page 59: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 59 -

가시성3.5

클래스의 멤버 필드와 메소드는 클래스의 정보 은폐를 위해 등의public, protected, private

키워드를 이용해서 외부에서 접근을 제어할 수 있다.

public :■ 으로 선언된 멤버 필드와 메소드는 클래스의 내외 어느 곳에서나 접근이public

가능하다.

protected :■ 로 선언된 멤버 필드와 메소드는 같은 패키지 내에 있는 클래스들protected

은 모두 접근 가능하다 다른 패키지에 있는 클래스들은 이 클래스로부터 상속받은 경우에.

만 접근 가능하다.

pakage :■ 혹은 라고 말하는 것인 아무것도 기수하지 않았을 때를 말한pakage default

다 디폴트로 선언된 멤버 필드와 메소드들은 같은 패키지 내에서는 자유롭게 접근할 수 있.

지만 패키지 외부에서는 접근할 수 없다, .

private :■ 로 선언된 멤버 필드와 메소드는 클래스 내부에서만 억세스 가능하다private .

그림 패키지 내부에서 접근25. 그림 패키지 외부에서 접근26.

상 황 public protected

package private

동일 패키지에서 제 의 클래스 접근3 O O O X

동일 패키지에서 서브클래스 접근 O O O X

다른 패키지에서 제 의 클래스 접근3 O X X X

다른 패키지에서 서브클래스 접근 O X X X

동일 패키지의 서브 클래스로부터 상속 O O O X

다른 패키지의 서브 클래스로부터 상속 O O X X

Page 60: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 60 -

오버로딩3.6

int = int + int;

float = float +float;

위의 두 계산은 동일한 연산 더하기 연산을 하는 것처럼 보이지만 내부적으로는 전혀 다른

두개의 함수가 수행된다 정수와 실수의 표현 방법이 다르기 때문에 정수의 더하기와 실수.

의 더하기는 전혀 다른 것이다 내부적으로 수행하는 작업은 다르더라도 프로그래머의 관점.

에서는 두 숫자를 더한다는 의미면에서 두 연산은 동일하다 따라서 프로그래머는 정수의. ,

더하기와 실수의 더하기를 동일한 연산자 를 이용한다 이렇게 동일한 연산자가 자료의'+' .

타입에 따라 다른 작업을 하는 것을 연산자 오버로딩이라고 한다 연산자와 마찬가지로 함.

수도 오버로딩을 할 수 있다 함수 오버로딩을 사용하면 동일한 이름을 가지는 함수가 여러.

개 존재할 수 있다 예를 들면 언어에서는 정수를 정렬 하는 함수를 라고. C (sort) sort_int()

하고 문자열을 정렬 하는 함수를 라고 함수 이름을 붙여서 사용했지만, (sort) sort_string() ,

자바에서는 어떤 내용을 정렬하건 간에 라는 함수 이름을 사용할 수 있게 된 것이다sort() .

즉 내부적으로는 다른 작업을 하더라도 의미면에서 동일하다면 동일한 함수 이름을 사용할,

수 있다 함수 오버로딩을 사용하기 위해서는 함수 이름은 같아도 함수의 아규먼트는 달라. ,

야한다.

함수 이름 아규먼트의 수 아규먼트의 타입을 시그니쳐 라고 한다 프로그래머가, , (signature) .

동일한 함수 이름을 사용하면 컴파일러가 시그니쳐를 이용해서 다른 이름으로 변경해서 컴

파일한다 따라서 함수 이름이 동일하고 시그니쳐도 동일하다면 컴파일러가 구별할 수 없기.

때문에 컴파일 에러가 발생한다 주의할 점은 함수의 리턴 타입은 시그니쳐에 포함되지 않.

는다.

오버로딩은 한 클래스 내에서 함수 이름은 동일하지만 함수의 아규먼트 아규먼트의 수 아, ( ,

규먼트의 타입 는 다른 경우이다) .

·

Page 61: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 61 -

Page 62: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 62 -

추상클래스3.7

등 도형에 관련된 클래스를 만들었다고 하면 클래스들을Line, Circle, Rectangle, Triangle

관리하기 쉽게 하기 위해서 각 클래스들의 공통된 특성들을 모아서 라는 클래스를 만Shape

들 수 있다 그러나 실제로 라는 도형은 존재하지 않고 클래스의 모든 특성이. Shape , Shape

구체적으로 구현되지는 않기 때문에 이런 클래스를 추상 클래스 라고 한다(abstract class) .

클래스의 메소드들 중에서 함수의 인터페이스만 정의하고 실제 함수의 몸체 부분은 정의되

지 않은 메소드를 추상 메소드 라고 한다 추상 메소드는 메소드의 리턴 타(abstract method) .

입부분 앞에 라는 키워드를 기술한다 추상 메소드는 다음과 같은 형태를 가진다abstract . .

visibility_type abstract return_type function_name (argument_list);

추상 메소드는 함수의 몸체를 가지지 않는다.

추상 메소드를 가지는 모든 클래스를 추상 클래스라고 한다 추상 클래스는 클래스 선언 시.

에 라는 키워드를 사용해서 다른 프로그래머나 컴파일러에게 클래스가 추상 클래abstract

스임을 알려주어야 한다 추상클래스로부터 상속을 받는 경우에 서브 클래스는 추상 메소드.

를 구현 해야한다(implement) .

Page 63: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 63 -

Page 64: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 64 -

Page 65: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 65 -

상속3.8

상속이란 기존에 있는 클래스를 바탕으로 해서 기존 클래스의 특성을 유지하면서 다른 특성

을 추가적으로 가지는 클래스를 만드는 방법이다 상속을 받는 클래스를 서브클래스.

혹은 드라이브드 클래스 라고 하고 바탕이 되는 클래스를 슈퍼클래(subclass) (derived class)

스 혹은 베이스클래스 라고 한다(superclass) (base class) .

상속은 관계를 모델링하는데 사용되고 서브 클래스는 슈퍼 클래스의 서브타입is-a ,

이 된다(subtype) .

클래스0Employee 클래스Manager

class Employee {String name;String idnum;String title;int salary;

}

class Manager {String name;String idnum;String title;int salary;String dept;Employee subordinate[];

}

다음은 상속을 이용한 와 클래스 예제 프로그램이다Employee Manager .

Page 66: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 66 -

Page 67: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 67 -

Page 68: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 68 -

super

는 와 유사한 용도로 사용된다 가 객체 자신을 지칭하는 레퍼런스로 사용되는super this . this

반면에 는 슈퍼클래스를 지칭하는 레퍼런스로 사용된다 따라서 상위 클래스의 멤버super .

필드나 메소드를 지칭할 때 처럼 사용할 수 있다super.attribute,super.method() .

함수는 함수가 클래스의 다른 생성자를 지칭하는 것처럼 는 슈퍼클래super() this() , super()

스의 생성자를 의미한다 따라서 는 슈퍼클래스의 생성자를 호출한다 는 클래. super() . super()

스의 생성자의 맨 처음부분에 위치해야한다 상속을 받은 클래스는 생성자에서 슈퍼클래스.

의 생성자를 호출해주는 것이 바람직하다 슈퍼클래스의 생성자를 호출하지 않는 경우에는.

내부 적에서 자동적으로 슈퍼클래스의 디폴트 생성자가 호출된다 슈퍼클래스에 디폴트 생.

성자가 없는 경우에는 프로그래머가 명시적으로 슈퍼클래스의 생성자를 호출해주어야 한다.

오버라이딩

앞에서 이미 설명한대로 오버로딩 은 한 클래스에서 아규먼트의 수나 아규먼트(overloading)

의 타입은 다른 다르지만 동일한 함수 이름을 사용하는 것을 의미한다 이에 반해 오버라이.

딩 은 클래스의 상속관계에서 발생한다 슈퍼클래스에 있는 메소드를 서브클래스(overriding) .

에서 다른 작업을 하도록 동일한 함수 이름으로 재 정의하는 것이다.

예를 들면 은 로부터 상속을 받았고 에는 라는 메소드가 있다면human animal , animal eat()

은 라는 함수를 그대로 사용할 수 있을 것이다 그러나 사람이 먹는 것과 동물human eat() . ,

이 먹는 것은 방법 면에서 틀릴 것이다 그래서 에는 라는 메소드를 다시 정의하. human eat()

는 것이다 타입의 변수가 가 있다면 메소드는 의 메소드. human choi choi.eat() animal eat()

가 아닌 의 메소드를 호출하게 된다 즉 의 함수는 무시되는human eat() . , anima1 eat()

것이다(override) .

앞에서 설명한 와 클래스의 메소드는 메소드 오버라이딩의 전형Employee Manager doJob()

적인 예를 보여준다.

Page 69: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 69 -

Page 70: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 70 -

메소드에서 와static this super

는 클래스의 내부에서만 사용될 수 있고 으로 선언된 메소드에서는 사용될this, super , static

수 없다 다음은 가 잘못 사용된 예제 프로그램이다. super .

설명 :

함수에서는 를 사용할 수 없다 는 클래스 내부에서만 사용할 수static this, super . this, super

있다.

Page 71: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 71 -

오버쉐도우(overshadow)

동일한 이름의 멤버 필드가 슈퍼클래스와 서브클래스에 있다면 어떻게 될까 이러한 경우에?

동일한 이름의 슈퍼 클래스의 멤버 필드는 오버쉐도우 됐다고 한다 오버쉐도우(overshadow) .

된 멤버필드는 레퍼런스를 이용하거나 서브 클래스를 슈퍼클래스로 형 변환해서 접super ,

근할 수 있다 그러나 오버라이드된 메소드는 형변환을 통해 접근할 수 없고 레퍼런. , super

스를 통해서만 접근할 수 있다.

Page 72: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 72 -

Page 73: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 73 -

상속 클래스XYZ

클래스는 다음 그림과 같은 클래스 상속 관계를 갖는다 각 클래스는 동일X, Y, Z . X, Y, Z

한 이름의 멤버 필드 와 를 갖는다 클래스는 와 메소드를 가지고 있고i msg . X print() play() ,

클래스는 의 메소드를 오버라이드한다 클래스는 다시 클래스를 상속받아Y X print() . Z Y

서 메소드와 메소드를 오버라이드한다 세 클래스에서 오버쉐도우 된print() play() . X, Y, Z

멤버 필드와 오버라이드된 메소드들의 관계를 예제를 통해서 알아보자XYZ.java .

Page 74: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 74 -

Page 75: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 75 -

Page 76: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 76 -

자바 폴리머피즘

객체지향에서 폴리머피즘이라는 말이 많이 나오는데 이것은 많다 는 뜻의 접두어와, poly-( )

형태 라는 뜻이 결합된 합성어이다 따라서 폴리모피즘은 형태가 많다는 뜻이 되morphism( ) .

는데 폴리모피즘이 다형성으로 번역되는 것도 이 때문이다 형태가 많다는 말은 무슨 뜻일, .

까 이것은 의미 는 하나지만 실제 형태는 여러 가지가 될 수 있다는 말이다 예? (semantics) .

를 들면 밥을 먹다 는 우리는 충분히 이해할 수 있다 그러나 실제적으로 밥을 먹는 형, “ ” . , “

태 는 많다 개가 밥먹는 형태 한국 사람이 밥먹는 형태 미국 사람이 밥먹는 형태 등 등” . , ,

의미는 하나지만 실제적인 형태는 상당히 많을 수 있는 것이다.

폴리머피즘이 프로그래밍에서는 어떻게 나타나게 될까 폴리모피즘은 프로그램에서 특별한?

연산자나 키워드가 있는 것이 아니다 폴리모피즘은 객체지향 프로그래밍 언어에서 오버로. “

딩 오버라이딩 의 형태로 나타난다(overloading)”, “ (overriding)” .

Page 77: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 77 -

Page 78: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 78 -

는 클래스로부터 상속받았고 메소드를 오버라이드 했다 에는PolyB2 PolyA2 , work() . PolyA2

메소드가 정의되어 있고 이 메소드는 메소드를 호출한다 는 로init() , work() . PolyB2 PolyA2

부터 상속받았기 때문에 메소드를 호출할 수 있다 클래스가 메소드를init() . PolyB2 init()

호출하는 경우에 은 와 의 메소드들 중에서 어느 것을 호출할, init() PoIyA2 PoIyB2 work()

것인가 다음 예제에서 보듯이 클래스의 메소드가 호출된다? PolyB2 work() .

Page 79: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 79 -

와 의 예는 생성자에 적용될 수도 있다 다음 와 는 상속 관계PolyA2 PolyB2 . PolyA3 PolyB3

이고 의 생성자는 초기화를 위해 메소드를 호출한다 그런데 클래스가, PolyA3 init() . , PolyB3

자신의 멤버필드를 초기화하기 위해 메소드를 오버라이드한 것이다 이런 경우에init() .

클래스의 멤버필드는 프로그래머의 의도와는 다르게 초기화 안될 수도 있다 다음PolyA3 .

예에서 의 멤버필드는 적절하게 초기화되지 않았다 생성자에서 폴리머피즘을PolyA3 msg .

사용하는 것은 프로그래밍에서 상당한 유연성을 제공하지만 잘못 사용하는 경우에 아래 예,

제처럼 잘못된 연산을 수행할 수도 있다.

Page 80: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 80 -

Page 81: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 81 -

인터페이스3.9 (Interface)

자바에서 다중 상속을 지원하기 위해서 추상 클래스와 유사한 인터페이스를 제공하고 있다.

추상클래스는 클래스의 메소드와 멤버 필드의 일부분은 구현이 되어 있는데 비해 인터페이,

스는 전혀 구현되어 있지 않을 것을 의미한다 추상 클래스를 이용하는 경우에는 단일 상속.

만 지원하는데 비해 인터페이스는 다중상속을 할 수 있다는 장점을 가지고 있다.

항목 인터페이스 추상 클래스

용도 디자인 일부 구현 일부 디자인,

메소드 abstract, public, NOT static 임의

필드 static, final 임의

앞에서 정의한 과 클래스로부터 상속받아 그림으로 표현할 수 있는 클래Circle Rectangle

스를 만들고자 한다 이러한 경우에 과 클래스로부터 직접 상속을 받아 클. Circle Rectangle

래스를 만들 수도 있지만 인터페이스를 정의하고 그 인터페이스로부터 상속을 받아서 새로,

운 클래스를 만드는 것이 더 바람직하다 이 경우에 이라는 인터페이스를 만들고. Drawable ,

인터페이스로부터 상속을 받기 위해서 라는 키워드를 사용한다 이것을 그림으로implements .

표현하면 다음과 같이 나타낼 수 있다.

Page 82: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 82 -

이제 인터페이스를 작성해보자 인터페이스는 메소드를 가지고Drawable . Drawable paint()

있다.

Page 83: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 83 -

만약 인터페이스 이외에 이라는 인터페이스로부터 상속받고 싶은 경우Drawable Sacalable

에는 어떻게 할까 인터페이스는 필요한 경우에 여러 개를 를 이용해서 기술할 수 있다? ‘,’ .

class ScaleDrawableCircle extends Circle implements Drawable, Scalable {

...

}

처럼 기술할 수 있다.

인터페이스 간에도 상속이 있을 수 있다 인터페이스 간에서 상속은 클래스와 마찬가지로.

를 사용한다extends .

interface ScaledDrawable extends Drawable {

···

Page 84: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 84 -

}

Page 85: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 85 -

패키지

패키지란 유사한 클래스들의 모임을 말한다 모든 클래스들은 한 패키지에 속하게 된다 클. .

래스들을 개발하면서 패키지를 만들기 위해서는

package package_name;

문장을 파일의 처음부분에 쓴다 패키지 이름은 패키지의 특성을 잘 나타낼 수 있도록 만드.

는 것이 중요하다 전 세계적으로 수많은 클래스들이 개발되기 때문에 클래스가 만들어진.

회사 학교 연구소 등을 구별하기 위해 인터넷 도메인 네임을 패키지 이름으로 사용하기도/ /

한다 예를 들어 숭실대학교의 도메인 네임은 이다 숭실대학교의 연구실. soongsil.ac.kr . ss

에서 라는 패키지를 만든다면 전체 패키지 이름은 가 될 것이다Hello , kr.ac.soongsil.ss.Hello .

패키지 이름이 길어서 불편한 경우에는 단지 라고 붙여도 관계없다 만약Hello .

라고 패키지 이름을 붙이는 경우에 각 각의 에 해당되는 부분이kr.ac.soongsil.ss.Hello “.”

하위 디렉토리를 형성하게 된다 즉 디렉토리가 생기고 디렉토리 아래에 디렉토. , kr , kr ac

리가 있게된다 결국에는 디렉토리에 패키지에 속하는 모든 클래스들이 존재한다. Hello .

문장을 사용하지 않는 경우에는 디폴트 패키지에 속하게 된다 패키지 내에서 클래package .

스들은 서로 자유롭게 다른 클래스들을 참조 할 수 있다 그러나 다른 패키지에 있는 클래. ,

스를 참조하기 위해서는

import package_name.class_name;

문장을 사용한다 문장을 사용하지 않고 다른 패키지의 클래스를 참조하기 위해서는. import

패키지 이름과 클래스 이름을 같이 사용하는 것이다 예를 들면 패키지의. , java.awt

클래스가 필요하면Graphics

java.awt.Graphics g;

처럼 사용하면 된다.

Page 86: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 86 -

Page 87: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 87 -

과 의 의미static final

클래스final

키워드는 클래스 메소드 멤버 필드에 사용될 수 있으며 사용되는 부분에 따라 의미가final , ,

약간씩 달라진다 첫 번째로 클래스 앞에 키워드가 사용되면 그 클래스는 더 이상 상. final

속을 통해서 재사용 할 수 없다는 의미이다 즉 클래스를 상속받으려는 클래스는 컴파. final

일시에 에러가 발생한다 다음 예를 살펴보자 클래스는 로 선언되었고 컴파. . FinalClass final ,

일에도 문제가 없다 그러나 클래스로부터 상속받는 클래스는 컴파일· , FinalClass SubFinal

시에 에러 메시지를 출력하고 컴파일 되지 않는다.

이와 유사하게 키워드와 키워드는 동시에 클래스에 선언될 수 없다 클final abstract . final

래스는 상속이 불가능하고 클래스는 추상 클래스이기 때문에 상속을 통해서만 클abstract

래스가 완성되기 때문에 두 키워드를 동시에 사용할 수 없다.

Page 88: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 88 -

Page 89: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 89 -

메소드final

이 메소드에 선언된 경우에는 그 메소드는 오버라이딩이 불가능하다 다음의final .

클래스는 메소드를 가지고 있다 이 클래스로부터 상속받는FinalMethodSuper print() .

클래스는 메소드를 오버라이드 하려고 하지만 메소드는FinalMethodSub print() print()

클래스에서 로 선언되었기 때문에 오버라이드 되지 않는다FinalMethodSuper final .

Page 90: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 90 -

멤버필드final

이 클래스의 멤버필드에 사용되면 멤버필드의 값을 바꿀 수 없는 상수의 의미로 사용된final

다 따라서 멤버필드는 값을 초기화만 할 수 있고 새로이 값을 할당할 수는 없다 일. final , .

반적으로 이 멤버필드와 사용될 때는 으로 선언해서 클래스 멤버필드로 사용한다final static .

멤버필드static

멤버필드는 객체들간의 전역변수처럼 사용될 수 있다 다음 예에서 클래스에는static . Point

이라는 멤버필드를 으로 선언하였다 멤버필드는 클래스의 전역변수로 사origin static . static

용되기 때문에 클래스에서 두 객체는 전역변수인 을 공유하게 된다StaticField p, q origin .

멤버필드는 클래스이름으로 접근할 수도 있다static .

Page 91: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 91 -

Page 92: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 92 -

메소드static

메소드는 클래스 메소드라고도 하며 인스턴스가 아닌 클래스 이름으로 메소드를 호출static

할 수 있다 클래스의 등의 메소드들은 대표적인 메소드들이다. Math sqrt(), abs() static .

메소드에서는 를 사용할 수 없고 이 아닌 멤버필드는 접근할 수 없static this, super , static

다.

초기화static

클래스 내에서 키워드를 이용해서 초기화 루틴을 사용할 수 있다 초기화는 클static . static

래스가 초기화될 때 수행된다 대표적인 초기화의 예는 네이티브 메소드에서 라이브. static

러리를 로드하는 것이다 초기화는 다음과 같은 형태로 사용된다. static .

static {

System.loadLibrary("hello");

}

다음의 클래스에 초기화 루틴을 사용하는 예를 살펴보자 클StaticInitial static . StaticInitial

래스는 멤버필드를 가지며 초기화 루틴에서 의 값을 임의의 수로 값을 할당한다a a .

Page 93: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 93 -

Page 94: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 94 -

3.10 클래스Inner

에서는 패키지의 멤버로서 클래스는 하나의 내용을 가지는 톱레벨 클래스로만 존재JDK l.0

할 수 있었다 이 발표되면서 자바에서도 클래스 안에 클래스를 정의할 수 있는. JDK l.1

클래스가 가능해졌다 클래스는 컴파일하는 경우에Inner . Inner

형태로 클래스 파일이 생성된다 클래스들은 다음과EnclosingClass$InnerClass.class . Inner

같은 종류들이 존재할 수 있다.

3.10.1 내재된 톱레벨 클래스 인터페이스/ (Nested top-level classes /Interfaces)

내재된 톱 레벨 클래스 인터페이스는 다른 클래스에 포함되면서 클래스나 인터페이스가/

으로 선언된 경우이다 내재된 인터페이스는 을 선언하지 않아도 기본적으로static . static

이기 때문에 항상 톱레벨이다 내재된 톱레벨 클래스 인터페이스는 다른 톱레벨 클래static . /

스와 마찬가지로 패키지의 멤버이다 따라서 클래스에 내재된 인터페이스. LinkedList

이 있다면 인터페이스는 로 접근할 수 있다Linkable , Linkable LinkedList.Linkable .

Page 95: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 95 -

3.10.2 멤버 클래스(Member classes)

멤버 클래스는 클래스의 멤버로 클래스가 선언된 경우이다 멤버 클래스는 내재된 톱Inner .

레벨 클래스와는 다르게 으로 선언되지 않는다 멤버 클래스는 자신을 포함하는 클래static .

스의 멤버필드의 메소드들을 자유롭게 접근할 수 있다는 것이 주목할 사항이다 멤버 클래.

스는 포함하는 클래스의 메소드와 멤버 필드도 접근할 수 있다private .

Page 96: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 96 -

Page 97: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 97 -

다음은 멤버 클래스에서 외부의 포함하는 클래스의 멤버 필드를 접근하는 방법을 보여주는

예제프로그램이다.

Page 98: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 98 -

3.10.3 지역 클래스(local classes)

지역 클래스는 멤버 클래스와는 다르게 자바 코드의 블록 안에서 정의된 클래스이다Inner .

따라서 정의된 블록 안에서만 사용될 수 있고 이러한 특성은 지역 변수와 유사하다 지역, .

클래스는 멤버클래스는 아니지만 포함하는 클래스의 멤버 필드와 메소드들을 자유롭게 접근

할 수 있다.

Page 99: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 99 -

Page 100: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 100 -

3.10.4 무명 클래스(Anonymous classes)

무명 클래스는 지역 클래스의 개념을 확장한 것이다 지역 클래스는 클래스를 정의하고 만. ,

들어서 사용하는 개의 과정으로 되어 있는데 무명 클래스는 단계를 하나의 단계로 결합2 , 2

한 것이다 따라서 클래스를 정의하면서 바로 사용하는 방식이다 무명 클래스는 이름을 갖. .

지 않고 한번만 사용할 수 있다.

Page 101: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 101 -

3.11 자바에서 중요한 클래스들

썬에서 제공하는 에는 많은 클래스들이 포함되어 있다 에 포함된 모든 클래스들을JDK . JDK

모두 알아보기는 어렵지만 이장에서는 중요한 몇 몇 클래스들을 알아보자.

3.11.1 클래스Object

클래스는 모든 자바 클래스의 슈퍼 클래스이다 자바에서 특별히Object . "extends Object"

를 사용하지 않아도 자동적으로 클래스로부터 상속을 받는다 모든 자바 클래스가Object .

로부터 상속을 받기 때문에 클래스에서 정의된 모든 메소드는 모든 자바 클래Object Object

스에서 사용할 수 있다 클래스에는 다음과 같은 메소드들이 있다.Object .

객체를 복사하는데 사용된다protected Object clone() - .

두 객체의 내용이 동일한지 알아볼 때 사용되는 메소public boolean equals(Object obj) -

드이다.

객체를 위한 해쉬코드를 리턴 한다 해쉬코드는 자바 시스템에서public int hashCode() - .

객체를 유일하게 식별하는 정수 값이다.

3.11.2 데이터 타입 클래스

자바의 기본 자료형 등 은 클래스로 정의되어있지 않다 자바에서 객체지(int, char, boolean ) .

향 방법으로 프로그램을 개발하려면 기본 자료형을 객체로 표현하면 편리한 경우가 많다.

이러한 목적에 의해 각 기본형을 클래스로 표현할 수 있는 클래스들을 에서는 지원하고JDK

있다.

기본자료형 데이터타입클래스형

boolean Booleanbyte Bytechar Characterdouble Doublefloat Floatint Integershort Shortvoid Void

클래스Boolean

Page 102: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 102 -

클래스는 기본 타입을 표현하기 위한 클래스이다Boolean boolean . Boolean(boolean value),

두 형태의 생성자를 가지고 있다 두 번째 생성자의 아규먼트 는Boolean(Strings) . s "time"

문자열과 동일하면 값을 갖고 다른 경우에는 값을 갖는다 클래스로부time , false . Boolean

터 기본 타입 값을 얻기 위해서는 메소드를 이용한다boolean booleanValue() .

Page 103: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 103 -

클래스Byte

기본 자료 타입을 표현하기 위해 이후에 제공되는 클래스이다byte JDK 1.1 . Byte(byte

두 형태의 생성자를 갖는다 두 번째 생성자의 아규먼트는 문자열을value), Byte(String s) .

진수의 바이트 값으로 변환하면서 문자열의 포맷이 틀린 경우에는10

예외가 발생할 수 있다NumberFormatException .

문자열을 값으로 변환하는 메소드이다public static byte parseByte(String s) - byte .

문자열을 에 따라 진수 진수public static byte parseByte(String s, int radix) - radix 10 , 2

등의 값으로 변환하는 메소드이다byte .

진수 값을 리턴 하는 메소드이다public byte byteValue() - 10 byte .

클래스Character

형태의 생성자를 이용해서 기본 타입을 나타내기 위한 클래스로Character(char value) char

사용된다 클래스에는 다음과 같은 메소드들이 있다. Character .

public char charValue()

public static boolean isLowerCase(char ch)

public static boolean isUpperCase(char ch)

public static boolean isDigit(char ch)

public static boolean isLetter(char ch)

public static boolean isLetterOrDigit(char ch)

public static char toLowerCase(char ch)

public static char toUpperCase(char ch)

public static boolean문자가 자바 화이트isWhitespace(char ch) - ch

문자인가 알아보는 메소드이다.

클래스Double

클래스는 기본 자료형을 클래스로 표현하기 위해 만들어진 클래스로Double double

두 형태의 생성자가 있다 클래스는 멤버필Double(doublevalue), Double(String s) . Double

드로 다음과 같은 변수를 가지고 있다.

public static final double 형이 가질 수 있는 최대 값MAX_VALUE - double

public static final double 형이 가질 수 있는 최소 값MIN_VALUE - double

public static final double형에서 숫자가 아님을 표현하기 위해 사용NaN - double

되는 값public static final double

public static final double 형의 음의 무한대 값NEGATIVE_INFINITY - double

public static final double 형의 양의 무한대 값POSITIVE_INFINITY - double

Page 104: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 104 -

클래스는 다음과 같은 유용한 메소드들을 가지고 있다.

형이 의미 있는 숫자가 아닌지 여부를 알public static boolean isNaN(double v) - double

아보는 메소드이다.

public static boolean isInfinite(double v)

의미 있는 숫자가 아닌지 여부를 알아보는 메소드이다public boolean isNaN() - .

다음 메소드들은 클래스의 값을 각 기본 자료형의 값으로 변경하는데 사용되는 메Double

소드들이다.

public byte byteValue( )public short shortValue( )public int intValue( )public long longValue( )public float floatVa1ue( )public double doubleValue( )

Page 105: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 105 -

클래스Float

는 기본 자료형을 클래스로 표현하기 위해 사용되는 클래스이다 클래스는Float float . Float

다음과 같은 생성자를 이용해서 만들 수 있다.

public Float(float value)

public Float(double value)

public Float(String s)

클래스는 클래스와 유사한 멤버 필드와 메소드들을 가지고 있다Float Double .

public static final float MAX_VALUEpublic static final float MIN_VALUEpublic static final float NaNpublic static final float NEGATIVE_INFINITYpublic static final float POSITIVE_INFINITY

다음은 클래스의 유용한 메소드들이다Float .

public static boolean isNaN(float v)

public static boolean isInfinite(float v)

public boolean isNaN()

다음은 클래스의 값을 각 기본 자료형의 값으로 변환하는 메소들 이다Float .

public byte byteValue()

public short shortValue()

public int intValue()

public long longValue()

public float floatValue()

public double doubleValue()

클래스Integer

기본 자료형을 표현하기 위한 클래스로 클래스가 있다 클래스는int Integer . Integer

두개의 생성자를 가지고 있다 클래스는 최대Integer(int value), Integer(String s) . Integer

값과 최소 값을 표현하기 위해 와 두개의 멤버 필드를 가지고MAX_VALUE MIN_VALUE

있다.

public static final int MAX_VALUE

public static final int MIN_VALUE

Page 106: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 106 -

public static int parselnt(String s)

public static int parselnt(String s, int radix)

public byte byteValue()

public short shortValue()

public int intValue()

public long longValue()

public float floatVaIue()

public double doubleValue()

Page 107: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 107 -

클래스Short

기본 자료형을 표현하기 위한 클래스로 클래스가 있다 클래스는short Short . Short

두개의 생성자를 가지고 있다 클래스는 최대 값Short(short value), Short(String s) . Short

과 최소 값을 표현하기 위해 와 두개의 멤버 필드를 가지고MAX_VALUE MIN_VALUE

있다.

public static final short MAX_VALUE

public static final short MIN_VALUE

클래스는 다음과 같은 유용한 메소드들을 가지고 있다Short .

public static int parseShort(String s)

public static int parseShort(String s, int radix)

public byte byteValue()

public short shortValue()

public int intValue()

public long longValue()

public float floatValue()

public double doubleValue()

클래스Void

타입을 표현하기 위해 사용되는 클래스이지만 객체로 만들어 사용할 수는 없다void , .

클래스3.11.3 Math

클래스는 수학 함수와 이에 필요한 상수들로 구성되어 있다 클래스의 모든 멤Math . Math

버 필드 및 메소들은 모두 로 정의되어 있어 클래스를 상속해서 사용하거나 메소final Math

드들을 오버라이드해서 사용할 수 없다 클래스의 모든 메소드들은 으로 정의되. Math static

어 있기 때문에 프로그램 내에서 클래스의 인스턴스를 만들지 않고Math

형태로 메소드를 호출해서 사용할 수 있다 클래스는 다음 두개의Math.method_name . Math

멤버 필드를 가지고 있다.

public static final double E - 2.7182...

public static final double PI - 3.14159...

클래스는 다음과 같은 유용한 메소드들을 제공한다Math .

Page 108: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 108 -

public static type 아규먼트 의 절대값을 리턴 한다abs(type value) - value .

public static type 와 중에서 큰 값을 리턴 한다max(type a, type b)·a b .

pub1ic static type 와 중에서 작은 값을 리턴 한다min(type a, type b) - a b .

public static double 자연 로그 값을 리턴 한다log(double a) - Ina .

public static double 값을 리턴 한다pow(double a, double b) - ab .

public static double 값을 리턴 한다 는 라디안 값이다sin(a) . a .

public static double 의 제곱근 값을 리턴 한다sqrt(double a) - a .

public static double 사이의 임의의 값을 리턴 한다public static random() - 0.0 1.0 .∼

Page 109: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 109 -

3.11.4 클래스String

클래스는 문자열을 나타내기 위해서 사용된다 언어에서는 로 문자열을 표String . C char *

현했지만 자바에서는 문자열을 위한 클래스를 만들었다 클래스는 문자열의 내용이, . String

나 길이를 변경할 수 없다는 특징이 있다 따라서 문자열의 내용이 변경될 필요가 있을 때.

는 내부적으로 새로운 클래스를 만들어 사용한다 클래스의 생성자로는 다음String . String

과 같은 것들이 있다.

public String()

public String(String value)

public String(char[] value)

public String(char[] value, int offset, int count)

public String(bytes[] value)

클래스의 유용한 메소드로는 다음과 같은 것들이 있다String .

public char 번째의 문자를 리턴 한다 클래스에서charAt(int index) - index . String

는 사이의 값을 가질 수 있다index 0 length() -1 .∼

public boolean endsWith(String suffix)

public int 문자가 처음 매치 되는 곳의 값을 리턴 한indexOf(char ch) - ch index

다.

public int 문자가 맨 나중에 매치 되는 곳의 값을lastIndexOf(char ch) - ch index

리턴 한다.

public int 문자열의 길이를 리턴 한다length(char ch) - .

public String 문자를 문자로 변환해서replace(char old, char new) - old new String

클래스를 리턴 한다.

public String 부터 끝까지 서브 스트링을 리턴substring(int beginIndex) - beginIndex

한다.

public String 부분substring(int beginIndex, int endIndex) - beginIndex endIndex∼

의 서브 스트링을 리턴 한다.

public String 문자열을 소문자로 변환한 클래스를 리턴 한다toLowerCase() - String .

public String 문자열을 대문자로 변환한 클래스를 리턴 한다toUpperCase() .- String .

public String 클래스에서 값 이하의 화이트 문자를 제거한trim() - String ' u0020'\

클래스를 리턴 한다String .

다음은 클래스를 사용하는 간략한 예제 프로그램이다String .

Page 110: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 110 -

Page 111: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 111 -

3.11.5 클래스Vector

클래스는 동적으로 크기가 변하는 일종의 배열 로 볼 수 있다 일반 배열은 크기Vector (?) .

가 고정되있는 것에 비해 는 크기가 동적이기 때문에 크기가 확정되지 않은 배열을Vector

사용하는 경우에 편리하다 는 다음과 같은 세 개의 생성자를 가지고 있다. Vector . Vector

클래스는 패키지에 속해있다java.util .

public 빈 벡터를 생성한다Vector() - .

public 초기 벡터의 크기를 로 만든다Vector(int initialCapacity) - initialCapacity .

public

초기 벡터의 크기를Vector(int initialCapacity, int capacityIncrement) -

로 만들고 부족할 때마다 만큼씩 벡터 크기가initialCapacity , capacityIncrement

증가한다.

클래스는 다음과 같은 유용한 메소드들을 가지고 있다Vector .

public void 를 위치에 추가한다add(int index, Object element) - element index .

public void 를 맨 끝 위치에 추가한다addElement(Object element) - element .

public void 위치의 를 삭제한다remove(int index) - index element .

public void 벡터에서처음매칭되는 를삭제한다removeEle,ent(Object element) - element .public Object 번째의 를리턴한다elementAt(int index) - index element .public int 현재 벡터에 있는 의 갯수를 리턴 한다size() - element .

다음은 벡터 클래스를 사용하는 예제 프로그램이다.

Page 112: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 112 -

Page 113: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 113 -

3.11.6 클래스StringTokenizer

클래스는 문자열을 개별적인 토큰으로 분리하는 방법을 제공한다StringTokenizer .

클래스는 다음과 같은 생성자를 가지고있다 클래스는StringTokenizer . StringTokenizer

패키지에 속해있다java.util .

public 문자열 을 기본적인 구별자 만StringTokenizer(String str) - str (" t n r ")\ \ \ \

을 이용해서 토큰을 구별하기 위한 생성자이다.

public 문자열 을 구별자 를 이용StringTokenizer(String str, String delim) - str (delim)

해서 토큰을 구별하기 위한 생성자이다.

public StringTokenizer(String str, String delim)

public 문자열 을StringTokenizer(String str, String delim, boolean returnToken)- str

구별자 을 이용해서 토큰을 구별하고 구별자를 토큰과 마찬가지고(delim) ,

메소드에서 리턴 할 것인지 여부를 값으로 기술하는nextToken() returnToken

생성자이다.

StringTokenizer 클래스는 다음과 같은 유용한 메소드들을 가지고 있다.

public boolean 토큰이 더 이상 있는지 여부를 알아본다hasMoreTokens() - .

public String 다음 토큰을 리턴 한다nextToken() - .

public String 새로운 구별자 를 이용해서 다음 토nextToken(String delim) - (delim)

큰을 리턴 한다.

public int 토큰의 갯수를 리턴 한다countTokens() - .

다음은 의 토큰을 분리해내는 프로그램 예제이다 에서 분리자는URL . URL ':', '/', '.', ' '∼

등이 있을 수 있다 를 이용하면 쉽게 토큰들을 분리해 낼 수 있다. StringTokenizer .

Page 114: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 114 -

제 장4 . 프로그래밍AWT

4.1 의 각 컴포넌트 알아보기AWT

프레임(Frame)

Frame f = new Frame(String titleName);

setSize(int width, int height);

setVisible(true);

Page 115: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 115 -

라벨(Label)

라벨은 단순히 문자열을 나타내는 컴포넌트이다.

Label label = new Label();

Label label = new Label(String text);

Label label = new Label(String text, int alignment);

Page 116: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 116 -

버튼(Button)

마우스로 클릭해서 작동시킬 수 있는 것을 버튼이라고 한다.

Button b = new Button("OK");

Page 117: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 117 -

체크박스 버튼(Checkbox Button)

마우스 클릭에 의해 선택 비선택이 토글 되는 버튼을 체크박스버튼 이라고 한다/ .

Checkbox one = new Checkbox();

Checkbox one = new Checkbox(String)

Checkbox one = new Checkbox(String, boolea);

Checkbox one = new Checkbox(String, CheckboxGroup, boolean);

getLabel();

setLabel(String);

getState();

setStateboolean);

Page 118: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 118 -

라디오 버튼(Radio Button)

체크박스버튼은 클래스와 사용될 때 라디오 버튼으로 사용된다CheckboxGroup .

체크박스버튼은 개별적으로 선택 할 수 있는 버튼인데 비해 라디오 버튼은 체크박스그룹,

내에서 한 버튼만 선택될 수 있다.

Checkbox one = new Checkbox(String, CheckboxGroup, boolean);

Page 119: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 119 -

선택버튼(Choice Button)

선택버튼은 마우스로 클릭하면 선택할 수 있는 내용들이 나오는 형태의 버튼이다.

Choice choice = new Choice();

addItem(String);

getItemCount()

getItem(int);

remove(int);

insert(String, int);

Page 120: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 120 -

리스트(List)

여러 개의 항목들 중에서 하나 혹은 여러 개를 선택할 수 있는 것을 리스트라고 한다.

List list = new List();

List list = new List(int rows);

List list = new List(int rows, boolean multipleMode);

addItem(String item);

remove(int index);

Page 121: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 121 -

텍스트영역(TextArea)

텍스트영역은 여러 줄에 걸쳐 문서를 작성할 수 있는 컴포넌트이다.

TextArea text = new TextArea();

TextArea text = new TextArea(String text);

TextArea text = new TextArea(int rows, int columns);

TextArea text = new TextArea(String text, int rows, int columns);

append(String);

setText(String);

getText();

Page 122: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 122 -

텍스트 필드(TextField)

텍스트필드는 한 줄만 쓸 수 있는 텍스트영역이다.

TextField text = new TextField();

TextField text = new TextField(int columns);

TextField text = new TextField(String text);

TextField text = new TextField(String text, int columns);

텍스트필드의 각 생성자는 한 줄만 사용할 수 있다는 것을 제의하고는 텍스트영역과 동일하

다.

setEchoChar(char);

Page 123: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 123 -

패널(Panel)

패널은 다른 컴포넌트를 포함할 수 있는 컨테이너이다 다른 컨테이너에 원하는 형태로 컴.

포넌트를 붙이기 위해서 패널을 이용한다 보통 패널은 화면에 보이지 않는다. .

Page 124: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 124 -

스크롤 팬(ScrollPane)

스크롤 팬은 윈도우에서 스크롤을 기본적으로 가지고 있는 자바 컴포넌트이다.

ScrollPane sp = new ScrollPane();

주의할 점은 스크롤 팬은 하나의 컴포넌트만 자식으로 가질 수 있다는 것이다.

Page 125: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 125 -

팝업 메뉴(Popup Menu)

평소에는 안보이다가 마우스를 누르면 나타나는 메뉴를 팝업 메뉴라고 한다.

PopupMenu popup = new PopupMenu(String label);

Page 126: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 126 -

컴포넌트 붙이기4.2 AWT

에서는 각 각의 컴포넌트를 알아보았다 에서는 각 컴포넌트들을 조합해서 전체4.1 . 4.2 GUI

를 만드는 방법을 알아보자 컴포넌트들은 컨테이너 라는 컴포넌트에 붙일. AWT (container)

수 있다 컨테이너의 예로는 프레임 패널 윈도우 애플릿 등이 있다 컨테이너는 다. , (panel), , .

른 컨테이너나 컴포넌트를 포함할 수 있다 컨테이너가 다른 컴포넌트를 포함할 때 라. add()

는 메소드를 사용한다 메소드를 이용해서 다른 컴포넌트를 컨테이너에 붙이는 것이다.add() .

4.2.1 레이아웃 매니저

화면에 구성 요소들의 크기와 위치는 가지 요소에 의해서 결정된다AWT 2 .

요소들이 컨테이너에 추가되는 순서1. AWT

사용되는 레이아웃 매니저이다2. .

자바에서는* "FlowLayout", "GridLayout", "BorderLayout", "CardLayout", "GridBagLayout"

의 기본적인 가지 레이아웃을 제공한다5 .

Page 127: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 127 -

플로우 레이아웃(FlowLayout)

플로우 레이아웃은 컨테이너에 컴포넌트들을 가로나 세로방향의 줄 단위로 늘어놓을 때 적

절하게 사용된다.

setLayout(new FlowLayout());

setLayout(new FlowLayout(FlowLayout.LEFT));

setLayout(new FIowLayout(FIowLayout.RIGHT, 5, 10));

Page 128: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 128 -

예제FlowLayout

Page 129: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 129 -

보더 레이아웃(Border Layout)

보더 레이아웃 컨테이너에 컴포넌트들의 위치를 동 서 남 북 중앙 중에서 하나를 지정해서“ / / / / ”

사용할 수 있다 모든 가장 자리의 요소들은 필요한 크기만큼 자리를 차지하고 중앙에 있는. ,

요소는 남은 여백을 사용한다.

setLayout(new BorderLayout());

setLayout(new BorderLayout(5, 10));

add("North", new TextField("Name", 30));

주의 :

보더 레이아웃을 이용해서 컴포넌트를 붙이는 경우에 의 위North/South/West/East/Center

치를 정확히 기술해주어야 한다 철자가 틀리거나 대소문자가 맞지 않는 경우에는 컴포넌트.

가 화면에 안보여 질 수도 있다.

Page 130: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 130 -

보더 레이아웃 예제

Page 131: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 131 -

그리드 레이아웃(Grid Layout)

그리드 레이아웃은 컴포넌트들을 행렬식으로 행과 열의 수에 맞게 배치할 때 사용된다 컴.

포넌트들의 위치는 맨 윗줄부터 시작해서 왼쪽에서 오른쪽으로 움직이며 각 줄을 이동한다.

setLayout(new GridLayout(3,4));

setLayout(new GridLayout(3,4,10,15));

Page 132: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 132 -

그리드 레이아웃 예제

Page 133: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 133 -

카드 레이아웃(CardLayout)

카드 레이아웃은 다음과 같은 생성자를 이용해서 만든다1. .

CardLayout card = new CardLayout();

컨테이너에 메소드를 이용해서 카드 레이아웃 매니저를 등록한다2. setLayout() .

setLayout(card);

카드 레이아웃을 등록한 다음에 여러 장의 카드를 위해서 패널을 만든다3. , .

Panel p1 = new Panel();

Panel p2 = new Panel();

만들어진 여러 장의 패널을 컨테이너에 메소드를 이용해서 붙인다4. add() .

add("First", p1);

는 카드의 이름 부분이다 따라서 패널은 라는 이름으로 등록된 것이다"First" . p1 "First" .

원하는 카드를 보여주기 위해서는 카드 레이아웃의 메소드를 이용한다5. show() .

card.show(this, "first");

메소드는 과 같은 형태의 아규먼트를 갖는다show() show(Container parent, String name) .

는 카드 레이아웃이 포함돼있는 컨테이너를 의미하고 은 보여줄 카드의 이름을parent , name

의미한다.

카드레이아웃 예제

Page 134: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 134 -

Page 135: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 135 -

Page 136: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 136 -

메뉴 만들기4.2

프레임에는 하나의 메뉴바가 있고 프레임에 메뉴바를 붙일 때는 메소드를 이, setMenuBar()

용한다.

Page 137: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 137 -

4.3 다이얼로그

다이얼로그(Dialog)

다이얼로그는 프레임과 유사한 형태의 윈도우이다 다이얼로그는 주로 오류 경고 확인 메시. / /

지를 보여주기 위해서 사용된다.

Dialog d = new Dialog(Frame);

Dialog d = new Dialog(Frame, boolean);

Dialog d = new Dialog(Frame, String);

Dialog d = new Dialog(Frame, String, boolean);

Page 138: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 138 -

파일 다이얼로그(FileDialog)

다이얼로그가 단순히 메시지를 보여주는데 사용되는 반면 파일 다이얼로그는 파일을 읽거나

저장하기 위해서 원하는 파일을 선택하는데 사용된다.

FileDialog fd = new FileDialog(Frame);FileDialog fd = new FileDialog(Frame, String);FileDialog fd = new FileDialog(Frame, String, int);

Page 139: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 139 -

제 장 자바 애플릿 프로그래밍5 .

간단한 자바 애플릿5.1

애플릿 소개5.1.1

일반 명령어상이 아닌 웹브라우저 내에서 수행되는 자바 프로그램을 자바 애플릿이라 한다.

일반 자바 어플리케이션은 함수부터 수행되는데 비해 자바 애플릿은 함수가main() , main()

없다 애플릿 프로그램을 작성하기 위해서는 클래스로부터 상속을 받아야한다 애플. Applet .

릿 프로그램을 작성하고 테스트하기 위해서는 웹브라우저 대신에 애플릿뷰어(appletviewer)

를 이용하는 것이 바람직하다.

자바 애플릿에는

init()

start()

paint()

stop()

destroy()

update()

등의 기본적인 함수가 정의되어있다 애플릿 프로그램을 개발하는 프로그래머는 이 함수들.

을 오버라이드해서 사용하게 된다 애플릿 클래스는 항상 으로 선언되어야 한다. public .

Page 140: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 140 -

Page 141: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 141 -

자바 애플릿을 웹 홈페이지에 등록하기ㆍ

에서 태그는 웹에서 자바 애플릿을 등록하기 위한 태그이다 실제 애플릿은HTML applet .

파일에 저장되어 있고 태그는 애플릿 클래스 파일을 기술해준다.class , applet .

태그는 다음과 같은 어트리뷰트를 가질 수 있다applet .

<appletcode = classfiIe.classcodebase = directoryarchive = archivefile.zipalign = aligndirectionname = appletnamevspace = 20hspace = 30width = 200height = 100 >

</applet>

태그에서 어트리뷰트는 항상 존재해야 한다 각 어트리뷰트들을applet code, width, height .

간단히 살펴보면,

컴파일된 자바 애플릿 클래스가 저장된 파일 이름이다code - .

자바 클래스 파일들이 존재하는 디렉토리 이름이다 는 파codebase - . codebase HTML

일과 자바 클래스 파일이 다른 디렉토리에 저장되어 있는 경우에 사용된다.

자바의 파일들을 이나 파일로 묶어서 파일의 다운로드 시간을 줄archive - .class zip jar

이기 위해 사용된다 이상에서 지원한다. netscape 3.0 .

애플릿 정렬 위치를 결정하는데 사용된다align - .

애플릿의 이름을 지정한다 애플릿 이름은 한 웹 페이지에서 여러 개의 애플릿이name - .

있을 때 애플릿간에 통신을 하는데 사용된다.

애플릿 주위에서 세로 방향 마진 단위 픽셀vspace - ( : )

애플릿 주위에서 가로 방향 마진 단위 픽셀hspace - ( : )

애플릿의 가로 방향 크기 단위 픽셀width - ( : )

애플릿의 세로 방향 크기 단위 픽셀height - ( : )

Page 142: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 142 -

클래스의 메소드들Graphics drawXXX0

drawString(String msg, int x, int y);

drawLine(int x1, int yl, int x2, int y2);

drawRect(int x, int y, int w, int h);

drawOval(int x, int y, int w, int h);

drawRoundRect(int x, int y, int w, int h, int rw int rh);

drawArc(int x, int y, int w, int h, int a, int b);

Page 143: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 143 -

애플릿 메소드들5.1.2

함수init()

함수는 웹브라우저가 자바 애플릿이 있는 홈페이지를 처음 방문했을 때 애플릿이 생init()

성되고 웹브라우저에 로드될 때 자동적으로 수행된다 보통 함수 내에서는 애플릿에서. init()

사용되는 자료들을 초기화하는데 이용된다.

함수start()

함수는 애플릿이 다시 살아날 때 자동적으로 호출된다 예를 들면 웹브라우저가 아이start() . ,

콘에서 원래 상태로 돌아올 때 혹은 웹브라우저가 다른 페이지로 이동했다가 다시 애플릿,

이 있는 홈페이지로 돌아왔을 때 함수는 자동적으로 호출된다 함수를 이용해start() . start()

서 오디오 파일을 플레이 하거나 애니메이션을 시작시킬 수 있다(play) , .

함수stop()

함수는 함수와 짝을 이루어 사용된다 함수는 웹브라우저가 아이콘으로 되stop() start() . stop()

거나 다른 홈페이지로 이동할 때 자동적으로 시작된다 함수를 이용해서 오디오 파일, . stop()

연주나 애니메이션을 중지시킬 수 있다 함수가 호출된다고 해서 애플릿이 죽는 것은. stop()

아니다.

함수paint(Graphics g)

함수는 애플릿의 그림이 다시 그려져야 된다고 판단될 때 자동적으로 호출된다 예를paint() .

들면 애플릿이 처음 시작될 때 애플릿의 크기가 변경될 때 애플릿이 다른 윈도우에 가려, , ,

졌다가 다시 보여질 때 함수는 호출된다 함수 내에서 타입의 아규paint() . paint() Graphics

먼트를 이용해서 그림을 그리게 된다 그래픽스 클래스는 그림을 그리는데 필요한 정보 색. ( ,

폰트 종류 폰트 크기 등 를 가지고 있다, ) .

함수update(Graphics g)

함수는 애플릿에 그려진 그림을 모두 지우고 새로이 함수를 호출한다 그림이update() paint() .

많은 경우에 그림을 지우고 새로 그리면 플리커링이 발생해서 보기가 안 좋은 경우에는

함수를 오버로드해서 플리커링을 줄일 수 있다update() .

함수repaint()

프로그래머가 그림을 다시 그려야 할 필요성이 있는 경우에 함수를 호출할 수 있repaint()

다 함수를 호출하면 는 다시 를 호출한다. repaint() repaint() update() .

Page 144: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 144 -

함수destroy()

웹브라우저가 종료될 때 애플릿의 함수가 호출된다 따라서 웹브라우저가 종료되기destroy() .

전까지는 애플릿이 종료되지 않는다 프로그래머는 함수를 오버라이드해서 애플릿. destroy()

이 적절하게 종료될 수 있도록 종료에 필요한 코드를 넣을 수 있다,

Page 145: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 145 -

에서 애플릿으로 파라메터 전달하기HTML

애플릿이 파일로부터 값을 전달받기 위해서는 애플릿의 메소드를HTML get Parameter()

이용한다 에서는 파라메터를 전달하기 위해 변수이름 변수. HTML param name=“ ” value= “〈

값 문장을 기술한다 다음 파일은 로부터 변수의 값을 넘겨” . HelloParam.java HTML msg〉

받는 애플릿 프로그램이다 변수의 값을 넘겨받기 위해 형태로. msg get Parameter("msg")

함수를 호출했다 자바 프로그램 내에서 사용되는 변수의 이름과 의. HTML param〈

에서 부분에 사용된 변수 이름이 동일한 것에 주의하라name=..> name .

Page 146: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 146 -

이미지 그리기5.2

그래픽 컨텍스트는 그림 파일을 화면에 그려줄 수 있다gif/jpg .

drawImage(Image im, int x, int y, ImageObserver ob);

를 호출하기 위해서는 와 클래스가 필요하다drawImage Image ImageObserver .

클래스를 얻기 위해서는 함수를 이용한다Image getImage .

getImage(URL url, String file_name);

일반적으로 는 애플릿의 함수에서 수행되고 이미지를 화면에 출력하는 것은getImage init() ,

함수에서 수행된다paint() .

Page 147: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 147 -

오디오 파일5.3

자바 언어는 확장자가 파일인 오디오 클립을 플레이 할 수 있는 방법을 제공한다.au (play) .

오디오 클립에 관련된 자바 클래스는 클래스이다 오디오 클립은 플레java.applet.AudioClip .

이하기 위해서는 플레이를 위한 컴퓨터 하드웨어가 필요하다 파일이나 형태의 파. .wav .avi

일은 플레이하기 위해서는 클래스를 이용하는 것이 바람직하JMF(Java Media Framework)

다.

오디오 클립을 플레이하는 가장 간단한 방법은 애플릿의 함수를 이용하는 것이다play() .

play(URL url, String file_name);

다음은 간단한 오디오 클립을 플레이하는 예제이다.

이미지와 마찬가지로 오디오 클립을 로드한 다음에 다시 사용하기 위해서는 클Audio Clip

래스를 만들어야 한다.

getAudioClip(URL url, String file_name);

클래스를 플레이하기 위해서는 함수를 호출하고 반복적으로 플레이하기Audio Clip play() ,

위해서는 함수를 호출한다 플레이를 중지시키기 위해서는 함수를 호출한다loop() . stop() .

Page 148: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 148 -

Page 149: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 149 -

자바 애니메이션5.4

자바 애니메이션은 보통 여러 장의 그림은 일정시간 간격을 두고 화면에 디스플레이 시켜서

그림이 움직이는 듯하게 보여주는 방식을 취한다 여러 장의 그림을 이용하기 때문에 한 그.

림에서 다른 그림으로 이동이 빨라야 자연스럽게 보인다 그림을 화면에 빠르게 디스플레이.

시키기 위해서는 더블 버퍼링 기법을 사용한다 더블 버퍼링 기법은 이미지를 메모리에 먼.

저 그린 다음에 화면에 출력하는 방법이다.

우선 애플릿을 이용해서 디지털 시계를 작성해보자 시계 프로그램은 매초마다 시간을 그래.

픽스 클래스의 메소드를 이용해서 새로 그려주면 간단하게 작성할 수 있다drawString() .

다음 클래스는 쓰레드를 사용해서 시간을 그려준다 쓰레드에 관한 자세한 내용은FClock .

쓰레드 프로그래밍 참조하기 바란다“ ” .

Page 150: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 150 -

클래스Clock

프로그램을 실행시키면 깜빡임이 많이 일어나는 것을 볼 수 있다 이것은 매초마다FClock .

새로 그림을 지우고 다시 그리기 때문이다 프로그램에서 발생하는 깜빡임을 제거해. FClock

보자 클래스에서는 깜빡임을 제거하기 위해 더블 버퍼링 방법을 이용하고. Clock , update()

메소드를 오버라이드 하였다.

Page 151: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 151 -

배경 있는 시계

애플릿을 조금 개량해보자 다음 예제 애플릿은 애플릿에 배경 그Clock . AnimClock Clock

림을 추가하고 시간을 나타내는 문자를 매 초당 축으로 이동시키는 프로그램이다X-Y .

애플릿도 과 마찬가지로 더블버퍼링 방법을 사용하였고 메소드AnimClock Clock , update()

를 오버라이드했다 다음은 의 소스이다. AnimClock .

Page 152: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 152 -

Page 153: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 153 -

이용Media Tracker

더블 버퍼링 이외에 애니메이션에서 중요한 다른 사항은 클래스를 사용하는MediaTracker

것이다 자바 애플릿에서 함수가 먼저 시작되고 함수가 시작되지만 함수가. init() , start() init()

끝난 다음에 함수가 수행된다고 볼 수는 없다 이것은 그림이나 자바 클래스는 비동start() .

기 적으로 로드되기 때문이다 따라서 에서 여러 장의 그림을 로드한다(asynchronous) . init()

고 해도 모든 그림이 다른 함수가 시작되기 전에 로드되지는 않는다 이러한 단점을 해결해.

주는 자바 클래스가 이다 는 모든 이미지가 로드될 때까지MediaTracker . MediaTracker wait

하도록 해준다.

위의 그림은 파일에서 애니메이션에 사용되는 까지 개AnimationTest.java Tl.gif Tl0.gif 10~

의 그림이다.

Page 154: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 154 -

Page 155: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 155 -

Page 156: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 156 -

중 코드5.5 2

자바에서는 애플릿과 어플리케이션이 있기 때문에 애플릿으로 작성한 코드를 어플리케이션

으로 변경하거나 아니면 역으로 코드를 변경하는 것은 불편한 작업이다 그래서 프로그램을. ,

작성할 때 애플릿으로도 어플리케이션으로도 사용할 수 있도록 하는 것이 중요하다 그러기.

위해서는 우선애플릿에서 상속받는 클래스를 만들고 함수를 만든다 애플릿으로 실main() .

행될 때는 함수는 수행이 안되고 어플리케이션으로 수행될 때만 이 실행된main() , main()

다 중 코드를 이용하면 애플릿을 응용프로그램으로 실행시킬 수 있지만 모든 메소드들이. 2 ,

잘 수행되는 것은 아니다 예를 들면 메소드는 애플릿에서는 잘 수행되. , getDocumentBase()

지만 응용프로그램에서는 원하는 형태의 결과를 리턴하지 못한다 이러한 약간의 차이점들.

을 프로그래머는 주의 깊게 고려해주어야 한다.

Page 157: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 157 -

자바와 자바 스크립트5.7

자바스크립트에서 자바 애플릿호출5.7.1

Page 158: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 158 -

Page 159: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 159 -

다음은 애플릿을 위한 파일이다 파일에서는 애플릿을 제JSApplet HTML . JSApplet .html

어하기 위한 자바스크립트 함수와 태그를 가지고 있다<applet> .

Page 160: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 160 -

자바 애플릿에서 자바스크립트 호출5.7.2

를 사용하는 경우JSObject

는 넷스케입 이상과 익스플로러 이상에서 지원된다 를 사용하JSObject 3.0 MS 4.0 . JSObject

기 위해서는 다음 단계를 거쳐야된다.

를 설치한다1. JSObject .

는 에 들어있다 파일을 적당한 디렉토리에 푼다JSObject java40.jar . java40.jar .

% jar xvf java40.jar

애플릿 프로그램에 를 한다2. JSObject import .

import netscape.javascript.JSObject;

자바 애플릿에서 현재 창에 대한 자바스크립 레퍼런스를 얻는다3. .

JSObject window = JSObject.getWindow(this);

의 메소드를 이용해서원하는자바스크립프라퍼티를읽어올수있다4. JSObject getMember() .

JSObject document = (JSObject)window.getMember("document");

String cookies = (String)docurnent.cookie;

JSObject form = (JSObject) document.getMember("form_name");

JSObject element = (JSObject) document.getMember("element_name");

의 메소드를 이용해서 원하는 자바스크립 프라퍼티의 값을 설정할 수5. JSObject setMember()

있다.

document.setMember("bgColor", "red");

의 메소드를 이용해서 자바스크립의 함수를 호출할 수 있다6. JSObject cal1() .

String message = {"alert message !!"};

window.cal1("aIert", message);

window.eval("alert('alert message !!')");

의 태그에 를 설정해주어야 한다7. HTML applet MAYSCRIPT .

applet code=.. width=.. height=.. MAYSCRIPT〈

Page 161: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 161 -

/applet〈 〉

Page 162: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 162 -

Page 163: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 163 -

색 폰트 커서5.8 / /

색5.8.1

클래스는 프로그래머가 많이 사용하는 색은 상수로 만들어 놓고 많이 사용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 Co1or(int r, int g, int b);

는 사이의 값을 갖는다r, g, b 0 255 .~

new Co1or(float r, float g, float b)

는 사이의 값을 갖는다r, g, b 0.0 1.0 .~

폰트5.8.2

자바에서는 모든 시스템에서 사용될 만한 대표적인 폰트를 자바 독자적인 이름을 붙여서 사

용하고 있다 폰트는 다음과 같은 생성자를 이용해서 만들어 사용할 수 있다. .

new Font(String fontname, int style, int size);

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

Page 164: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 164 -

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

Helvetica adobe-helvetica Aria1

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 Aria1

클래스상수Font 스타일

Font.PLAIN 일반문자

Font.ITALIC 이탤릭체

Font.BOLD 볼드체

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

Page 165: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 165 -

마우스 커서5.8.3

에서 마우스 커서는 프레임에서 메소드를 이용해서 변JDK l.0 setCursor(int cursor Type)

경할 수 있다.

다음은 자바에서 지원하는 마우스 커서들이다.

다음 프로그램은 애플릿에서 마우스 커서를 변경하는 예제 프로그램이다 또한 애플릿에서.

메뉴를 붙이는 방법 및 메뉴가 웹브라우저에서 어떻게 보이는가를 보여준다.

Page 166: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 166 -

Page 167: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 167 -

애플릿을 이용한 홈페이지 이동5.9

클래스는 웹의 를 표현한다 클래스와 함URL Uniform Resource Locator . URL Connection

께 이 클래스는 프로토콜을 통한 웹이나 에 존재하는 자원에 접근할 수HTTP file:// URL

있는 방법을 제공한다.

의 일반적인 형태는 다음과 같다URL .

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

프로토콜에는 다음과 같은 것이 있다.

file 하드디스크에있는파일:ftp 서버에연결: FTPhttp 웹서버에연결:gopher 서버에연결: gophernews 뉴스그룹에연결: usenettelnet 텔넷서비스를이용:wais 서버에연결: wais

Page 168: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 168 -

Page 169: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 169 -

Page 170: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 170 -

제 장 이벤트 프로그래밍6 .

모델6.1 Delegation (JDK 1.1)

모델은 윈도우 시스템이나 에서 많이 사용되었지만 객체지향 프로그Hierarchal X JDK l.0 ,

래밍에는 조금 맞지 않는 부분들이 있었다 이벤트가 상위 컴포넌트로 전달되기 때문에 특.

정 컴포넌트를 이용해서 객체로 만들어서 재사용하기가 어렵고 이벤트 처리가 복잡한 경우,

에는 원하지 않는 이벤트가 처리되거나 제대로 전달이 안 되어서 처리가 안 되는 경우도 발

생한다.

이러한 단점을 해결하기 위해서 에서는 모델을 채용하고 있다JDK 1.1 Delegation .

모델에서는 한 컴포넌트에는 하나의 이벤트 처리 루틴을 할당해주는 방식이다Delegation .

따라서 이벤트가 전달되지 않고 한 클래스 내에서 모든 처리가 이루어지기 때문에 재사용,

성이 높아진다.

현재 모델과 모델을 모두 사용할 수 있지만 동시에 두 모델을 사용Hierarchal Delegation ,

할 수는 없다.

다음 테이블은 각 컴포넌트에서 발생할 수 있는 이벤트의 종류를 보여준다.

Page 171: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 171 -

AWT컴포넌트

발생할수있는이벤트

action adjustment component container focus item key mouse mousemotion text window

Button X X X X X X

Canvas X X X X X

Checkbox X X X X X X

CheckboxMenuItem * X

choice X X X X X X

component X X X X X

Container X X X X X X

Dialog X X X X X X X

Frame X X X X X X X

Label X X X X X

List X X X X X X X

MenuItem X

Panel X X X X X X

Scrollbar X X X X X X

ScrollPane X X X X X X

TextArea X X X X X X

TextComponent X X X X X X

TextField X X X X X X X

Window X X X X X X X

Page 172: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 172 -

인터페이스와 인터페이스에 선언된 메소들Listener

Listener Interface Adapter Class Methods

ActionListener none actionPerformed(ActionEvent)

AdjustmentListener none adjustmentValueChanged(AdjustmentEvent)

componentListener componentAdapter

ComponentHidden(ComponentEvent)ComponentMoved(ComponentEvent)ComponentResized(ComponentEvent)ComponentShown(ComponentEvent)

containerListener comtainerAdapter componentAdded(ContainerEvent)componentRemoved(ContainerEvent)

FocusListener FocusAdapter focusGained(FocusEvent)focusLost (FocusEvent)

ItemListener none itemStateChanged(ItemEvent)

KeyListener KeyAdapterkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent )

MouseListener MouseAdapter

mouseClicked(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mousePressed(MouseEvent)mouseReleased(MouseEvent)

MouseMotionListener MouseMotionAdapter mouseDragged(MouseEvent)mouseMoved(MouseEvent)

TextListener none textValueChanged(TextEvent)

windowListener windowAdapter

windowActivated(WindowEvent)windowClosed(WindowEvent)windwClosing(WindowEvent)windowDeactivated(WindowEvent)windowDeiconified(WindowEvent)windowIconified(WindowEvent)windowOpened(WindowEvent)

Page 173: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 173 -

이벤트Action Event

버튼

버튼을 마우스로 클릭하는 경우에 이벤트가 발생한다ActionEvent .

Page 174: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 174 -

Page 175: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 175 -

텍스트 필드

Page 176: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 176 -

이벤트ItemEvent

체크박스

체크박스를 선택하는 경우에 모델에서는 이벤트가 발생한다Delegation ItemEvent .

Page 177: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 177 -

선택 버튼

선택버튼의 아이템을 선택하는 경우에 이벤트가 발생한다Item Event .

Page 178: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 178 -

라디오버튼

라디오 버튼을 선택하는 경우에 이벤트가 발생한다ItemEvent ,

Page 179: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 179 -

리스트

리스트의 아이템을 더블 클릭하는 경우에는 가 한번 클릭하는 경우에는ActionEvent ,

이벤트가 발생한다ItemEvent .

Page 180: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 180 -

WindowEvent

이벤트는 다이얼로그 프레임 윈도우에서 발생할 수 있다WindowEvent / / .

Page 181: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 181 -

이벤트MouseEvent

Page 182: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 182 -

연습문제 계산기 작성:

이벤트 모델을 이용해서 다음과 같은 형태의 계산기 애플릿을 작성하라JDK l.0 .

명세서 :

수식 계산을 위한 연산식의 문법은 다음처럼 표현할 수 있다

E -> E + T | E - T | T

T -> T * T / F| F

F - digit | ( E )〉

이 문법에 의하면 연산식 은 와 연산자로 구분되는 여러 개의 로 이루어지고 다(E) “+” “-” T ,

시 그 는 와 연산자로 구분되는 여러 개의 들로 이루어진다 여기서 주의할 점T “*” “ / ” F .

은 괄호로 둘러싸인 수식은 모두 라는 것이다 이것은 괄호를 이용해서 얼마든지 중첩되F .

는 수식을 계속해서 만들 수 있다는 뜻이 된다 클래스는 수식 을 문법에 따. expression (E)

라 파싱하고 결과를 계산하는 클래스이다 클래스는 입력된 문자열을 토큰으로 분. scanner

리해서 클래스가 필요로 할 때 토큰을 넘겨주는 역할을 하는 클래스이다expression .

Page 183: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 183 -

연습문제 작성: GEditor

이벤트 모델을 이용해서 다음과 같은 형태의 그래픽 에디터를 작성하라JDK 1.1 .

명세서 :

그래픽 에디터에서 그림을 핸들링하기 위한 기본적인 메소드들을 선언하는 인GDrawable :

터페이스이다.

그래픽 에디터에서 가장 많이 사용되는 그림 클래스이다DrwableRectangle : .

클래스로부터 상속 받은 버튼Bbutton, Blabel, BtextArea, BtextField : DrawableRectangle ,

라벨 텍스트 영역 텍스트 필드 모양을 그려주기 위한 클래스들이다 그림, , . GEditorCanvas :

을 그려주는 캔버스로부터 상속 받은 클래스이다.

각 클래스를 모아 작성한 그래픽 에디터 클래스이다GEditor : .

Page 184: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 184 -

제 장 예외처리7 .

심각하지 않은 에러를 예외 혹은 예외상황 이라고 한다 심각하지 않은 간단한 오(exception) .

류가 발생했을 때 프로그램을 종료한다면 이제까지 수행된 작업을 처음부터 다시 시작해야

한다는 부담감이 있다 그래서 간단한 에러 예외 가 발생하면 이 오류를 바로 잡아서 계속. ( ) ,

수행할 수 있으면 바람직할 것이다 이렇게 예외상황이 발생했을 매 이것을 처리하는 것을. ,

예외처리라고 한다.

언어에서 예외처리7.1 C

우선적으로 간단하게 언어에서 일반적으로 사용하는 예외 처리 방법을 알아보자 언어C . C

에서는 보통 함수의 리턴 값으로 에러가 발생했는지 여부를 알아본다 일반 함수나 시스템.

콜은 음수값을 혹은 이을 리턴해서 에러가 발생한 것을 알려준다 또한 필요한 경우는.

에 값을 할당해서 에러의 타입을 알리기도 한다errno .

설명

함수는 아규먼트로 를 받아서 을 계산하는 간단한 함수이다 그러나divide() x 100/(x*(x-1)) . ,

아규먼트인 가 이나 값이 넘어 온다면 안 될 것이다 이나 이 아규먼트로 넘어오는 경x 0 1 . 0 1

우에 잘못됐다는 것을 알리기 위해 번 줄에서 음수값을 리턴 했다20, 22 .

Page 185: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 185 -

Page 186: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 186 -

자바에서 예외처리7.2

자바에서 예외타입을 만들고 처리하는 과정은 자바를 처음 공부하는 사람에게는 조금 혼동

스러울지 모르겠지만 조금만 사용해본다면 아주 쉽고 편리하다는 것을 알 수 있을 것이다, .

자바에서 예외 타입을 만들고 처리하는 과정은 다음의 세 과정으로 되어 있다.

클래스를 정의한다1. Exception .

예외가발생할수있는함수 에서예외가발생할조건을만족하면 클래스를2. A Exception throw

한다.

함수 를 호출하는함수 는 문을이용해서예외가발생하는경우에문제점을해결3. A B try-catch

한다.

예외 클래스 만들기7.2.1

자바에서 예외 는 클래스로 표현된다 따라서 자바에서 모든 예외 타입(Exception) .

은 클래스나 이것의 서브클래스로부터 상속을 받아야한다 일반(exception type) Throwable .

적으로 새로운 예외 타입은 이 아닌 클래스로부터 상속을 받아서 만든Throwable Exception

다 자바 예외는 주로 이다 은 컴파일러가 메소드가 선. checked exception . checked exception

언한 예외를 하는지를 체크하는 것이다 이 발생할 수 있는 경우에throw . checked exception

는 항상 문을 사용해야 한다 를 사용하지 않는 경우에는 컴파일 시에 에try-catch . try-catch

러를 출력한다 이나 로부터 상속받는 표준 런타임 예외와 에러는. Runtime Exception Error

이라 한다 예외타입은 클래스이기 때문에 생성자 멤버 필드 메소드unchecked exception . , ,

등을 가질 수 있다.

다음은 으로 나누는 경우에 발생하는 예외를 이라는 이름으로 클래스0 DivideZeroException.

로 정의하는 예제이다.

설명

1 public class DivideZeroException extends Exception {

예외 클래스를 만들기 위해서는 클래스로부터 상속받아서 작성한다Exception .

Page 187: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 187 -

7.2.2 throws

자바는 메소드에서 발생할 수 있는 을 메소드 이름 뒤에 선언해주어야 한checked exception

다 자바의 메소드에서 여러 개의 을 생성한다면 각 예외타입을 컴마로. checked exception ,

구분해서 선언 해 줄 수 있다.

public int doSomething(int x) throws Exception l, Exception 2 {

……

}

과 로부터 상속받은 표준 런타임 예외와 에러는 모든 메소드에서Runtime Exception Error

발생할 수 있기 때문에 따로 문에 선언하지 않는다 스태틱 으로 초기화하는throws . (static)

블록에서는 을 생성시킬 수 없지만 문을 이용할 수는 있다checked exception try-catch .

7.2.3 throw

예외는 문장을 이용해서 발생시킨다 문장은 예외타입의 객체를 갖는다throw . throw . throw

와 를 혼동하지 않기를 바란다throws .

throw new Exception 1();

다음 클래스는 라는 메소드를 가지고 있다 그런데 는 아규Divider divide() . divide() apthem

먼트를 이나 로 받는 경우에는 예외가 발생한다 이처럼 메소드가 예외를 발생시0 1 . divide()

킬 수 있다는 것을 문을 이용해서 메소드에 기술할 수 있다 메소드의 내부에서 실throws .

제로 예외가 발생하는 경우에는 문장을 이용한다throw .

설명

Page 188: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 188 -

번째 줄에서 함수는 예외를 발생할 수 있다는 것을7 divide() DivideZeroException throws

문을 이용해서 선언했다 번째 줄에서 의 값이 과 인 경우에. 10, 12 x 0 1 DivideZeroException

예외를 문을 이용해서 발생시키고 있다 문이 수행되면 컨트롤은 메throw . throw divide()

소드를 호출하는 부분의 의 문으로 이동된다 따라서 다음의try-catch catch . TestException

클래스의 번째 줄이 수행되다가 예외 상황이 발생해서 문이 실행돼서11 (throw )

의 번째 줄로 제어가 이동된다TestException 13 .

Page 189: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 189 -

7.2.4 try-catch-finally

예외가 발생할 수 있는 문장들을 문의 블록에 기술한다 문의 블록은 성공적으로 모try . try

든 문장이 수행되던가 아니면 도중에 예외가 발생해서 문으로 제어가 넘어갈 수 있, catch

다 문은 여러 개가 존재할 수 있고 예외가 발생하면 문이 선언된 순서대로 발. catch , catch

생한 예외타입과 일치하거나 그것의 슈퍼 타입인 문 블록을 하나만 수행한다 문catch . finally

은 예외 발생 여부에 관계없이 항상 수행되는 부분이다.

설명

9 try {

프로그램 내부에서 예외가 발생할 수 있기 때문에 문을 이용한다try-catch .

l2 } catch(DivideZeroExceptione) {

문에서는 원하는 타입의 예외를 잡을 수 있다catch .

13 System.out.println("error!! : " + e):

문자열 다른 타입 문자열 이 된다 즉 다른 타입이 문자열로 타입 변환이 이루어진다“ + = ” . .

예외도 마찬가지로 문자열 타입으로 변환되는데 이때 메소드가 호출된다toString() .

14 } catch(Exception ex) {

Page 190: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 190 -

이외에 다른 예외를 잡기 위해서 을 문에서 잡았다DivideZeroException Exception catch .

Page 191: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 191 -

에서 제공되는 예외7.3 JDK

자바에서 예외는 클래스로부터 상속을 받아서 작성할 수 있다 다음 그림은Exception .

클래스의 상속 관계를 보여준다Exception .

예외보다 심각한 에러는 클래스로 나타낸다 클래스는 에러를 복구할 수 없는Error . Error

심각한 경우에 발생하며 을 사용하지 않고 자바 인터프리터에 의해 메시지를 출력try-catch

하고 프로그램을 종료하게 된다 에서는 클래스로부터 상속받은 많은 예외. JDK Exception

클래스들을 제공하고있다 예외 클래스들 중에서 클래스로부터 상속받. Runtime Exception

은 클래스를 제외한 모든 클래스들은 항상 문으로 예외 상황을 잡아주어야 한다try-catch .

문을 사용하지 않는 경우에는 컴파일 시에 오류 메시지를 출력하고 컴파일이 되try-catch

지 않는다.

다음은 에서 제공되는 예외 클래스들의 예이다JDK .

ArithmeticException■으로 나누는 경우에 주로 발생하는 예외 상황이다 은0 . ArithmeticException

으로부터 상속받은 예외 클래스이다RuntimeException .

ArrayIndexOutOfBoundsException▣

배열의 크기보다 큰 원소를 접근하려고 할 때 발생되는 예외이다.

NegativeArraySizeException▣

배열의 크기가 음수로 된 경우에 발생하는 예외이다.

Page 192: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 192 -

NullPointerException▣

생성되지 않은 객체를 이용해서 객체의 멤버를 엑세스하는 경우에 발생하는 예외이다.

Page 193: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 193 -

제 장 자바 쓰레드 프로그래밍8 .

쓰레드 기초8.1

process : program in excecution

thread : a sequence of instructions to be executed.

자바 쓰레드 만드는 방법 가지2

쓰레드는 클래스로부터 상속을 받아서 만든다1. Thread .

인터페이스를 인플리멘츠해서 만든다2. Runnable .

주의 사항

쓰레드를 사용하려면 함수를 만들어야 한다 이 함수에 쓰레드가 일할 작업의1. run() . run()

내용을 기술해 놓는 것이다.

쓰레드를 만든 다음에 쓰레드를 실행시키려면 함수를 호출해주어야 한다2. start() . start()

함수를 호출하면 자동적으로 함수가 수행된다run() .

그림 단일쓰레드프로그램98. 그림 다중쓰레드프로그램99.

Page 194: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 194 -

쓰레드의 상태도

Page 195: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 195 -

인터페이스를 임플리멘츠하는 경우Runnable

그림 을 임플리멘츠한 경우 그림 클래스를 상속받는 경우101.Runnable 102 Thread

Page 196: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 196 -

쓰레드 종료

쓰레드는 함수를 마치거나 함수가 호출되면 상태로 전이된다 상태는run() , stop() Dead . Dead

쓰레드의 모든 작업이 종료된 것을 의미한다 상태의 종료된 쓰레드는 함수로. Dead start()

다시 실행시킬 수는 없다.

Page 197: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 197 -

쓰레드 잠시 중지 재시작/

다음은 와 메소드를 이용하는 예이다 메소드는 일정 시간 동안suspend() resume() . sleep()

쓰레드를 블록 시키는데 사용되고 메소드는 얼마동안 블록되야 하는지 모르는, suspend()

경우에 사용될 수 있다 메소드로 블록된 쓰레드는 메소드로 다시. suspend() resume()

상태로 돌아올 수 있다Runnable .

Page 198: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 198 -

자바 쓰레드 우선순위

쓰레드의 스케줄링은 자바 가상 머신에서 이루어진다 자바 가상 머신은 우선 순위에 따라.

선점방식 방식으로 스케줄링 된다(preemtive) .

Page 199: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 199 -

Page 200: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 200 -

자바 데몬 쓰레드

Page 201: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 201 -

자바 쓰레드와 네이티브 쓰레드

자바에서 쓰레드는 실제 운영체제의 쓰레드로 매핑이 이루어져야 실제로 쓰레드로서 작업을

할 수 있다 나 등이 쓰레드를 지원하는 방식이 다르기 때문에 자. UNIX NT, Win95, OS/2

바 쓰레드와 실제 운영체제의 쓰레드와 매핑이 달라질 수 있다.

매핑M-1

매핑의 대표적인 예는 이다 솔라리스 운영체제에 제공되는M-1 green_threads . 2.4, 2.5

는 모두 를 사용하고 있다JDK green_threads .

매핑One -One

매핑 관계는 에서 사용되는 쓰레드이다 자바 쓰레드 개에 커널 쓰레드가1:1 NT, Win95 . 1 1

개 매핑되기 때문에 다중 쓰레드의 장점을 잘 살릴 수 있다.

매핑M-N

솔라리스 에서 지원되는 자바 쓰레드를 사용하는 경우에 언어에서 쓰레드를 사2.6 native , C

용하는 것처럼 쓰레드를 자유롭게 사용할 수 있다.

Page 202: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 202 -

Page 203: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 203 -

자바 쓰레드와 쓰레드 비교POSIX

기능 쓰레드Java 쓰레드POSIX

Thread Creation new Thread() pthread_create()

Thread Join join() pthread_join()

Thread Exit stop() pthread_exit()

Yield yield() sched_yield()

Get Thread ID getName() pthread-self()

Kill Thread stop() pthread_kill()

Mutex Lock Monitors pthread_mutex_lock()

Condition Variable wait(),notify() pthread_cond_wait(),pthread_cond_signal

Semaphores X sem_wait(), sem_post()

Attribute objects X pthread_attr_*

Thread Specific data X pthread_setspecific,pthread_getspecific

Thread priorities setpriority() pthread_setschedparam()

Thread cancellation stop(), catch ThreadDeath pthread_cancel()

각 운영체제별 쓰레드 환경

특성 AIX GenericDCE

OSF/DCE NT OS/2 Solaris HP-UX IRIX

멀티쓰레드커널 O ? O O X O O X

사용자쓰레드라이브러리 O O O O O O X X

표준 인터페이스POSIX O X X X X O X X

구조 1-1 m-1 m-1 1-1 1-1 m-n X X

개발도구MT O X O NA X O X X

디버거Thread O X O O O O X X

프로그래밍클래스Thread O O O O O O X X

Page 204: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 204 -

테이프Ticker

Page 205: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 205 -

Page 206: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 206 -

제 장 네이티브 메소드 파일 입출력9 . /

네이티브 메소드9.1

네이티브 메소드 소개9.1.1

는 자바 언어로 작성된 프로그램에서 언어로 작성된 함수JNI(Java Native Interface) C/C++

를 호출할 수 있도록 해준다 는 에서 사용되던 방법과 에서 사용되는 방. JNI JDK1.0 JDK1.1

법으로 나눌 수 있다 에 포함된 는 자바 가상 머신 간의 호환. JDK1.0 JNI (Virtual Machine)

성 문제와 가비지 콜렉션 등에 문제가 있었기 때문에 에서는 를 새로운 방법으, JDK1.1 JNI

로 구성하였다 이곳에서는 에서 사용되는 프로그래밍 방법을 다루도록 한다. JDK1.1 JNI .

는 주로 하드웨어를 제어하기 위해서 혹은 기존의 라이브러리를 이용하기 위해JNI , C/C++

서 사용될 수 있다 그러나 를 사용하면 플랫폼간에 호환성이 떨어지고 애플릿에서 사. , JNI ,

용할 수 없다는 단점이 있다 이러한 단점에도 불구하고 자바언어의 장점을 가지고 하드웨.

어에 접근하기 위한 방법으로 는 매우 중요한 위치를 차지한다JNI .

우선적으로 간단한 예제 프로그램을 실행시켜보고 조금씩 자세히 들어가 보도록 하자. JNI

를 실행시키기 위해서는 자바 클래스와 클래스의 메소드를 언어로 구현한 함수 라이C/C++

브러리가 필요하다 는 다음 단계를 거쳐서 작성할 수 있다. JNI .

프로그램 작성 단계1. JNI

자바 클래스를 작성한다1. .

자바 클래스를 컴파일한다2. .

언어의 헤더파일을 생성한다3. C .

네이티브 메소드를 작성한다4. .

라이브러리를 만든다5. .

프로그램을 실행시킨다6. .

예제2. NativeHello

자바 클래스 작성1.

첫 번째로 아래 예제처럼 자바 클래스를 작성한다 자바 클래스에서 언어로 구현할. C/C++

메소드는 키워드를 사용하고 함수의 바디 는 기술하지 않는다native , (body) .

[ access_modifier ] native return_type function_name ( arguments ):

Page 207: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 207 -

네이티브 메소드를 기술하고 다음에는 를 이용해서 언어로 구, System.loadLibrary() C/C++

현된 라이브러리를 로드한다 의 아규먼트로는 라이브러리의 이름이 들. System.loadLibrary()

어간다 예를 들어 라고 하면 라는 라이브러리가 존재해야. , System.loadLibrary("hello") hello

한다 라이브러리는 시스템마다 파일 이름이 달라질 수 있는데 에서는. hello , Solaris

파일이고 윈도우즈 에서는 파일이다libhello.so 95/NT hello.dll .

컴파일하기2.

자바 클래스를 를 이용해서 컴파일한다javac .

% javac NativeHello.java

% javac UseNative.java

헤더파일 생성하기3. C

를 이용해서 네이티브 메소드를 위한 언어 헤더 파일을 생성한다 를 사용할javah C . javah

때는 옵션을 이용하고 아규먼트로 네이티브 메소드를 갖는 자바 클래스 이름을 기술한-jni ,

다 를 실행하면 클래스 이름과 동일한 이름의 헤더 파일이 생성된다. javah .

% javah -jni NativeHello% lSNativeHello.class NativeHello.java UseNative.javaNativeHello.h Use Native. class

다음은 를 이용해서 생성된 언어 헤더 파일이다javah C .

Page 208: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 208 -

네이티브 메소드 만들기4.

다음 단계는 실제적인 작업을 수행할 자바 네이티브 메소드를 언어로 구현하는 것이다C .

네이티브 메소드를 구현하기 위해서는 헤더 파일과 로 생성된 헤더 파일을 인클jni.h javah

루드 해야 한다 이제 의 메소드를 구현할 언어 함수(include) . NativeHello.java void greet() C

를 만들어 보자.

Page 209: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 209 -

설명

메소드를 구현한 함수는 를 이용해서void greet() Java_NativeHello_greet(..) printf() "Hello

를 출력하는 간단한 기능을 하는 함수이다world!" .

라이브러리 만들기5.

다음 단계는 라이브러리를 만드는 단계이다 나 환경에서 동적 라이브러리를. UNlX Win32

작성한다.

UNIX

% cc -G -I$JAVA_HOME/include -I$JAVA_HOME/include/solaris ₩

HelloWorldImpl.c -o libhello.so

% ls

HelloWorldImpl.c NativeHello.h UseNative.class

NativeHello.class NativeHello.java UseNative.java

libhello.so

Win32

c:₩> c1 -Ic:₩jdk1.1.6₩include -Ic:jdk1.1.6₩include₩win32 -LD HelloWorldImpl.c -Fehello.dll

실행하기6.

라이브러리를 작성하면 자바 클래스를 실행시킬 수 있다 그러나 때로는 다음과 같은 에러.

가 발생할 수도 있다 이것은 라이브러리 패스가 설정되지 않은 경우에 발생할 수 있다 라. .

이브러리 패스가 설정되지 않은 경우에 의 에서는 명령어를 이용해서UNIX C-Shell setenv

패스를 설정한다 에서는 파일에 설정하거나 도스 창에서 환경변. Windows 95 autoexec.bat ,

수를 맞추어줄 수 있다.

% java UseNative

java.lang.UnsatisfiedLinkError : no hello in shared library path

at java.lang.Runtime.loadLibrary0(Runtime.java:429)

at java.lang.System.loadLibrary(System.java:640)

at

% setenv LD_LIBRARY_PATH .:$LD_LIBRARY_PATH

% java UseNative

Hello world!

참고 자바 메소드명 패핑 규칙:

자바 메소드를 언어로 구현하기 위해 자바 메소드의 이름이 언어에서는 다음 규칙1) C C

에 따라 변경된다.

Page 210: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 210 -

. 가 접두어로 붙는다"Java_"

. 패키지 이름과 클래스 이름이 붙는다.

. 가 분리자 역할을 한다"_" .

. 메소드 이름이 붙는다.

. 오버로딩된 메소드는 뒤에 아규먼트가 기술된다 오버로딩된 메소드가 없으면 이 부분"_" .

은 생략된다.

따라서 메소드 이름은 다음과 같은 형태이다.

Java_package_class_method_arguments(argument_list)

오버로딩 된 메소드들을 구별하기 위해 동일한 이름의 네이티브 메소드들이 여러 개 있2) ,

으면 메소드 이름 뒤에 메소드의 아규먼트들을 기술해주는데 이때 자바 에서 사용되던, VM

방법이 이용된다 예를 들면 타입을 나타낼 때는 를 을 나타내기 위해서는 를 사. , int I , float F

용하는 식이다 각 자료형을 살펴보면 다음 표와 같다. .

타입시그니쳐 자바타입

Z booleanB byteC charS shortI intJ longF floatD doubleLfully-qualified-class; fully-qualified-class[type type [](arg-types) ret-type method type

예를 들면 다음과 같이 네 개의 함수가 다음과 같이 오버로딩되어 있다, funcA() .

public native void funcA();public native void funcA(int a);public native void void funcA(String msg);public native void void funcA(int a[ ]);

함수들은 각각 아래와 같이 매핑된다funcA() .

JNIEXPORT void JNICALL Java_FuncSig_funcA__(JNIEnv *, jobject);JNIEXPORT void JNICALL Java_FuncSig_funcA__I(JNIEnv *, jobject, jint);

JNIEXPORT void JNICALL Java_FuncSig_funcA__Ljava_lang_String_2 (JNIEnv *,jobject, jstring);

JNIEXPORT void JNICALL Java_FuncSig_funcA__3I(JNIEnv *, jobject, jintArray);

Page 211: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 211 -

자바 메소드를 언어 함수 이름으로 매핑할 때 자바의 유니코드 문자나 자바의 클래스3) C ,

타입을 기술하기 위해서 에서는 과 같은 이스케입 문자를 사용한JNI “_0”, “_1”, “_2”, “_3”

다 각 이스케입 문자의 의미는 다음 테이블과 같다. .

이스케입문자 의미

_0XXXX 유니코드문자값(XXXX)_1 문자'_'_2 문자';'_3 문자'['

이스케입 문자와 시그니쳐를 이용해서 함수 이름의 매핑 관계를 살펴보자funcA() . funcA()

메소드는 아규먼트가 없기 때문에 로 매핑된다 메소Java_FuncSig_funcA_(..) . funcA(int a)

드는 타입을 아규먼트로 갖기 때문에 타입의 시그니쳐인 영어 대문자 가 메소드int int I( I)

이름 뒤에 붙어서 가 된다Java_FuncSig_funcA_I(..) .

메소드는 타입을 아규먼트로 갖기 때문에 이것을 시그funcA(String msg) java.lang.String

니쳐로 변경하면 이 된다 그러나 함수에서 과 문자는 사용할"Ljava/lang/String; . , C '/' ';'

수 없기 때문에 는 문자로 는 로 변환된다 따라서 이 메소드는'/' '_' , ';' '_2' .

로 매핑된다Java_FuncSig_funcA_Ljava_lang_String_2(..) .

마지막으로 메소드의 아규먼트 를 시그니쳐로 변경하면 가 된다, funcA(int a[]) int a[] "[I" .

마찬가지로 문자는 언어에서 함수 이름으로 사용할 수 없기 때문에 는 으로 변'[' C , '[' '_3'

경된다 따라서 메소드는 이름으로 매핑된다. funcA(int a[]) Java_FuncSig_funcA__3I(..) .

또 다음과 같은 경우를 생각해보자 함수 중 하나는 자바로 구현되어 있고 다른 하. funcB() ,

나는 로 구현한다면 네이티브 함수는 같은 이름을 가지는 것이 없기 때문에 함수의 끝JNI ,

에 시그니쳐를 붙이지 않는다.

public void funcB() { }public native void funcB(int a);

함수 는 다음과 같은 함수 이름으로 매핑된다funcB(int a) JNI .

JNIEXPORT void JNICALL Java_FuncSig_funcB(JNIEnv *, jobject, jint);

자바에서는 유니코드를 사용하기 때문에 한글로 된 함수 이름이 가능하다 그러나 언4) . , C

어에서는 이것이 불가능하기 때문에 유니코드가 다른 이름으로 변경되어야 한다.

public native void 인사하기();public native void 인사하기(String msg);

Page 212: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 212 -

함수 인사하기 는 유니코드를 사용하기 위해 과 뒤에 자리의 유니코드 값으로 변환“ ()” “_0” 4

된다.

JNIEXPORT void JNICALL Java_FuncSig_0c778_0c0ac_0d558_0ae30_(JNIEnv *, jobject);JNIEXP0RT void JNICALL Java_FuncSig__0c778_0c0ac_0d558_0ae30_Ljava_lang_String_2

(JNIEnv *, jobject, jstring);

Page 213: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 213 -

자바와 네이티브 메소드의 데이터 타입 매칭9.1.2

자바와 를 이용하는 경우에 데이터 타입이 동일하다면 편리하겠지만 실제적으로는 많은C ,

차이가 있다 따라서 두 언어 사이에 타입의 불일치를 해소하기 위해서 에서는 새로운. JNI

타입들을 만들었다 이 새로운 타입들은 문자로 시작하는 특징이 있다. 'j' .

기본 데이터 타입 매핑

다음 표는 자바 레퍼런스 타입이 에서 어떤 타입으로 매핑되는가를 보여준다JNI .

자바타입 타입JNI

java.lang.Object jobject

java.lang.Class jclass

java.lang.String jstring

Java array jarray

object [] jobjectArray

boolean [] jbooleanArray

byte [] jbyteArray

char [] jcharArray

short [] jshortArray

int [] jintArray

long [] jlongArray

float [] jfloatArray

double [] jdoubleArray

java.lang.Throwable jthrowable

레퍼런스 타입 매핑

문자열 사용하기

타입은 자바의 타입과 매치되는 타입이기 때문에 일반 언어의 타입jstring Strin C char *

과는 다르다 문자열을 처리하기 위해서 다음과 같은 함수들을 제공한다. .

. 유니코드 문자jstring NewString(JNIEnv *env, const jchar *unicodeChars, jsize len) -

배열을 이용해서 을 만든다 만약 실패하면 을 리턴 한다jstring . NULL .

Page 214: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 214 -

. 유니코드 문자로 구성된 문자열의jsize GetStringLength(JNIEnv *env, jstring string) -

길이 유니코드 문자의 개수 를 리턴 한다( ) .

. 문자열을const jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy) -

아규먼트로 받아 유니코드 문자 배열의 포인터를 리턴 한다 가 이 아닐 때 복. isCopy NULL

제가 이루어졌으면 가 아니면 값이 설정된다JNI-TRUE , JNI_FALSE .

. 자바 에 문void ReleaseStringChars(JNIEnv *env, jstrig string, const jchar *chars) - VM

자열이 더 이상 사용되지 않으니 가비지 컬렉션이 이루어지도록 알려준다.

. 문자 배열을 이용해서jstring NewStringUTF(JNIEnv *env, const char *bytes) - UTF-8

자바 문자열을 만든다.

. 로 표현된 문자열의 길jsize GetStringUTFLength(JNIEnv *env, jstring string) - UTF-8

이를 리턴 한다.

. 자바의 유jbyte * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy) -

니코드 문자열을 문자 배열로 변환해준다 가 이 아닐 때 복제가 이루UTF-8 . isCopy NULL

어 졌으면 에 가 아니면 값이 설정된다isCopy JNI_TRUE , JNI-FALSE .

. 자바void ReleaseStringUTFChars(JNIEnv *env, jstring string, const jbyte *utf) - VM

에 문자열이 더 이상 사용되지 않을 것이므로 가비지 컬렉션이 이루어지도록 알려준다.

Page 215: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 215 -

다음의 예제는 타입의 아규먼트를 갖는 메소드를 를NativeGreeting.java String greet() JNI

이용해서 작성한 프로그램이다 를 이용해서 언어로 프로그램을 작성할 때 문자열 처리. JNI C

하는 방법에 유의하라.

배열 사용하기

과 마찬가지로 도 파일에서 직접 접근할 수 없고 에서 제공되는 함수들jstring jarray C , JNI

을 이용해서 접근할 수 있다 네이티브 메소드에서 자바 배열을 아규먼트로 전달받은 경우.

에 가장 먼저 선행돼야 하는 일은 배열의 크기를 알아보는 것이다 배열의 크기는.

메소드를 이용하는 것이다GetArrayLength() .

. 배열의 크기를 리턴 한다jsize GetArrayLength(JNIEnv *env, jarray array) - .

Page 216: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 216 -

다음은 객체의 배열에 사용되는 함수들이다.

. jarray NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject

클래스 타입의 배열을 만든다initialElement) - elementClass .

. 객체의jobject CetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index) -

배열에서 번째의 객체를 리턴 한다index .

. void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value)

객체 배열에서 번째에 값을 넣는다- index value .

객체 배열을 제외한 다른 기본 자료형 배열을 위한 함수들은 유사한 형태로 되어 있다 예.

를 들면 새로운 배열을 만들기 위해서는 함수를 사용하고 배열의 포인, New<type>Array() ,

터를 얻기 위해서는 함수를 이용한다Get<type>ArrayElements() .

. 타입ArrayType New<PrimitiveType>Array(JNIEnv *env, jsize length) - PrimitiveType

의 크기 인 배열을 만든다length .

. NativeType *Get<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType array

배열을 직접 접근할 수 있는 포인터 타입으로 리턴 해준다jboolean *isCopy) - .

마찬가지 방법으로 배열로 사용되던 메모리 영역을 해제하기 위해서는

함수를 이용한다Release<type>ArrayElements() .

. void Release<PrimitiveType>ArrayElements(JNIEnv *env, ArrayType array,

배열에 사용되는 메모리 영역을 해제한다 는NativeType *elems, jint mode) - . elems

함수를 호출해서 얻은 값이다 필요한 경우에 함수는Get<PrimitiveType>ArrayElements() .

에서 변경된 내용들을 원래 배열에 업데이트 할 수 있다 아규먼트는 배열 버퍼elems . mode

를 어떻게 해제할 것인가를 지정하는 변수이다 그러나 이 의 복제가 아닌 경우. , elems array

에는 는 아무런 효과를 발휘할 수 없다mode .

mode 의미

0 의변경된내용을원래배열에업데이트하고 는해제elems elems

JNI_COMMIT 의변경된내용을원래배열에업데이트하고 는해제안함elems elems

JNI_ABORT 변경된내용을업데이트하지않고해제

다음 표는 각 기본형에서 사용되는 배열 관련 함수들이다.

Page 217: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 217 -

배열생성 배열접근 배열삭제 배열타입JNI Native타입

자바배열

NewBooleanArray() GetBooleanArrayElements() ReleaseBooleanArrayElements() jbooleanArray jboolean boolean[]

NewByteArray() CetByteArrayElements() ReleaseByteArrayElements() jbyteArray jbyte byte[]

NewCharArray() GetCharArrayElements() ReleaseCharArrayElements() jcharArray jchar char[]

NewShortArray() CetShortArrayElements() ReleaseShortArrayelements() jshortArray jshort short[]

NewIntArray() GetIntArrayElements() ReleaseIntArrayElements() jintArray jint int[]

NewLongArray() GetLongArrayElements() ReleaseLongArrayElements() jlongArray jlong long[]

NewFloatArray() GetFloatArrayElements() ReleaseFloatArrayElements() jfloatArray jfloat float[]

NewdoubleArray() GetDoubleArrayElements() ReleaseDoubleArrayElements() jdoubleArray jdouble double[]

Page 218: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 218 -

다음은 정수 배열을 네이티브 함수에 전달해서 합계를 구하는 프로그램 예제이다 를 이. JNI

용하는 경우에 배열을 처리하는 방법에 유의하라.

이전까지 예제에서는 디폴트 패키지를 이용하였기 때문에 패키지를 기술하지 않았고 메소,

드도 오버로딩되지 않았다 다음 클래스에서는 패키지와 오버로딩 된 네이티. OverLoadTest

브 메소드를 사용하는 방법을 다루고 있다 클래스는 오버로딩 된 개의. OverLoadTest 3

메소드를 가지고있다 오버로딩에서 메소드명의 변환은 자바 메소드명 매핑 규칙greet() . “ ”

부분을 참조하라.

Page 219: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 219 -

Page 220: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 220 -

% java -d. OverLoadTest.java

패키지를 사용하기 때문에 에서 옵션을 사용해야 한다javac -d .

% javah -jni hello.OverLoadTest

패키지를 사용하는 경우에 에서도 클래스 이름을 기술 할 때 패키지 이름까지 기술해javah

주어야 한다.

Page 221: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 221 -

네이티브 메소드에서 자바 함수 및 필드 접근9.1.3

자바 네이티브 함수에서 자바 메소드를 호출하기 위해서는 다음과 같은 절차를 거쳐야 된

다.

함수를 호출해서 자바 객체의 클래스 타입을 얻는다1. GetObjectClass .

번에서 얻어온 자바 클래스의 함수를 호출해서 메소드의 를 알아온다2. 1 GetMethodID ID .

함수를 호출해서 자바 메소드를 실행시킨다3. Call<type>Method .

각 함수들을 알아보자.

. 객체의 클래스 타입을 리 턴 한jclass CetObjectClass(JNIEnv *env, jobject obj) - obj

다.

. jmethodID GetNethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig)

과 를 이용해서 클래스의 메소드 를 리턴 한다- name sig ID .

. NativeType Call<type>MethodA(JNIEnv *env, jobject obj, jmethodID methodID, ...) -

를 이용해서 객체의 메소드를 호출한다 부분은 메소드의 리턴 타입이methodID obj . <type>

다.

. NativeType Call<type>MethodA(JNIEnv *env, jobject obj, jmethodID methodID,jvalue

를 이용해서 객체의 메소드를 호출한다 부분은 메소드의 리*args) - methodID obj . <type>

턴 타입이다.

. NativeType Call<type>MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list

를 이용해서 객체의 메소드를 호출한다 부분은 메소드의 리args) - methodID obj . <type>

턴 타입이다.

함수를 이용해서 원하는 자바 클래스 타입을 얻어온 후에 그 클래스의 메GetObjectClass() ,

소드를 호출하기 위해서는 원하는 메소드의 를 얻어야 한다 원하는 메소드의 를 얻기ID . ID

위해서는 메소드명과 아규먼트를 자바 의 시그니쳐 형태로 기술해주어야 한다 자바 메VM .

소드나 멤버 필드의 시그니쳐를 알아보기 위해 를 이용할 수 있다 예를 들면 앞VM javap .

에서 다루었던 클래스의 메소드 시그니쳐를 알아보려면 다음과 같이 를OverLoadTest javap

이용할 수 있다.

Page 222: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 222 -

Page 223: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 223 -

를 이용하면 메소드와 메소드의 시그니쳐가 출력된다javap .

다음 표는 에서 자바 메소드를 호출하기 위한 함수들이다C/C++ .

Call<type>Method() Call<type>MethodA() Call<type>MethodV() 타입JNI 자바타입

CallVoidMethod() CallVoidbMethodA() CallVoidMethodV() void void

CallObjectMethod() CallObjectMethodA() CallObjectMethodV() jobject Object

CallBooleanMethod() CallBooleanMethodA() CallBooleanMethodV() jboolean boolean

CallByteMethod() CallByteMethodA() CallByteMethodV() jbyte byte

CallCharMethod() CallCharMthodA() CallCharMethodV() jchar char

CallShortMethod() CallShortMethodA() CallShortMethodV() jshort short

CallIntMethod() CallIntMethodA() CallIntMethodV() jint int

CallLongMethod() CallLongMethodA() CallLongMethodV() jlong long

CallFloatMethod() CallFloatMethodA() CallFloatMethodV() jfloat float

CallDoubleMethod() CallDoubleMethodA() CallDoubleMethodV() jdouble double

네이티브 함수에서 자바 멤버 필드를 접근하기 위해서는 다음 두 단계를 거쳐야된다.

함수를 이용해서 멤버필드 를 얻는다1. GetFieldID ID .

함수를 이용해서 멤버필드의 값을 얻거나 함수를 이용해2. Get<type>Field , Set<type>Field

서 멤버필드의 값을 설정할 수 있다.

각 함수들을 살펴보자.

. jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig) -

클래스의 이름의 멤버 필드의 를 얻어온다 이 때 부문에 멤버필드의 시clazz name ID . sig

그니쳐를 기술해주어야 한다.

. 객체의 멤NativeType Get<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID) - obj

버필드를 접근할 수 있도록 해준다.

. void Set<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID, NativeType value) - obj

객체의 멤버필드에 값을 설정한다value .

다음 표는 객체의 멤버필드의 자료형에 따라 멤버필드를 접근하기 위한 함수들을 보여준다.

Page 224: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 224 -

Set<type>Field() Get<type>Field() 타입JNI 자바타입

SetObjectField() GetObjectField() jobject Object

SetBooleanField() GetBooleanField() jboolean boolean

SetByteField() GetByteField() jbyte byte

SetCharField() CetCharField() jchar char

SetShortField() GetShortField() jshort short

SetIntField() CetIntField() jint int

SetLongField() CetLongField() jlong long

SetFloatField() CetFloatField() jfloat float

SetDoubleField() CetDoubleField() jdouble double

다음의 예제는 자바 클래스의 멤버필드에 메소드를 이용해서URLToken.java url setURL()

값을 설정한다 메소드는 를 이용해서 언어로 작성된다 멤버필드는 다. setURLO JNI C . url

시 메소드를 통해 토큰별로 출력된다 메소드 역시 를 이용해 언어로print() . print() JNI C

작성된다 예제는 를 사용할 때 언어에서 자바 멤버필드와 메소드를. URLTokenjava JNI C

접근하는 방법을 보여준다.

Page 225: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 225 -

Page 226: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 226 -

다음의 파일에서 클래스의 와 메소드를 언URLTokenImpl.c URLToken print() setURL() C

어로 구현된 함수들을 포함한다 에 해당되는 함수에서는 클래스의 멤버필드를 접. setURL()

근하고 사용자로부터 입력받은 값을 값으로 설정한다 에 해당되는. print()

함수에서는 클래스의 메소드를 호출한다 메Java_URLToken_print() URLToken . tokenize()

소드가 타입을 리턴하면 함수에서는 이것을 화면에 출력String[] , Java_URLToken_print()

한다 타입을 리턴하는 메소드 를 호출하기 위해 사용되는 함수와 결과값. String[] tokenize()

을 배열로 다시 변경하는 방법들을 자세히 살펴보기 바란다.

Page 227: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 227 -

Page 228: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 228 -

를 이용한 함수에서 자바로 된 메소드를 호출할 때 메소드의 아규먼트가 많은 경우에JNI C

는 어떻게 할까 다음의 예제는 여러 개의 아규먼트를 호출하는 방법을 보여준? ManyArg

다 클래스는 개 아규먼트를 갖는 메소드를 가지고 있으며. ManyArg 4 funcMany() funcA()

에서 호출된다.

다음의 파일에서는 를 구현하였다 함수에ManyArgImpl.c funcA() . Java_ManyArg_funcA()

서 클래스의 메소드를 호출하면서 개의 아규먼트를 전달하기 위해ManyArg funcMany() 4

함수를 사용하였다 함수를 이용하는 경우에 다음에 아규먼CallIntMethod() . Cal1 methodID

트를 차례대로 여러 개를 기술할 수 있다.

Page 229: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 229 -

다음 파일에서는 함수를 사용한 예이다ManyArgImp12.c Call<type>MethodA() .

함수를 사용하는 경우에는 다음에 배열을 아규먼트Call<type>MethodA() methodID jvalue

로 기술할 수 있다 는 다음과 같은 형태의 유니온 타입이다. jvalue .

함수를 이용하는 경우에는 아규먼트의 갯수에 맞게 배열을 만Call<type>MethodA() jvalue

들어 의 아규먼트로 전달한다Call<type>MethodA() .

Page 230: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 230 -

Page 231: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 231 -

기타9.1.4

에서 부모 클래스의 오버라이드 된 메소드를 호출하기 위해JNI

함수를 이용할 수 있다CallNonvirtual<type>Method() .

NativeType CallNonvirtual<type>Method(JNIEnv *env, jobject obj, jclass clazz,ㆍ

jmethodID methodID, ...);

NativeType CallNonvirtual<type>MethodA(JNIEnv *env, jobject obj, jclass clazz,ㆍ

jmethodID methodID, jvalue *args);

NativeType CallNonvirtual<type>MethodV(JNIEnv *env, jobject obj, jclass clazz,ㆍ

jmethodID methodID, va_list args);

다음 표는 각 자료형에 따라 사용할 수 있는 함수들이다.

CallNonvirtual<type>Mehod() CallNonvirtual<type>MethodA() CallNonvirtual<type>MethodV() JNI타입

자바타입

CallNonvirtualVoidMethod() CallnonvirtualVoidMethodA() CallnonvirtualVoidMethodV() void void

CallNonvirtualObjectMethod() CallNonvirtualObjectMethodA() CallNonvirtualObjectMethodV() jobject Object

CallNonvirtualBooleanMethod() CallNonvirtualBooleanMethodA() CallNonvirtualBooleanMethodV() jboole boolean

CallNonvirtualByteMethod() CallNonvirtualByteMethodA() CallNonvirtualByteMethodV() jbyte byte

CallNonvirtualcharMethod() CallNonvirtualcharHethodA() CallNonvirtualcharMethodV() jchar char

CallNonvirtualShortMethod() CallNonvirtualShortMethodA() CallNonvirtualShortMethodV() jshort short

CallNonvirtualIntMethod() CallNonvirtualIntMethodA() CallNonvirtualIntMethodV() jint int

CallNonvirtualLongMethod() CallNonvirtualLongMethodA() CallNonvirtualLongMethodV() jlong long

CallNonvirtualFloatMetod() CallNonvirtualFloatMetodA() CallNonvirtualFloatMetodV() jfloat float

CallNonvirtualDoubleMethod() CallNonvirtualDoubleMethodA() CallNonvirtualDoubleMethodV() jdouble double

에서 클래스의 정적 멤버필드와 메소드를 사용할 수 있다 사용 방법은 객체의 멤버필드JNI .

와 메소드를 사용하는 것과 유사하다.

. jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);

. void SetStatic<type>Field(JNIEnv *env, jclass clazz, jfieldID fieldID, NativeType value);

. NativeType GetStatic<type>Field(JNIEnv *env, jclass clazz, jfieldID fieldID);

다음 표는 정적 멤버 필드를 위해 사용되는 함수들이다.

Page 232: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 232 -

SetStatic<type>Field() GetStatic<type>Field() 타입JNI 자바타입

SetStaticObjectField() GetStaticObjectField() jobject Object

SetStaticBooleanField() CetStaticBooleanField() jboolean boolean

SetStaticByteField() GetStaticByteField() jbyte byte

SetStaticCharField() GetStaticCharField() jchar char

SetStaticshortField() GetStaticShortField() jshort short

SetStaticIntField() GetStaticIntField() jint int

SetStaticLongField() GetStaticLongField() jlong long

SetStaticFloatField() GetStaticFloatField() jfloat float

SetStaticDoubleField() GetStaticDoubleField() jdouble double

에서 정적 메소드를 호출하는 것도 객체의 메소드를 호출하는 것과 유사하다 다만 사용JNI .

되는 함수 이름만 변경될 뿐 나머지는 동일하다 정적 메소드를 사용하기 위해서는 다음 함.

수들을 이용한다.

. jmethodID GetStaticNethodID(JNIEnv *env, jclass clazz, const char *name, const char

*sig);

. NativeType CallStatic<type>Method(JNIEnv *env, jclass clazz, jmethodID methodID,

...);

. NativeType CallStatic<type>MethodA(JNIEnv *env, jclass clazz, jmethodID methodID,

jvalue *args);

. NativeType CallStatic<type>MethodV(JNIEnv *env, jclass clazz, jmethodID methodID,

va__list args);

다음 표는 각 자료형에 따른 함수 이름들이 기술되어 있다.

Page 233: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 233 -

CallStatic<type>Method()

CallStatic<type>MethodA()

CallStatic<type>MethodV()

JNI타입

자바타입

CallStaticVoidMethod() CallStaticVoidMethodA() CallStaticVoidMethodV() void void

CallStaticObjectMethod() CallStaticObjectMethodA() CallStaticObjectMethodV() jobject Object

CallStaticBooleanMethod()

CallStaticBooleanMethodA()

CallStaticBooleanMethodV() jboolean boolean

CallStaticByteMethod() CallStaticByteMethodA() CallStaticByteMethodV() jbyte byte

CallStaticCharMethod() CallStaticCharMethodA() CallStaticCharMethodV() jchar char

CallStaticShortMethod() CallStaticShortMethodA() CallStaticShortMethodV() jshort short

CallStaticIntMethod() CallStaticIntMethodA() CallStaticIntMethodV() jint int

CallStaticLongMethod() CallStaticLongMethodA() CallStaticLongMethodV() jlong long

CallStaticFloatMethod() CallStaticFloatMethodA() CallStaticFloatMethodV() jfloat float

CallStaticDoubleMethod() CallStaticDoubleMethodA()

CallStaticDoubleMethodV() jdouble double

함수에서도 예외 가 발생했는지 여부를 알 수 있고 예외 를 발생JNI (Exception) , (Exception)

시킬 수 있다 예외의 발생여부는 함수를 이용해서 알 수 있다 발생된. ExceptionOccurred() .

예외는 자바에서 예외를 처리하거나 함수를 호출할 때까지 유지된다ExceptionClear() .

함수는 디버깅을 위해 예외에 관련된 정보를 출력해주는 함수이다ExceptionDescribe() .

Page 234: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 234 -

. 예외 발생 여부를 알려준다jthrowable ExceptionOccurred(JNIEnv *env) - .

. 예외가 발생한 스택 백트레이스 정보를void ExceptionDescribe(JNIEnv *env) - (backtrace)

출력해서 디버깅에 도움을 주는 함수이다.

. 현재 발생한 예외를 지운다void ExceptionClear(JNIEnv *env) - .

. 객체의 예외를 발생시jint Throw(JNIEnv *env, jthrowable obj) - : java,lang.Throwable

킨다.

. 타입의 예외를jint ThrowNew(JNIEnv *env, jclass clazz, const char *message) - clazz

발생시킨다.

Page 235: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 235 -

Page 236: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 236 -

Page 237: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 237 -

응용프로그램9.1.5

다음은 공유 메모리 를 통해 를 하는(shared memory) IPC(Inter Processor Communication)

프로그램을 작성해보자 공장 자동화 등의 분야에서 기계의 상태 값 온도 속도 압력 등 들. ( , , )

을 그래프로 표현하기 위해 보통 유닉스에서 윈도우와 이용해서 작업한다 그러나X Motif . ,

이용하는 경우에 유연성 있게 프로그램을 작성할 수 있지만 프로그래밍하기 까다X/Motif

로운 어려움이 있다 만약 자바를 사용한다면 를 이용해서 프로그래밍 하는 것보다. , X/Motif

는 좀 더 수월하게 프로그래밍 할 수 있을 것이다 를 이용하면 자바 클래스에서 직접. JNI

디바이스를 접근해서 상태 값을 읽어올 수 있을 수 있다 그러나 이러한 방법보다는 중간에. ,

서버가 존재해서 디바이스의 상태 값을 공유메모리에 저장하고 자바의 함수가 공유 메JNI

모리에서 값을 읽어 가는 클라이언트 서버 형태가 편리할 것이다/ .

다음의 는 기계의 상태를 시뮬레이션하기 위해 매 초 단위로 사이의GraphServer 2 0 100~

임의 정수를 생성해서 공유 메모리에 저장하는 역할을 한다 는 언어로 작성된. GraphClient C

클라이언트프로그램이다 프로그램은 매 초마다 공유 메모리에 기록된 정수값. GraphClient 2

을 읽어오는 역할을 한다 는 실제로 사용되지는 않고 가 제대로. GraphClient , GraphServer

작동하는지 체크하기 위해 작성된 것이다 공유 메모리에 저장된 정수를 읽어서 그래프로.

그려주는 프로그램은 이다Graph.java .

Page 238: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 238 -

클래스는 배열을 가지고 있으면서 배열에 기록된 정수값을 이용해서 그래프를Graph data[]

그린다 클래스에 라는 쓰레드가 매 초마다 메소드를 호출한다. Graph reader 2 addData() .

메소드는 배열에 있는 번째 값을 번째로 이동시키고addData() data[] i i+1 , readFromShm()

함수를 호출해서 공유 메모리에서 정수값을 읽어와서 에 저장한다 이 과정이 종JNI data[0] .

료되면 메소드를 호출해서 그래프의 내용을 업데이트 한다repaint() .

Page 239: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 239 -

Page 240: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 240 -

다음 함수는 공유 메모리에서 정수값을 읽어 리턴 한다Java_Graph-readFromShm .

그림 결과9-1. Graph

사용법9.1.6 JNI 1.0

은 에서 지원되던 네이티브 메소드이다 이 나오면서 은 많이 사용JNI 1.0 JDK 1.0 . JNI 1.l 1.0

되지 않지만 아직 사용할 수 있다 방법은 앞으로 많이 사용되지 않기 때문에 간단히 사. 1.0

용법만 기술한다.

자바 클래스를 선언한다1. .

Page 241: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 241 -

Page 242: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 242 -

컴파일한다2. .

% javac NativeHello.java UseNative.java

를이용해서컴파일한후에 를이용해서 언어헤더파일과 파일을생성한다3. javac javah C stub .

% javah NativeHello

는 자동적으로 파일을 생성한다 이 파일은 수정하지 않는 것이 좋겠다javah NativeHello.h . .

헤더 파일을 작성한 후에 를 이용해서 파일 을 작성한다 이 파C javah stub (NativeHello.c) .

일 또한 자동적으로 생성되는 파일이기 때문에 수정하지 않는 것이 좋겠다.

% javah -stubs NativeHello

Page 243: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 243 -

Page 244: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 244 -

언어로 함수를 작성한다4. C .

이제는 함수를 언어로 구현해야 한다 라는 파일에nativeHelloWorld() C . NHW.c

함수를 구현한다고 하면 다음과 같이 하면 된다nativeHelloWorld() .

이제 언어 파일을 컴파일해야 한다C .

% cc -I$JAVA_HOME/include -I$JAVA_HOME/include/solaris -G NativeHello.c ₩

NHW.c -o libnativeTest.so

자바를 실행시키기 위해서는 라이브러리를 로드해야한다 이 라이브러리를libnativeTest.so .

로드하기 위해서 라이브러리 패스를 설정해 주어야한다.

% setenv LD_LIBRARY_PATH .:$LD_LIBRARY_PATH

실행시킨다5. .

% java UseNative

Hello Native World!

Page 245: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 245 -

파일 입출력9.2

바이트의 연속을 스트림 이라고 한다 자바에서는 스트림을 이용해서 입출력을 한다(stream) . .

입력을 하는 스트림을 입력스트림 이라고 하고 출력하는 스트림을 출력 스트(input stream) ,

림 이라고 한다 입출력 스트림은 패키지에 만들어져 있다 화면에 출(output stream) . java.io .

력하고 키보드로부터 입력을 받아들이기 위해서는 클래스의 과 을 사용했다, System out in .

클래스의 은 타입의 멤버 필드이고 은 타입의 멤버System out PrintStream , in InputStream

필드이다 자바에서 입력 스트림클래스들은 클래스로부터 상속된 클래스이다. InputStream .

출력 스트림 클래스들은 클래스로부터 상속된 클래스이다 입출력을 위해서는OutputStream .

다양한 입출력 클래스들이 사용된다 다음그림은 입출력에 사용되는 클래스들의 상속 관계.

를 보여준다.

그림 출력 스트림 클래스 상속관계9-107

그림 입력 스트림 클래스 상속관계9-108

클래스9.2.1 InputStream

클래스의 멤버필드는 대표적인 타입이다 은 입력을 위System in InputStream . InputStream

해 다음과 같은 메소드들을 이용할 수 있다.

. int read()

. int read(byte[])

. int read(byte[], int, int)

메소드를 이용하는 경우에 바이트 값을 읽어온다 만약 파일의 끝인 경우에는 을read() . , -1

Page 246: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 246 -

리턴 한다 메소드는 읽은 내용을 바이트 배열에 채우고 읽은 바이트의 수를. read(byte[]) ,

리턴 한다 메소드는 바이트 배열에서 시작 위치와 끝 위치를 지정한. read(byte[], int, int)

뒤에 내용을 읽어오고 읽은 바이트의 수를 리턴 한다, .

Page 247: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 247 -

입력스트림을 이용해서 콘솔로부터 문자를 읽어와서 다시 화면에 출력하는 예제 프로그램을

살펴보자.

설명

6 while ((b = System. in.read()) ! = -1) {

메소드를 이용해서 키보드로부터 입력을 받는다 메소드는 바이트System.in.read() . read()

입력을 리턴하고 입력이 종료되면 을 리턴 한다 윈도우즈 에서는 대, (Cntl + D) -1 . 95 Cntl+D

신에 를 입력한다Cntl+Z .

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 .

다음은 을 이용해서 유닉스에서 현재 수행되는 프로세스 정보를 읽어서 프린터로Runtime

출력하는 예제 프로그램이다 프로그램에서 프로세스의 출력스트림을 프로세. psProc lpProc

Page 248: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 248 -

스의 입력스트림으로 복사를 해준다 이것은 유닉스에서 파이프라인을 이용하는 것과 유사.

한 방법이다 즉 다음 프로그램은 유닉스 명령어에서 수행하는 것과 동일하다. , “ps .-ef|lp” .

과 클래스 사용법과 입출력 스트림 사용법을 눈여겨보기 바란다Runtime Process .

Page 249: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 249 -

Page 250: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 250 -

클래스9.2.2 FileOutputStream

은 파일에 내용을 기록할 때 사용되는 출력스트림 이다FileOutputStream . FileOutputStream

을 이용하는 경우에 기존 파일에 내용이 있다면 그 내용은 전부 지워지고 새로운 내용이 쓰

여진다 파일의 내용을 보존하면서 내용을 추가하거나 삽입하고자 하는 경우에는.

을 이용해야 한다RandomAccessFile .

Page 251: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 251 -

설명

11 fout = new FileOutputStream(fname);

파일 이름을 아규먼트로 갖고 클래스를 만든다FileOutputStream .

15 b = System.in.read();

키보드로부터 입력을 받아들인다.

26 fout. write(m[i]);

클래스를 이용해서 파일에 기록한다FileOutputStream .

32 fout.close():

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

클래스9.2.3 DataInputStream/DataOutputStream

과 은 자료형에 따라 값을 읽고 기록할 수 있는 스트림DataInputStream DataOutputStream

클래스이다 을 이용하면 자료형에 따라 값을 읽을 수 있기 때문에 편리하. DataInputStream

다 은 다른 입력스트림을 이용해서 생성할 수 있다. DataInputStream .

.DataInputStream(InputStream in)

은 다음과 같은 메소드들을 이용해서 원하는 자료형 값을 읽어올 수 있다DataInputStream .

. int read(byte[] b, int off, int len)

. int read(byte[] b)

. boolean readBoolean()readByte()

. byte readByte ()

. char readChar()

. double readDouble()

. float readFloat()

. void readFully(byte[] b, int off, int len)

. void readFully(byte[] b)

. int readInt()

. String readLine()

. long readLong()

. short readShort()

. int readUnsignedByte()

. String readUTF()

. int sKipBytes(int n)

Page 252: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 252 -

클래스는 자료형에 따라 값을 출력할 수 있다 은 다DataOutputStream . DataOutputStream

음과 같은 생성자를 이용해서 만들 수 있다.

.DataOutputStream(OutputStrearn out)

은 다음과 같은 메소드들을 가지고 있다DataOutputStream .

. void flush()

. int size()

. void write(byte[] b, int off, int len

. void write(int b)

. void writeBoolean(boolean v)

Page 253: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 253 -

. void writeByte(int v)

. void writeBytes(String s)

. void writeChar(int v)

. void writeChars(String s)

. void writeDouble(double v)

. void writeFloat(float v)

. void writeInt(int v)

. void writeLong(long v)

. void writeShort(int v)

. void writeUTF(String str)

Page 254: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 254 -

다음 예제는 을 이용해서 파일에 등의 자료형을 기록DataOutputStream char, byte, boolean

하고 을 이용해서 파일에서 값을 읽어오는 프로그램이다, DatInputStream . DataInputStream

과 클래스는 텍스트 형태가 아닌 자료형으로 값을 저장하고 읽어오는데DataOutputStream

유용하게 사용될 수 있다.

Page 255: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 255 -

Page 256: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 256 -

클래스9.2.4 InputStreamReader

의 입출력 스트림은 에서 와 클래스로 일부 대체되었다 다음JDK 1.0 JDK 1.1 Reader Writer .

그림은 여러 형태의 클래스와 클래스들 간의 상속관계를 보여준다Reader Writer .

그림 클래스 상속 관계9-109. Reader

그림 클래스 상속 관계9-110. 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()

Page 257: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 257 -

메소드는 한 문자를 읽어서 리턴 하는 메소드이고 메소드는 한 줄을 읽read() , readLine()

어서 문자열을 리턴 하는 메소드이다.

Page 258: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 258 -

다음은 클래스를 이용해서 콘솔로부터 입력을 받아서 화면에 출력하는 프로그램이Reader

다.

설명

8 in = new BufferedReader(new InputStreamReader(System. in) );

키보드로부터 입력을 받는 클래스를 만들기 위해 클래BufferedReader , InputStreamReader

스와 을 이용했다System.in .

12 while((s = in.readLine()) != null) {

클래스의 메소드를 이용해서 한 줄을 읽어들였다BufferedReader readLine() .

Page 259: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 259 -

클래스9.2.5 BufferedReader/BufferedWriter

버퍼를 이용하는 와 클래스는 버퍼링 방법을 통해 입출력을BuffreredReader BufferedWriter

수행한다 클래스는 다음과 같은 생성자와 메소드들을 가지고 있다. BufferedRreader .

. BufferedReader(Reader in, int sz)

. BufferedReader(Reader in)

다음은 클래스의 메소드들이다BufferedReader .

. void close()

. void marK(int readAheadLimit)

. int read()

. int read(char[] cbuf, int off, int len)

. String readLine()

. long skip(long n)

는 다음과 같은 생성자와 메소드들을 가지고 있다BufferedWhter .

. BufferedWriter(Writer out, int sz)

. BufferedWriter(Writer out)

다음은 클래스의 메소드들이다BufferedWriter .

. void close()

. void flush()

. void newLine()

. void write(char[] cbuf, int off, int len)

. void write(int c)

. void write(String s, int off, int len)

다음 예제는 입력파일에서 한 줄씩 읽어서 출력파일로 저장하는 프로그램이다.

Page 260: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 260 -

Page 261: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 261 -

클래스9.2.6 RandomAccessFile

클래스는 메소드를 이용해서 입출력 포인터의 위치를 이동할 수RandomAccessFile seek()

있다 포인터를 이동시킨 뒤에 파일의 원하는 위치에서 기록하거나 내용을 읽을 수 있다. .

클래스는 다음과 같은 생성자를 이용해서 만들 수 있다RandomAccessFile .

. RandomAccessFile(String filename, String openmode)

첫 번째 아규먼트는 파일의 이름을 의미하고 두 번째 아규먼트는 파일을 오픈 할 때 읽기,

전용인가 아니면 읽기 쓰기 가능한지를 나타낸다 두 번째 아규먼트는 읽기 전용인 경우에/ .

는 읽기 쓰기인 경우에는 이다 은 다음과 같은 메소드들을 가지"r", / "rw" . RandomAccessFile

고 있다.

. 파일의 크기를 리턴 한다long length() - .

. 값을 하나 읽는다booleanreadBoolean() - boolean .

. 값을 하나 읽는다byte readByte() - byte .

. 값을 하나 읽는다short readShort() - short .

. 값을 하나 읽는다char readChar() - char .

. 값을 하나 읽는다double readDouble() - double .

. 값을 하나 읽는다float readFloat() - float .

. 값을 하나 읽는다int readInt() - int .

. 값을 하나 읽는다long readLong() -long .

. 파일의 처음에서부터 바이트 떨어진 곳으로 입출력 포인void seek(long pos) - pos

터를 이동한다.

. 파일에 값을 기록한다void writeBoolean(boolean v) - boolean .

Page 262: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 262 -

. 파일에 값을 기록한다void writeByte(byte v) - byte .

. 파일에 값을 기록한다void writeBytes(String v) - String .

. 파일에 값을 기록한다void writeChar(char v) - char .

. 파일에 값을 기록한다void writeChars(String v) - String .

. 파일에 값을 기록한다void writeFloat(float v) - float .

. 파일에 값을 기록한다void writeInt(int v) - int .

이제 을 실제적으로 이용하는 프로그램을 하나 살펴보자RandomAccessFile .

파일 예제는 의 사용법 및 자바에서 언어의 레코드EnployeeDB.java RandomAccessFile C

를 어떻게 사용하는가를 보여준다 자바는 레코드가 없기 때문에 클래스를 레코드로 사용한.

다 클래스는 레코드를 표현하기 의해 사용된 클래스이다 클래스는 레코드를. Record . Table

처리하기 위해 사용된 클래스이다 클래스에서 레코드를 읽거나 기록하기 위한 루틴. Table

들을 포함하고 있다 클래스는 주로 를 위한 코드가 들어 있다 자료가 저. EnployeeDB GUI .

장되는 파일에는 첫 바이트에는 총 저장된 레코드의 수가 기록되고 그 후에employee.dat 4 ,

는 레코드의 값들이 저장된다.

Page 263: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 263 -

Page 264: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 264 -

Page 265: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 265 -

Page 266: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 266 -

Page 267: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 267 -

Page 268: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 268 -

Page 269: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 269 -

Page 270: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 270 -

Page 271: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 271 -

Page 272: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 272 -

그림 결과9-111. EmployeeDB (A) 그림 결과9-112. EmployeeDB (B)

설명

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) ; ' '));

문자를 파일에 기록한다.

Page 273: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 273 -

제 장10 . 네트워크 프로그래밍

10.1 이해TCP/IP

국제 표준 단체인 가 제정한 계층은 실제로 사용되지 않는 프로토콜이지만 통신ISO OSI 7 ,

프로토콜 교육과 새로운 프로토콜 개발에 이용된다 계층은 다음 그림과 같은 구조로. OSI 7

구성되어있다.

그림 계층10-113. OSP 7

네트워크에서부터 시작된 프로토콜은 년 버클리 대학교에서 개발된ARPA TCR/IP 1983

유닉스에 포함되면서 많이 사용되게 되었다 유닉스가 소켓 기능을 제공하면서부BSD . BSD

터 네트워크 프로그래밍은 훨씬 간단하게 되었다 즉 프로그래머는 계층에서 트랜스. , OSI 7

포트 계층 이하는 무시하고 소켓 함수만 이용해서 프로그래밍 할 수 있게된 것이다, .

계열의 유닉스도 소켓의 영향을 받아서 을 개발해서System V STREAM TLI(Transport

프로그래밍을 지원하고 있다Layer Interface) .

그림 계층10-114. TCP/IP

프로토콜에서 각 계층은 상대방에게 전달할 데이터와 제어 정보를 가지고 있다 데TCP/IP .

이터와 제어 정보를 메시지라고 한다 메시지가 하위 계층으로 전달되면 기존 메시지에 추.

Page 274: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 274 -

가적인 제어 정보를 붙이게 되는데 이것을 캡슐화 라고 한다 이와 반대되는(encapsulation) .

과정을 역캡슐화 라고 한다(decapsulation) .

Page 275: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 275 -

그림 캡슐화와 역캡슐화10-115.

다음 그림은 인터넷 상에서 메시지가 전송되는 과정을 보여준다 인터넷 상에는 수많은 컴.

퓨터들이 존재하고 이 컴퓨터들 중에서 어떤 것들은 메시지를 받아서 다른 곳으로 전송하,

는 역할을 하기도 한다 이러한 역할을 하는 컴퓨터나 장치를 라우터라고 한다 라우터는 전. .

송 받은 내용을 역캡슐화 해서 제어 정보를 알아보고 적당한 곳으로 메시지를(decapsulation)

전송한다.

그림 메시지 전송10-116.

소켓10.2

소켓 소개10.2.1

다음 그림은 어드레스와 포트 소켓의 관계를 보여준다 포트 번호란 트랜스포트 계층에IP , .

서 사용되는 주소와 같은 것이다 전화를 예로 들면 전화 번호는 어드레스이고 포트 번. , IP

호는 교환번호라고 할 수 있다.

Page 276: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 276 -

소켓이란 네트워크에서 양쪽 응용 프로그램의 연결을 말한다 전화에서 전화TCP/IP TCP .

번호와 교환 번호를 이용해서 전화가 울리면 원하는 사람과 통화할 것이다 원하는 사람과.

연결된 것을 소켓이라고 할 수 있다.

그림 포트 소켓10-117. IP, ,

일반적으로 언어를 이용해서 네트워크 프로그램을 작성하는 경우 프로그램 절차는 다음C ,

그림과 같다.

그림 언어에서 프로그램 작성10-118. C TCP

언어를 이용하는 경우 서버 프로그램은 소켓을 생성하고 를 이용해서 소켓과 어드C , bind()

레스 및 포트를 결합시킨다 서버는 다시 함수를 호출하고 함수를 호출해서. listen() , bind()

클라이언트로부터 요청이 올 때까지 블록 되어서 기다린다 함수는 클라이언트로부. accept()

터 요청이 오면 클라이언트와 통신할 수 있는 소켓을 만들어서 리턴 한다 리턴 된 소켓을.

통해서 서버와 클라이언트는 함수를 이용해서 통신할 수 있다read()/write() .

Page 277: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 277 -

클라이언트에서는 소켓을 생성하고 함수를 통해서 서버에 연결을 시도한다, connect() .

를 호출하면 서버에서는 함수가 실행된다 서버와 연결되면 소켓을 통해connect() accept() .

를 할 수 있다read/write .

그럼 자바에서는 어떻게 네트워크 프로그램을 작성할 수 있을까 우선적으로 자바에서 네트?

워크 프로그래밍을 하기 위해서는 패키지를 이용해야 한다 언어 프로그램을 보java.net . C

면 서버 프로그램을 만들 때는 소켓을 만들고 하고 하는 일들이 항상 반복된, bind() listen()

다 자바에서는 이러한 반복 작업을 제거하기 위해서 서버소켓 이라는 클래스. (ServerSocket)

를 만들었다 클래스는 서버 측에서 사용되고 다음과 같은 생성자를 이용해. ServerSocket ,

서 만들 수 있다.

. ServerSocket(int port)

. ServerSocket(int port, int backlog)

. ServerSocKet(int port, int backlog, InetAddress bindAddr )

각 생성자의 부분은 서버소켓이 사용할 포트 번호를 표시한다 포트 번호는 바이트port . 2

로 표현되기 때문에 0 ~ 2 16 사이의 값을 가질 수 있다 그러나 번까지는 보통-1 . , 0 1023~

시스템에서 사용할 목적으로 예약되어 있기 때문에 번 이후를 사용하는 것이 바람직하다1024 .

아규먼트는 클라이언트로부터 동시에 커넥션 요청이 오는 경우에 큐에 클라이언트의backlog

요청을 몇 개까지 기록할 것인가를 기술한다 따라서 는 큐의 최대 길이로 볼 수 있다. backlog .

보다 많은 클라이언트가 커넥션을 기다리고 있으면 나머지 클라이언트들은 커넥션 되backlog

지 않는다 은 서버 프로그램이 여러 개의 컴퓨터에서 작동되는 경우에 각 컴퓨터에서. bindAddr

커넥션을 받는 것이 아니라 특정한 컴퓨터의 포트만 이용해서 커넥션이 이루어지도록 할 때 사

용된다.

프로그래머는 서버소켓을 만들어서 메소드를 호출한다 메소드는 클라이언accept() . accept()

트로부터 커넥션이 요청될 때까지 서버를 블록시키고 있다가 클라이언트로부터 요청이 들,

어오면 클라이언트와 통신할 수 있는 클래스를 리턴 한다Socket .

클라이언트에서도 마찬가지로 반복되는 작업을 제거하기 위해 언어의 라는 함, C connect()

수를 호출할 필요가 없도록 소켓 이라는 클래스를 만들었다 클래스는 다음(Socket) . Socket

과 같은 생성자를 이용해서 만들 수 있다.

. Socket(String host, int port)

. Socket(InetAddress address, int port)

아규먼트는 컴퓨터의 이름을 기술하는 문자열이고 는 포트 번호를 의미한다host , post .

아규먼트는 어드레스를 나타낸다 자바에서는 어드레스를 위해address IP . IP InterAddress

클래스를 만들었다 클래스를 만든 후에는 클라이언트와 서버 사이에 데이터를 주고. Socket

받을 수 있는 스트림을 만들어야 한다I/O .

Page 278: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 278 -

소켓으로부터 데이터를 받아들이기 위해서는 이 필요하고 데이터를 전송하기InputStream ,

위해서는 이 필요하다 소켓에서 을 얻기 위해서는OutputStream . InputStream

메소드를 이용하고 을 얻기 위해서는 메getInputStream() , OutputStream getOutputStream()

소드를 이용한다 이러한 작업만 모두 이루어지면 클라이언트와 서버는 서로 데이터를 주고.

받을 수 있다.

채팅 프로그램10.2.2

다음은 의 저자인 가 자바월드에 기고한 프로그램 소"Java Network programming" Hughes

스를 수정한 채팅 프로그램이다 는 채팅 프로그램을 간단하고 깔끔하게 작성하였다. Hughes .

채팅 프로그램은 흔히 볼 수 있는 것이지만 막상 작성하려면 상당히 까다롭다 특히 여러.

개의 채팅 방이 있어서 방을 선택하게 프로그래밍 하려면 더욱 어려워진다 책에서는 간단.

하게 한 방에 들어온 사람들끼리 서로 채팅할 수 있는 프로그램을 작성해보자 우선 채팅을.

위한 채팅 서버가 있어야 한다 클라이언트가 접속해오면 채팅 서버는 연결을 만들어. TCP

주고 채팅 클라이언트 리스트에 등록시킨다 채팅 서버는 클라이언트를 등록시키고 다른, . ,

클라이언트로부터 접속이 오기를 기다려야 한다 때문에 클라이언트와 메시지를 주고받는.

다른 프로그램이 있어야 한다 이러한 역할을 하는 프로그램을 책에서는 클래. ChatHandler

스를 이용해서 만들었다 는 클라이언트로부터 메시지를 받아서 다른 클라이언. ChatHandler

트에 전달해준다 는 클라이언트들로부터 메시지가 오기를 기다려야하기 때문에. ChatHandler

하나의 로는 작업할 수 없다 따라서 각 클라이언트만 하나의 클ChatHandler . ChatHandler

래스가 필요하다 채팅 서버와 채팅 클라이언트의 관계는 다음 그림처럼 표현. ChatHandler,

될 수 있다.

Page 279: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 279 -

그림 관계10-120. ChatServer, ChatHandler, ChatApplet

는 채팅 서버 프로그램으로 채팅 클라이언트가 접속해오면 클라이언트에 매칭ChatServer

되는 를 만들어서 라는 벡터에 등록시킨다 가 등록되면ChatHandler handlers . ChatHandler

는 다른 클라이언트가 접속해오기를 기다린다ChatServer .

Page 280: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 280 -

설명

9 ServerSocket server = new ServerSocket (port);

포트 번호를 이용해서 서버 소켓을 만든다.

10 handlers = new Vector(2, 5);

클라이언트들을 등록할 장소로 라는 이름의 벡터를 만든다handlers .

11 while (true) {

서버는 클라이언트의 요청을 무한히 받아들이도록 한다.

12 Socket client = server.accept ();

서버는 클라이언트로부터 커넥션 요청이 있을 때까지 블록되서 기다린다 클라이언트에서.

커넥션 요청이 들어오면 메소드가 수행되어 클라이언트와 통신할 수 있는accept() Socket

클래스를 리턴 한다.

14 ChatHandler c = new ChatHandler (this, client);

클라이언트와 통신할 수 있는 소켓을 이용해서 클래스를 만든다ChatHandler .

15 handlers. addElement(c );

클라이언트를 벡터에 등록한다.

는 로부터 클 라이언과 통신할 수 있는 소켓을 아규먼트로 넘겨받는ChatHandler ChatServer

다 는 소켓을 이용해서 스트림을 생성한다 클라이언트의 메시지는. ChatHandler I/O .

의 을 통해 에 전달된다 채팅하기 위해서는ChatHandler OutputStream ChatHandler .

는 전달받은 메시지를 다른 모든 들에게 전달해주어야 한다 모든ChatHandler ChatHandler .

들은 의 에 등록되어 있기 때문에 를 이용하면 모든ChatHandler ChatServer handlers handlers

에 메시지를 전달할 수 있다 다음은 프로그램이다ChatHandler . ChatHandler .

Page 281: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 281 -

Page 282: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 282 -

Page 283: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 283 -

설명

5 public class ChatHandler extends Thread {

는 와 함께 서버측에서 실행된다 서버측의 모든 작업을ChatHandler ChatServer . ChatServer

가 할 수 없다 왜냐하면 는 다른 클라이언트의 커넥션을 기다려야 하기 때문에. ChatServer

채팅에 필요한 작업들을 수행할 수 없다 그래서 채팅에 필요한 작업들은 다른 쓰레드에서.

작업해주어야 한다 이렇게 클라이언트의 요청을 처리하는 쓰레드들이 따로 있는 경우를 멀.

티쓰레드 통신이라고 한다.

15 i = new DataInputStrem (new BufferedInputStream (s. getInputStrea()));

16 o = new DataOutputStrem (new BufferedOutputStream (s. getOutputStrea()));

소켓을 이용해서 스트림을 생성한다I/O .

22 String msg = i. readUTF ():

소켓에서 데이터를 읽어오기 위해 의 메소드를 호출한다DataInputStream readUTF() . UTF

는 유니코드를 코드 형태로 표현하는 포맷을 말한다ASCII .

38 protected void broadcast (String message) {

메소드는 의 벡터에 등록된 모든 클라이언트들에게broadcast ChatServer handlers message

라는 문자열을 전달한다.

39 synchronized (server.handlers) {

데이터가 전달되는 동안에 새로운 클라이언트가 등록이나 삭제되지 않도록 문synchronized

장을 사용한다.

45 c. o. writeUTF (message);

의 벡터에 등록된 클라이언트들의 의 메ChatServer handlers DataOutputStream whteUTF()

소드들 이용해 데이터를 전달한다.

47 c. o .flush ();

버퍼에 저장된 내용을 즉시 전달하도록 한다.

이제까지 채팅 서버를 작성했다 이제는 채팅 클라이언트 프로그램을 작성해보자 채팅 클라. .

이언트는 웹브라우저에서 동작되도록 애플릿으로 작성하였다 채팅 클라이언트. ChatApplet

은 채팅 서버와 통신하기 위한 소켓을 생성하고 그 소켓을 이용해서 스트림을 생성한, I/O

다 은 사용자의 입력을 서버에 전달하는 작업과 서버로부터 전달되는 메시지를. ChatApplet ,

읽어서 화면에 출력시키는 작업을 동시에 수행해야 한다 두 가지 작업을 동시에 수행하기.

는 어렵기 때문에 쓰레드를 사용하는 것이 편리하다 프로그램의 일부는 사용자의 입력을.

서버측에 전달하고 다른 쓰레드는 서버로부터 전달되는 메시지를 읽어 화면에 출력한다 다, .

음은 프로그램이다ChatApplet .

Page 284: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 284 -

Page 285: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 285 -

Page 286: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 286 -

설명

18 public void init () {

애플릿의 메소드에서 채팅 클라이언트의 각 컴포넌트를 만들고 애플릿에 붙인다init() .

43 listener = new Thread (this);

44 listener.start ();

애플릿이 작동하면서 채팅 서버로부터 오는 메시지를 받기 위한 쓰레드를 하나 만들어 실행

시킨다.

62 Socket s = new Socket (host, Integer.parseInt (port));

어드레스와 포트 번호를 이용해서 소켓을 생성한다 이 소켓은 서버와 연결돼서 블록되IP .

여 있던 서버를 깨워서 메소드를 수행하도록 한다accept() .

63 i = new DataImputStream (new BufferedInputStream (s.getInputStream ()));

64 o = new DataOutputStream (new BufferedOutputStream (s.getOutputStream ()));

소켓을 이용해서 스트림을 만든다I/O .

76 while (!stop) {

77 String line = i.readUTF ();

채팅이 종료될 때까지 계속해서 서버로부터 오는 메시지를 읽는다.

113 } else if(c == input) {

114 try {

115 o.writeUTF (input.getText());

116 o.flush ();

채팅하는 사람이 이라는 텍스트 필드에 글을 쓰고 엔터를 치면 가 발생해input ActionEvent

Page 287: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 287 -

서 의 메소드를 통해 메시지를 서버로 전송한다DataOutputStream whiteUTF() .

Page 288: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 288 -

이제 채팅 서버를 실행시키고 채팅을 해보자.

서버 실행시키기

% java ChatServer 9830 &

클라이언트 실행시키기

% appletviewer ChatApplet.html

그림 결과10-121. ChatApplet

화이트보드 작정10.3.3

채팅 프로그램은 매우 유용한 프로그램이다 왜냐하면 대부분의 네트워크 프로그램이 채팅.

프로그램을 조금 변형한 형태를 띠고 있기 때문이다 따라서 채팅 프로그램을 잘 알아두면.

다른 형태의 네트워크 프로그램에 적절히 적용할 수 있을 것이다.

다음은 채팅 프로그램을 조금 변경해서 인터넷상에서 공동으로 그림을 그릴 수 있는 화이트

보드를 작성해보자 채팅프로그램에서는 사용자가 키 입력을 하고 엔터 키를 치는 경우에.

메시지가 서버에 전달되었다 그러나 화이트보드에서는 마우스를 클릭하거나 드래그하는 경.

우에 마우스의 위치 정보를 서버 측에 전달한다 서버 측은 전달받은 메시지를 모든 클라이.

언트에 전달한다 다시 클라이언트들은 메시지를 해석해서 적당한 형태의 도형으로 변환하.

여 화면에 보여준다.

화이트보드 서버 는 채팅 서버와 동일하다(WhiteServer.java) .

Page 289: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 289 -

클래스도 클래스와 거의 동일하다 는WhiteHandler ChatHandler . WhiteHandler

와 달리 전달받은 메시지를 그대로 클라이언트들에게 전달하는 역할만 한다ChatHandler .

Page 290: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 290 -

Page 291: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 291 -

이제까지는 화이트보드의 서버측면을 살펴보았다 화이트보드의 서버는 채팅 서버와 내용이.

거의 동일하다 이제는 화이트보드 클라이언트를 살펴보자 채팅에서는 문자만 사용되기 때. .

문에 채팅내용을 출력하기에 텍스트 영역만 있으면 되었지만 화이트보드에서는 그림을 표현

해야하기 때문에 그림을 그릴 수 있는 클래스가 필요하다 는 캔버스 클래스로부. WCanvas

터 상속받은 클래스로서 새로운 그림이 그려질 때마다 화이트보드 서버에 정보를 전달하고,

그림을 관리하는 역할을 하는 프로그램이다 현재 책에서 다루는 화이트보드는 사각형과 직.

선을 지원하고 있으며 한번 그려진 그림은 수정할 수 없다 사각형과 직선을 표현하기 위해, .

에는 과 클래스를 포함하고 있다 는 마우스가 눌려질 때 클래WCanvas Line Rect . Rect Rect

스에 관한 정보가 서버에 전달되고 은 마우스가 드래그 될 때 정보가 서버에 전달된다, Line .

다음의 코드를 살펴보자Wcanvas.java .

Page 292: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 292 -

Page 293: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 293 -

Page 294: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 294 -

Page 295: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 295 -

다음은 를 포함할 애플릿 프로그램이다 에는 와 다른 컴포넌트WCanvas . WApplet WCanvas

들을 포함하고 화이트보드 서버에서 읽어온 정보를 에 전달할 쓰레드를 가지고, WCanvas

있다.

Page 296: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 296 -

Page 297: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 297 -

그림 결과10-122. WApplet

간단한 소켓 프로그램들10.3

프로그램10.3.1 ping

유닉스나 도스에서 사용되는 프로그램은 네트워크로 연결된 다른 컴퓨터가 현재 작동ping

중인지 알아보는 유용한 프로그램이다 프로그램은 프로토콜을 사용하고 있기. ping ICMP

때문에 자바를 이용해서 프로그래밍 하기는 어렵다 따라서 이곳에서는 과 유사한 기능. ping

을 할 수 있는 프로그램을 유닉스의 프로토콜을 이용해서 작성해보도록 하자 프echo . echo

로토콜은 번 포트를 사용하면서 전달받은 메시지를 그대로 전송자에게 재 전송해주는 특징7

이 있다 우선 을 이용해서 간단하게 가 작동되는 모습을 살펴보자 은 다음. telnet echo . telnet

과 같이 컴퓨터 이름 혹은 주소 과 포트 번호를 같이 사용할 수 있다( IP ) .

telnet computer_name port_number

프로토콜이 작동되는 모습을 보았으니 이것의 특징을 이용해서 프로그램을 작성echo , Ping

해보자 프로토콜의 특성을 이용하면 소켓을 만들어 서버에 메시지를 보내고 서버로. echo ,

부터 오는 메시지를 읽어서 보낸 메시지와 동일한가 알아볼 수 있다 만약 동일하다면 서버.

컴퓨터가 작동중이다.

Page 298: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 298 -

뉴스 읽기10.3.2. : Network News Transfer Protocol(NNTP)

는 뉴스의 배포 포스팅 검색에 관련된 프로토콜이다 는 중앙의 데이터베이스NNTP , , . NNTP

에 뉴스 기사들이 저장되고 독자들은 원하는 기사를 읽을 수 있도록 설계되었다 에, . NNTP

관련된 문서는 과 에 자세히 설명되어 있다 뉴스 그룹은 주제별RFC977 RFC1036, RFC850 .

로 분류되어 있으며 많은 사람들이 이용하기 때문에 각 주제에 맞는 내용을 포스팅해야 한,

다 내용에 맞지 않는 뉴스 기사를 올리는 것은 실례가 된다 또한 뉴스 그룹을 처음 이용하. .

는 이용자는 우선적으로 뉴스 그룹의 글을 여러 번 읽어보고 테스트용 뉴스 그룹에서 글을,

올려 본 후에 주제에 맞는 뉴스그룹에 글을 포스팅하기 바란다 는 번 포트를 사. NNTP 119

용한다.

다음은 뉴스 기사의 예이다 뉴스의 기사는 다음과 같은 포맷으로 구성되어 있다. .

Page 299: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 299 -

뉴스의 본문은 한 줄을 비우고 이곳에서부터 시작된다, .

명령어1. NNTP

클라이언트 프로그램을 작성하기 위해서는 의 명령어들을 알아둘 필요가 있NNTP NNTP

다 따라서 간단하게 명령어들을 알아보자. NNTP .

ARTICLE

뉴스 기사를 읽어오는 명령어이다 명령어는 다음과 같은 형태로 실행시킨다. ARTICLE .

ARTICLE <message-id>

ARTICLE [nnn]

GROUP

뉴스 그룹을 설정할 때는 명령어를 사용한다GROUP .

CROUP groupname

HELP

도움말이 필요한 경우에는 명령어를 사용한다HELP .

HELP

IHAVE

클라이언트가 뉴스 기사를 가지고 있는 것을 서버에 알릴 때 명령어를 사용한다IHAVE .

서버가 기사를 원하는 경우에는 뉴스 기사 전체를 넘겨줄 수 있다.

IHAVE <messageid>

Page 300: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 300 -

LIST

사용 가능한 뉴스 그룹들의 목록을 보여준다.

LIST

NEWNEWS

와 에 기술된 시간이후에 게시된 새로운 뉴스들의 를 보여준다date time id .

NEWNEWS newsgroup date time [GMT]

NEXT

뉴스를 읽으면 내부적으로 현재 뉴스 기사에 대한 포인터를 유지하고 있다 는 이 포. NEXT

인터를 다음 뉴스 기사로 이동시킨다.

NEXT

POST

뉴스 기사를 포스팅 한다.

POST

QUIT

뉴스서버와 연결을 종료한다.

QUIT

Page 301: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 301 -

을 이용한 뉴스 읽고 포스팅 하기2. telnet

간단하게 명령어들을 알아보았다 이제는 을 이용해서 실제로 뉴스 그룹에서NNTP . telnet

뉴스를 읽고 기사를 포스팅 하는 실습을 해보자 기사를 포스팅 할 때 기사의 끝을 표시하.

기 위해 마지막 줄에 을 넣는다'.' .

Page 302: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 302 -

Page 303: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 303 -

뉴스 읽는 프로그램 작성3.

뉴스를 읽고 포스팅 하는 프로그램을 썬의 패키지를 이용해서 작성해보자, sun.net.nntp .

패키지는 에 포함되어 있지만 문서화되어 있지는 않다 다음의sun.net.nntp JDK .

클래스는 뉴스 그룹에서 뉴스 헤더만 읽어오는 프로그램이다NntpHeader .

다음의 프로그램은 뉴스 그룹에 기사를 올리는 프로그램으로 패키지NntpPost sun.net.nntp

를 이용한다.

Page 304: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 304 -

Page 305: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 305 -

패키지를 사용하는 것이 프로그래밍하기 쉽지만 이 패키지가 문서화되어 있지sun.net.nntp ,

않기 때문에 일반적으로 사용하기 어렵다 따라서 앞에서 프로토콜을 이해하였으면. NNTP

소켓을 이용해서 프로그래밍 하는 것도 그리 어렵지 않다 다음은 소켓을 이용해서 뉴스 그.

룹의 제목만 출력하는 프로그램이다 뉴스서버는 번 포트를 사용한다 뉴스서버에서는 기. 119 .

사가 더 이상 없는 경우에는 시작되는 에러 메시지를 출력한다 이것을 이해하면 명. NNTP

령어와 소켓을 이용해서 간단하게 프로그램을 작성할 수 있다.

Page 306: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 306 -

틴 테스트

hush hush

nothing happened?

tracing the route

유스넷 연습입니다test .

나도 연습, posting test too

저는 아름다운 청년입니다Re: .

이제까지 패키지를 사용하는 방법과 소켓을 이용하는 방법을 통해서 간단히 뉴sun.net.nntp

스 헤더를 읽고 포스팅하는 프로그램을 작성해 보았다 이제 전체적으로 뉴스 그룹을 선택, .

하고 뉴스 제목을 읽어오고 뉴스 내용을 읽고 포스팅할 수 있는 프로그램을, , , NewsReader

작성해 보자 뉴스를 읽는 프로그램은 다음 그림처럼 구성되어 있다 프로그램에서는 뉴스. .

그룹을 변경할 수 있고 읽어올 뉴스의 수를 결정할 수 있고 원하는 기사를 읽을 수 있다, , .

그림 결과 뉴스 읽기10-123. NewReader ( )

에서 버튼을 클릭하면 아래 그림과 같이 기사를 포스팅 할 수 있는 프로NewsReader POST

그램이 작동된다 기사가 포스팅되는 뉴스 그룹은 현재 에서 선택된 뉴스 그룹. NewsReader

이 된다.

그림 포스팅하기10-124. NewsReader ( )

Page 307: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 307 -

Page 308: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 308 -

Page 309: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 309 -

Page 310: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 310 -

Page 311: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 311 -

10.3.3 SMTP(Simple Mail Transfer Protocol)

는 메일을 효과적이고 신뢰성 있게 전송하기 위한 프로토콜이다 데이터 스트림을 차SMTP .

례대로 전송할 수 있는 기능만 있으면 는 전송 시스템과는 무관하게 작동될 수 있다SMTP .

에 관한 자세한 내용과 설명은 인터넷 문서 에서 참고할 수 있다SMTP RFC 821 .

에서 통신 모델은 다음 그림과 같은 형태로 되어 있다 사용자의 메일 요청이 있으면SMTP .

는 와 양방향 전송 채널을 만든다 는 메일의sender-SMTP receiver-SMTP . receiver-SMTP

도착지이거나 중간 단계일 수 있다 채널이 만들어지면 는 메일 전송을 알리. sender-SMTP

기 위해 명령어를 에 보낸다 는 메일을 받을 준비가MAIL receiver-SMTP . receiver-SMTP

되어 있으면 메시지를 보낸다 는 메시지를 받으면 명령어를OK . sender-SMTP OK RCPT

이용해서 메일의 수신자를 알려준다 는 메일의 수신자에게 메일을 보낼 수. receiver-SMTP

있다면 에 메시지를 보낸다 이렇게 와 는sender-SMTP OK . sender-SMTP receiver-SMTP

상호 대화 방식으로 메일을 전달하게 된다.

그림 구성10-125. SMTP

명령어1. SMTP

HELO

와 간에 전송 채널을 만든다sender-SMTP receiver-SMTP .

HELO <SP> <domain> <CRLF>

Page 312: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 312 -

MAIL

에 메일을 보낼 것이라는 것을 알리고 메일 보내는 사람의 리턴 메일 주소receiver-SMTP ,

를 기입해서 정체성을 밝힌다.

MAIL <SP> FROM:<reverse-path> <CRLF>

RCPT

메일 수신자를 알려준다.

RCPT <SP> TO:<forward-path> <CRLF>

DATA

메일의 내용을 에 전송한다 메일의 끝은 으로 되어 있다receiver-SMTP . '.' .

DATA <CRLF>

QUIT

전송 채널을 닫는다.

QUIT <CRLF>

을 이용해서 메일 보내기2. telnet

는 번 포트를 이용한다 뉴스에서 기사를 포스트 할 때와 마찬가지로 메일의 끝을SMTP 25 .

표시할 때는 마지막 라인에 를 넣어주어야 한다'.' .

Page 313: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 313 -

10.3.4 Post Office Protocol - Version 3 (POP3)

메일을 읽기 위해 메일 서버에 연결해서 오랫동안 작업하는 경우에 자원의 낭비를 가져올

수 있기 때문에 클라이언트에서 메일을 간단하게 관리할 수 있게 개발된 것이 프로토, POP

콜이다 서버는 포트 을 사용하면서 클라이언트로부터 요청이 오는 경우에. POP3 TCP 110

클라이언트의 요청과 서버의 응답이라는 상호 대화 방식으로 서비스를 해준다 서버 측의.

응답에는 서버의 상태를 표시하는 메시지를 포함한다 예를 들면 서버는 클라이언트의 요청. ,

이 성공적으로 수행된 경우에는 메시지를 실패한 경우에는 메시지를 보낸"+OK" , "-ERR"

다 에 관한 자세한 내용은 에서 참고할 수 있다. pop3 RFC 1725 .

명령어1. POP3

USER

서버에 사용자 를 전달한다POP3 id .

USER user_name

PASS

서버에 사용자의 암호를 전달한다POP3 .

PASS password

QUIT

연결을 끊으면서 삭제 마크가 있는 경우에 메일을 삭제한다TCP .

QUIT

STAT

상태를 알려준다 명령어의 응답은 형태인데 은 메일의 갯수를. STAT "+OK nn mm" , nn

은 메일의 크기를 알려준다mm .

STAT

LIST

메일의 리스트들을 보여준다 명령어의 아규먼트로 메시지 번호를 부여하면 리스트. LIST

스캐닝이 일어난다.

LIST [msg ]#

Page 314: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 314 -

RETR

메일의 내용을 보여준다 명령어에 메시지 번호를 부여하면 해당 번호의 메일 내용. RETR

을 보여준다.

RETR msg#

DELE

메일에 삭제 마크를 붙인다.

DELE msg#

NOOP

아무 작업도 하지 않는다.

NOOP

RSET

의 메일 상태를 초기화시킨다 삭제 마크가 부여된 메일이 있는 경우에는 삭제 마크가POP3 .

없어진다.

RSET

응답2. pop3

+OK

-ERR

을 이용한 메일 읽기3. telnet

는 번 포트를 이용한다POP3 110 .

Page 315: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 315 -

Page 316: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 316 -

메일을 읽고 보내는 프로그램4. MailReader :

와 유사한 방식으로 메일을 읽고 보낼 수 있는 프로그램을 작성해보자 앞에서NewsReader .

배운 와 를 이용하면 간단하게 프로그램을 작성할 수 있을 것이다 우선 메일을SMTP POP3 .

읽는 프로그램은 다음 그림처럼 되어 있다 프로그램의 상단에는 메일의 제목이 있고 가운.

데에는 메일의 내용이 있다.

Page 317: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 317 -

그림 결과 메일 읽기10-126. MailReader ( )

처음에 메일을 를 이용해서 서버로부터 가져와야 한다 그러나 서버가 지정되어 있지POP3 .

않으면 다음 그림과 같은 창이 화면에 나타나서 서버를 지정하도록 한다.

그림 메일 서버 지정10-127.

를 이용하기 위해서는 사용자 로그인 아이디와 암호가 필요하다 사용자 아이디와 암POP3 .

호가 지정되지 않았거나 틀린 경우에는 아래 그림과 같은 창이 화면에 나타나서 내용을 입,

력하도록 한다.

그림 사용자 와 암호 입력10-128. ID

서버와 사용자 정보가 올바른 경우에 프로그램은 서버로부터 메일을 가져올 수MailReader

있다 에서 버튼을 클릭하면 메일을 보낼 수 있는 다음 그림과 같은. MailReader "Send Mail"

창이 화면에 나타난다 이 프로그램은 프로토콜을 이용해서 메일을 전송한다. SMTP .

Page 318: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 318 -

그림 메일 작성10-129.

실제 프로그램을 살펴보자.

Page 319: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 319 -

Page 320: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 320 -

Page 321: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 321 -

Page 322: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 322 -

Page 323: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 323 -

Page 324: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 324 -

Page 325: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 325 -

10.4 DatagramSocket

는 신뢰성이 있는 반면에 초기에 연결하는데 많은 자원이 소모되기 때문에 간단한 메TCP

시지 전달은 대신에 를 사용하기도 한다 를 사용하는 경우에는 메시지 전달TCP UDP . UDP

여부를 보장할 수 없고 메시지가 전달되더라도 중복되거나 순서가 달라질 수 있다 자바에, .

서 를 사용하는 경우에 그림 과 같은 순서에 따라 프로그램을 작성할 수 있다 클UDP 10-18 .

라이언트와 서버는 모두 클래스를 만들고 서로간에 통신은DatagramSocket ,

클래스를 이용해서 패킷단위로 정보가 이동된다 클래스DatagramPacket . DatagramSocket

는 다음과 같은 생성자를 이용해서 만들 수 있다.

. 로컬 컴퓨터의 사용 가능한 임의의 포트를 사용한다DatagramSocket() - .

. 로컬 컴퓨터의 주어진 포트를 사용한다DatagramSocket(int port) - .

. 주어진 주소와 포트 번호를 사용한다DatagramSocket(int poIt,InetAddress laddr) - .

클래스는 크게 데이터를 받기 위한 용도와 데이터를 보내기 위한 용도로DatagramPacket

사용될 수 있으며 용도에 따라 다른 생성자를 이용해서 만든다 다음 두 개의 생성자는 데, .

이터를 받는 경우에 사용되는 을 만든다DatagramPacket .

Page 326: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 326 -

. DatagramPacket(byte[] buf, int length)

. DatagramPacket(byte[] buf, int offset, int length)

다음 두 개의 생성자는 데이터를 보내기 위해 사용되는 을 만든다DatagramPacket .

. Datagrampacket(byte[] buf, int length, InetAddress address, int port)

. DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)

그림 자바 프로그램 작성10-130. UDP

Page 327: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 327 -

Page 328: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 328 -

설명

12 socket = new DatagramSocket(1268);

포트를 사용하는 클래스를 만든다l268 DatagramSocket .

30 packet = new DatagramPacket(buf, 1024);

배열을 아규먼트로 갖는 데이터 수신용 을 만든다buf DatagramPacket .

31 socket.receive(packet);

32 int len = packet.getLength();

패킷을 이용해서 데이터를 수신하고 수신된 데이터의 길이를 알아본다, .

41 packet = new DatagramPacket(buf, buf.length, address, port);

42 packet.setLength(dString.length));

43 socket.send(packet);

데이터 발신용 패킷을 만들고 데이터의 길이를 패킷에 지정하고 패킷을 전송한다, , .

Page 329: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 329 -

Page 330: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 330 -

그림 결과10-131. DatagramClient

설명

48 socket = new DatagramSocket();

을 하나 생성한다DatagramSocket .

57 Packet = new DatagramPacket(buf, buf,length, address, 1268);

서버에 전송한 내용과 서버 주소 및 포트 번호를 기술한 을 생성한다DatagramPacket .

58 socket.send(packet);

을 전송한다DatagramPacket .

자바를 이용한 응용 프로그램10.5 CGI

언어를 이용해서 응용 프로그램을 작성하는 것처럼 자바를 이용해서 응용C, Perl CGI , CGI

프로그램을 만들 수 있다 자바를 이용해서 응용 프로그램을 작성하기 위해서는. CGI

가 자바월드 에 기고하기 위해 작성한 클래스를Durante (http://www.javaworld.com/) cgi_lib

이용하는 것이 편리하다 다음에 나와 있는 클래스는 가 작성한 코드에서. cgi_lib Durante '₩'

문자를 사용하지 못하던 버그를 수정한 클래스이다.

Page 331: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 331 -

Page 332: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 332 -

Page 333: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 333 -

Page 334: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 334 -

이 클래스를 이용해서 출력하는 간단한 프로그램을 작성해보자 자바를cgi_lib World CGI .

로 이용하기 위해서는 원하는 작업을 수행하는 자바 클래스와 웹서버의 요청에 의해서CGI

자바 클래스를 실행시키는 부분이 필요하다 우선적으로 를 출력하는 자바 클. "Hello World"

래스를 만들어보자.

파일을 작성한 뒤에 를 이용해서 컴파일한다 이제는 웹서버가 요청하는HelloCGI.java javac .

경우에 클래스를 실행시켜줄 프로그램이 필요하다 이러한 구동 프로그램은 보통HelloCGI .

간단한 쉘 스크립트를 이용하는 것이 보통이다 클래스를 구동시키는 쉘 스크립트. HelloCGI

를 이라는 파일에 작성해보자javacgi.pl .

Page 335: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 335 -

결과

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

그림 결과10-132. HelloCGI

를 이용한 정보 검색10.6 CGI

과학 논문을 검색하기 위해 년대부터 발달하기 시작한 정보 검색은 대학교 연구소 도서1940 / /

관 등에서 엄청난 문서들 속에서 원하는 정보를 검색하도록 도와주고 있다 또한 정보 검색.

은 인터넷이 발달하면서 그 중요성은 더욱 가중되고 있다 정보 검색은 사용자의 질의어에.

매치 되는 적절한 문서들을 사용자에게 제공하는 역할을 한다 다음 그림은 일반적인 정보.

검색 시스템의 작업을 보여준다 인터넷서치 엔진인 경우에는 인터넷에서 문서들을 가져올.

수도 있을 것이다 문서들은 문서 번호를 부여받고 문서의 내용은 단어로 처리된다 각 단. , .

어들은 불용어 처리 단계를 거치면 불용어 들이 제거되고 의미 있는 단어들만 남(stop list)

게 된다 불용어란 전치사 관사 등 많이 사용되지만 정보 검색에서 별로 의미가 없는 단어. ,

를 말한다.

의미 있는 단어들은 다시 어근 처리 단계를 거쳐 어근 형태로 가중치 값을 가지고 데이터

베이스에 저장된다 데이터 베이스는 꼭 일 필요는 없다 데이터 베이스는 역파일. DBMS .

시그니쳐 팻트리 그래프 해싱 등의 형태로 관리된다(inverted file), (signiture), (Pat trees), , .

정보 검색에 관한 자세한 내용은 의Williams B. Frakes "Information Retrieval Data

책을 참조하기 바란다Structures & Algorithms" .

Page 336: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 336 -

그림 정보 검색 작업 단계10-21.

이 장에서는 정보 검색에서 가장 간단한 역파일을 만들어서 사용자의 질의어에 맞는 정보를

추출하는 방법을 알아보자 문서 번호가 할당된 여러 개의 문서들이 있고 각 문서에 키워드. ,

들이 있다고 가정하자 각 키워드는 소속된 문서 번호 정보를 가지고 있다 키워드를 알파벳. .

순으로 정렬하면 사용자 질의어에 따라 키워드만 찾으면 키워드가 소속된 문서를 쉽게 찾을

수 있다 이 알파벳순으로 정렬된 키워드 파일을 역파일이라고 한다 역파일은 배열 트리. . /B

해싱 구조 등 다양한 자료 구조를 이용해서 작성할 수 있다 이곳에서는 배열을 이용/trie/ .

하는 방법을 알아보자 배열을 이용해서 역파일을 만드는 절차는 다음 그림과 같다 먼저 입. .

력된 파싱 과정을 통해 문서는 문서에서 위치에 따라 단어의 연속으로 분리된다 파싱 과정.

을 통과한 단어는 문서 내에서 단어의 위치순으로 정렬되어 있다 이것을 역파일로 만들기.

위해서는 단어의 알파벳순으로 정렬해야한다 정렬과정을 통과한 단어들은 중요도에 따라.

가중치 값을 가질 수 있다.

Page 337: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 337 -

그림 키워드 처리10-134.

배열을 이용해서 역파일을 효과적으로 만드는 방법이 버지니아 공대에서 에Edward A. Fox

의해 라 불리는 알고리즘이 개발되었다 각 페이지의 중요한 단어들은 컨섭넘버FAST-INV .

라는 유일한 번호로 표현된다 의 입력은 문서 번호와 문서에(concept number) . FAST-INV

포함된 컨셉넘버의 쌍으로 된 도규먼트 벡터 파일 이다 도큐먼트 벡(document vector file) .

터 파일은 컨셉 넘버 순으로 정렬되어 있다 은 컨셉넘버에서 가장 큰 수라고 정의하. HCN

자 다음 그림은 가 작동하는 모습을 그림으로 보여주고 있다. FAST-INV .

그림 알고리즘10-23. FAST- INV

는 도큐먼트 벡터 파일을 입력으로 받아서 단계를 거쳐FAST-INV Preparation

과 파일을 만든다 단계는 다음과 같은 절차로 수행된LOADTABLE CONPTR . Preparation

다.

크기의 배열을 만들고 값을 모두 으로 초기화한다1. HCN cont_entries-cnt[] 0 .

Page 338: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 338 -

도큐먼트 벡터 파일에서 나올 때마다 의 값을 하나 증2. (doc#, con#) con_entries_cnt[cont#]

가시킨다.

배열을 파일에 저장한다3. con_entries_cnt[] CONPTR .

적당한 크기의 로드를 결정하고 파일을 작성한다 적당한 로드의 크기는4. , LOADTABLE .

메모리에서 한번에 처리될 수 있는 만큼의 데이터 양이다 그림에서는 로드의 크기를. 4, 3,

으로 정했다3 .

단계의 산출물인 은 단계를 거쳐 파일을 만든다Preparation LOADTABLE Splitting DVL .

파일은 각 로드마다 의 쌍을 갖는 파일이다 단계에서는DVL <doc#, con#> . Inverting DVL

파일과 파일을 이용해서 각 로드별로 컨셉넘버 순으로 정렬된 역LOADTABLE, CONPTR

파일 을 생성한다(INVERT) .

알고리즘이 작동되는 방법을 살펴보았으니 이제 도큐먼트 벡터 파일을 작성하FAST-INV ,

는 방법을 알아보자 도큐먼트 벡터 파일은 언어를 이용한 라는 프로그램을 통해서. per1 dvf

만들 수 있다.

는 문서를 읽고 단어를 추출해서 라는 파일에 기록된 불용어인지 판단해dvf common_word

서 불용어가 아닌 경우에 파일에 단어 컨셉넘버 데이터 베이스를 만든다 는ndbm < , > . dvf

또한 도큐먼트 벡터 파일을 만들어서 의 데이터를 저장한다<doc#, con#> .

Page 339: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 339 -

Page 340: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 340 -

은 유닉스에서 제공되는 쌍으로 되어 있는 데이터 베이스로서 키를 가dbm <key, content>

지고 값을 가져올 수 있는 일련의 라이브러리 함수들이다 을 이용해서 데이터 베이스. dbm

를 만들면 파일과 파일이 생성된다.dir .pag .

Page 341: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 341 -

이제 도큐먼트 벡터 파일이 만들어 졌으니 알고리즘을 이용해서 역파일FAST-INV

을 만들어 보자 다음의 파일은 도큐먼트 벡터 파일을 입력으로 받(lNVERT) . FastInv.java

아서 파일을 만드는 프로그램이다CONPTR, LOADTABLE, INVERT .

Page 342: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 342 -

Page 343: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 343 -

Page 344: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 344 -

Page 345: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 345 -

이제 역파일을 만들었으니 사용자 질의어를 받아서 정보를 검색하는 프로그램을 만들어야

한다 역파일을 이용해서 키워드가 속한 문서를 찾기 위해서는 다음 그림과 같은 절차의 작.

업이 필요하다.

그림 질의어 처리 과정10-136.

사용자의 질의어는 토큰으로 분리되어 각 파일에서 단어에 해당되는 컨섭넘버를 받아dbm

온다 파일은 컨셉넘버 순으로 정렬되어 있기 때문에 컨셉넘버를 알면 쉽게. CONPTR

을 알 수 있다 은 컨셉넘버가 역파일 에 존재하는 위치를 가리킨다offset . offset (INVERT) .

을 이용해 역파일의 내용을 읽으면 키워드가 속한 문서들의 번호를 알 수 있다 문서offset .

의 번호를 안 다음에는 각 문서의 시작 위치를 파일에서 알아보아야 한다.ind .

다음은 파일을 생성하는 프로그램이다.ind perl .

Page 346: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 346 -

% makeIndex documents documents.ind

다음은 파일의 내용을 확인하는 프로그램이다.ind perl .

Page 347: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 347 -

다음은 질의어 토큰을 잘라서 정보를 검색하는 프로그램이다 파일에 접근하기 위해서. dbm

네이티브 메소드 를 사용한다(JNI) .

Page 348: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 348 -

Page 349: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 349 -

Page 350: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 350 -

설명

28 int base[] = new int[15];

29 int docList[] = new int[14];

도큐먼트의 수가 개인 프로그램을 테스트하기 위해 배열의 크기를 로 했다 도큐먼14 15/14 .

트의 수가 달라지면 이 부분을 수정해야 한다.

50 Hashtable form_data = cgi_lib.ReadParse(System.in);

51

52 String query_field = (String)form-data.get("query_field");

의 을 받아들이기 위해서는 클래스의 메소드를 이용해CGI query string cgi_lib ReadParse()

서 을 만들고 의 메소드를 이용해서 값을 얻어온다Hashtable , Hashtable get() .

Page 351: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 351 -

다음은 자바 프로그램을 구동시키기 위한 프로그램이다 앞에서 네이티브 메소드를 이CGI .

용해서 라이브러리를 사용하기 때문에 프로그램에 라이브러리 패스CGI

를 설정해주어야 한다(LD-LIBRARY_PATH) .

Page 352: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 352 -

그림 검색화면10-137. 그림 검색결과10-138.

자바를 이용한 클라이언트10.7 CGI

와 이해10.7.l 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 .

Page 353: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 353 -

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

다음은 을 통해 가 작동하는 형태를 간단하게 알아보자 는 기본적으로telnet HTTP . HTTP

번 포트를 사용한다80 .

서버 측 응용프로그램10.7.2 CGI

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

Page 354: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 354 -

Page 355: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 355 -

클라이언트 프로그램10.7.3 CGI

대부분의 클라이언트는 의 태그를 이용한다 은 이상CGI HTML FORM . FORM HTML 2.0

에서 지원되는 태그이다 태그에는 와 두개의 어트리뷰트를 반. FORM METHOD ACTION

드시 기술해주어야 한다 는 나 을 사용할 수 있다 이것은 파라미터의. METHO POST GET .

값이 웹 서버 측의 응용 프로그램에 어떻게 전송되는가를 결정한다 은CGI . ACTION

에서 기입된 값들이 전송되어 처리되는 응용 프로그램을 나타낸다 다음은FORM CGI .

의 태그를 사용해서 를 이용할 수 있는 파일이다HTML FORM CGI .

이용1. Socket

태그를 사용하는 것이 를 이용하기에 편리하지만 자바를 이용해서도 응용FORM CGI CGI

프로그램과 작업할 수 있다 이것은 위에서 텔넷 프로그램을 이용하는 방법과 동일하다 즉. . ,

소켓을 이용해서 웹서버와 직접 통신하는 방식이다 다음 프로그램은 소켓. CGIsocket.java

을 이용해서 웹서버와 통신해서 프로그램을 구동시킨다CGI .

Page 356: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 356 -

Page 357: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 357 -

이용2. URLConnection

자바에서 를 이용하는 또 다른 방법은 소켓대신에 에서 지원하는GCI JDK URLConnection

클래스를 이용하는 방법이다 클래스를 사용하는 경우에 다음과 같은. URLConnection CGI

클라이언트 프로그램을 작성할 수 있다.

Page 358: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 358 -

이용3. AppletContext

클라이언트를 작성하는 또 다른 방법은 애플릿의 클래스를 이용하는 것CGI AppletContext

이다 이 방법은 다른 방법보다 좀 더 수월하게 프로그램을 작성할 수 있을 뿐만 아니라 웹. ,

브라우저의 웹 페이지를 다른 곳으로 이동시킬 수 있다는 장점이 있다.

Page 359: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 359 -

제 장 프로그래밍11 . JDBC

기본11.1 SQL

데이터 언어는 원래 년에 연구소에서 개발 발SQL(Structured Query Language) 1974 IBM

표한 에 연유한다 은 물론 오라클 사이SEQUEL(Structured English Query Language) . IBM ,

베이스 등 다른 회사에서 을 채택되어 을 지원하는 관계 데이터베이스 시스템이SQL SQL

많이 나오게 되었다 특히 은 와 에서 관계 데이터베이스의 표준 언어로 채택. SQL ANSI ISO

되어 더욱 중요해졌다.

은 문자 그대로 구조화 질의어이지만 단순한 데이터 질의어 이상의 역할을 한다 즉SQL . ,

데이터정의 데이터 조작 그리고 제어 기능을 모두 제공하고 있다 절에서는 의 사, , . 11.1 SQL

용법을 간단하게 살펴보도록 한다.

문장들11.1.1 DDL(Data Definition Language)

이 처리하는 대상은 기본적으로 테이블이다 이 테이블들은 기본 테이블 뷰 임시 테이SQL . , ,

블로 분류될 수 있다 기본 테이블은 문장에 의해 만들어진 테이블로 이름을 가지고. DDL

있으며 독자적으로 존재할 수 있는 테이블이다 뷰는 문장으로 만들어지지만 기본 테, . DDL ,

이블로부터 유도되는 가상 테이블이다 임시 테이블은 질의문 처리 과정의 결과로 만들어지.

는 테이블을 말한다.

에서 사용할 수 있는 문장들로는SQL DDL CREATE TABLE, DROP TABLE, ALTER

등이 있다 각 문장들의 사용법과 사용 예를 간TABLE, CREATE INDEX, DROP INDEX .

단하게 살펴보자.

문장Create table

기본 테이블을 생성하기 위한 문의 기본적인 형식은 다음과 같다 형태 부분에서create . []

로 묶어진 부분은 생략할 수 있는 부분이고 로 묶어진 부분은 반복할 수 있는 부분이다, {}* .

형태 :

기본 테이블 이름CREATE TABLE _ _

열 이름 데이터 타입( _ _ [NOT NULL]

열 이름 데이터 타입{, _ _ [NOT NULL]}*);

이 지원하는 데이터 타입은 여러 가지가 있는데 그 중에서 몇 가지 중요한 것을 살펴SQL

보면 다음과 같다.

Page 360: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 360 -

INTEGER 바이트정수: 4SMALLINT 바이트정수: 2FLOAT(n) 부동소수:DECIMAL(i, j) 고정소수:CHAR(n) 문자의문자열: nVARCHAR(n) 최대 문자의문자열: nDATE 날짜: (yyyymmdd)TIME 시간: (hhmmss)

예 :

create table orders

(order_num integer, cost integer, quantity integer)

Page 361: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 361 -

문장Drop table

생성된 기본 테이블은 문을 이용해서 제거할 수 있다drop .

형태 :

기본 테이블 이름DROP TABLE _ _ ;

예 :

drop table orders

문장Alter table

생성된 테이블에 새로운 열을 추가하고 싶을 때 문을 이용할 수 있다alter .

형태 :

테이블 이름ALTER TABLE _

열 이름 데이터 타입ADD _ _ ;

예:

alter table orders

add address varchar(60);

문장Create index

데이터베이스 성능을 향상시키기 위해 필요한 경우에는 문장을 이용해서 인덱create index

스를 만들 수 있다.

형태 :

인덱스 이름CREATE [UNIQUE] INDEX _

기본 테이블 열 이름 열 이름ON _ ( _ [ASC DESC] {, _ [ASC DESC]}*)   

[CLUSTER];

예 :

create index cost_index

on orders(cost):

문장Drop index

인덱스를 제거할 때는 문장을 사용한다drop index .

Page 362: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 362 -

형태 :

인덱스 이름DROP INDEX _ ;

예 :

drop index cost_index :

문장들11.1.2 DML(Data Manipulation Language)

데이터 조작문 에는 등 네 가지 유형이SQL (DML) SELECT, INSERT, DELETE, UPDATE

있다 각 문장들의 사용 방법을 간단하게 알아보자. SQL .

Page 363: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 363 -

문장Select

문장은 원하는 데이터를 검색하기 위해서 사용된다 문장을 이용한 검색 결과Select . select

는 다시 테이블이 된다.

형태 :

열 리스트SELECT [ALL DISTINCT] _ 

테이블 리스트FORM _

조건[WHERE ]

열 리스트[GROUP BY _ [ASC DESC]]; 

예 :

select order.*, items.*

from orders, items

where orders.order_num = items.order_num

order by orders.cost desc;

에서는 사용의 편리를 위해 집단 함수 를 제공한다 이 집단 함수SQL (aggregation function) .

들은 테이블의 한 열의 값 집합에 적용된다.

COUNT 값의개수:SUM 값의총계:AVG 평균값:MAX 최대값:MIN 최소값:

예 :

select count(*)

form orders

where cost > 500;

에서 문을 이용해서 정규 문법을 표현할 수 있다SQL LIKE .

예 :

select *

form orders

서울where address like ' %';

문에서 는 어떤 길이의 어느 문자와도 매치 된다 는 어느 한 문자와 매치 된다LIKE ‘%’ . ‘_’ .

문장Update

Page 364: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 364 -

기존 레코드의 열 값을 변경하기 위해서는 문을 이용한다UPDATE .

형태 :

테이블UPDATE

열 이름 산술식 열 이름 산술식SET _ = {, _ = }*

조건[WHERE ];

Page 365: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 365 -

예 :

update items

set price = price * 1.1

where cost > 100

문장Delete

기존 테이블의 행을 삭제할 때는 문을 이용한다DELETE .

형태 :

DELETE

테이블FROM

조건[WHERE ];

예 :

delete

from items

where order_num = 100

문장Insert

기존 테이블에 행을 삽입할 때는 문을 이용한다INSERT .

형태 :

INSERT

테이블 열 이름 열 이름INTO [( _ {[, _ ]}*]

값 리스트VALUES ( _ );

예 :

insert

into orders (order_num, cost, quantity)

values (200, 300, 20)

기초11.2 JDBC

란11.2.1 JDBC ?

과 그룹은 문을 지원할 수 있는 함수 호출 인터페X/Open SAG(SQL Access Group) SQL

이스 를 정의하고 있다 사의 는 대표적인 라고 할(CLI : Call Level Interface) . MS ODBC CLI

수 있고 도 의 일종이다 또한 대부분의 회사들은 자신의 에 최적화,JDBC CLI . , DBMS DBMS

Page 366: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 366 -

된 라이브러리들을 지원한다 각 에 최적화된 는 성능 면에서는 뛰어나지만CLI . DBMS CLI ,

마다 응용프로그램을 별도로 개발해야한다는 단점이 있다DBMS .

Page 367: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 367 -

반면에 나 는 각 에 최적화된 성능을 제공하지는 못하지만 개방성이라는, ODBC JDBC DBMS

장점을 가지고 있다 나 로 클라이언트 프로그램을 작성하면 를 변경하여.ODBC JDBC DBMS

도 응용 프로그램의 코드를 변경할 필요가 없다.

는 응용 프로그램들이 에 연결하고 데이터를 검색할 수 있도록 해주는 자바 클JDBC DBMS

래스들의 모임이다 는 다음과 같은 특성들을 가지고 있다. JDBC .

. 는 함수 호출용 인터페이스이다JDBC SQL .

. 는 표준을 지원한다JDBC ANSI SQL-92 .

. 는 공통된 인터페이스를 바탕으로 만들어졌다JDBC SQL .

. 는 배우고 사용하기 쉽다JDBC .

Page 368: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 368 -

는 응용 프로그램 드라이버 매니저 드라이버 의 부분으로 구성되어 있다JDBC , , , DBMS 4 .

각 부분들의 특성과 역할을 간단하게 살펴보자.

응용프로그램◎ 응용 프로그램은 메소드를 호출해서 문을 에 보내고: JDBC SQL DBMS ,

원하는 데이터를 검색한다.. 데이터베이스에 연결을 요청한다.. 데이터베이스에 문을 전송한다SQL .. 문의 결과를 요청한다SQL .. 오류가 발생하는 경우에 오류 처리를 한다.. 트랜잭션을 제어한다.. 연결을 끊는다.

드라이버매니저◎ : 드라이버매니저의주된작업은응용프로그램이요청하는드라이버를로드

하는 것이다.. 데이터베이스에 맞는 드라이버를 찾는다.. 초기화를 위한 작업을 수행한다JDBC .

드라이버◎ 드라이버는 데이터베이스에 문을 전송하기도 하고 검색 결과를 응용프: SQL ,

로그램에 전달하기도 한다.. 데이터베이스에 연결한다.. 데이터베이스에 문을 전송한다SQL .. 응용 프로그램에 검색결과를 전달한다.. 필요한 경우에 커서를 조작한다.. 필요한 경우에 트랜잭션을 시작한다.

DBMS◎ 데이터가 저장되어 있는 장소이다: .

간단한 프로그램 작성11.2.2 JDBC

이제 간단한 프로그램을 작성해보도록 하자 를 사용하는 경우에 에 관계JDBC . JDBC DBMS

없이 클라이언트 프로그램을 작성할 수 있다 이 책에서는. POSTGRES, MSQL, ORACLE,

를 사용하는 간단한 프로그램을 한번씩 소개하고 나머지는MS ACCESS , POSTGRES

를 이용한 예제 프로그램들을 소개한다 이 밖에 여러분이 다른 를 이용한다고DBMS . DBMS

하면 드라이버를 기술하는 부분에서 약간의 차이가 있을 수 있지만 그 의 다른 부분은 변,

경할 필요가 없다.

1. POSTGRES DBMS

포스트그레스 는 버클리 대학에서 프로젝트 수행으로 만들어졌고 이제는 자원(POSTGRES) ,

자들에 의해서 개량되고 있는 이다 현재 각종 유닉스용과 리눅스용이 개발되어 사용DBMS .

할 수 있다 포스트그레스 는 에서 무료로 다운로드 받아. DBMS http://www.postgresql.org/

Page 369: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 369 -

서 사용할 수 있다 다음은 유닉스에서 포스트그레스 버전을 인스톨하는. Solaris DBMS 6.0

방법이다.

Page 370: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 370 -

리눅스나 다른 유닉스용 인스톨 방법은 하이텔 천리안 등의 통신 자료 방을 참조하기/ PC

바란다.

가 설치. POSTGRES

파일을 다운로드 받는다1-1. postgresql-v6.0.tar.gz .

라는 사용자 계정을 만든다1-2. postgres .

압축된 파일을 디렉토리에서 푼다2. postgresql-v6.0.tar.gz /usr/src/pgsql .

% mkdir -p /usr/src/pgsql

% cp postgresql-v6.0.tar.gz /usr/src/pgsql

% cd /usr/src/pgsql

% gzip -d postgresql-v6.0.tar.gz Itar xvf -

Page 371: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 371 -

파일을 읽어본다3. INSTALL .

디렉토리로 이동해서 를 실행시켜 컴파일 준비 작업을 한다4. src , customize .

% customize

를 이용해서 컴파일 한다5. gmake .

% gmake all

컴파일이 정상적으로 완료된 경우에 설치한다 는 디렉6. . postgres DBMS /usr/local/pgsql

토리에 설치된다.

% gmake install

환경변수를 설정해준다 사용자는 다음 내용을 파일에 등록한다7. . C-shell ~/.cshrc .

% vi ~/.cshrc

setenv PATH $PATH:/usr/local/pgsql/bin

setenv MANPATH /usr/local/pgsql/man:$MAPATH

setenv PGLIB /usr/local/pgsql/lib

setenv PGDATA /usr/local/pgsql/data

% source /.cshrc~

데이터베이스를 생성한다8. .

% initdb

데이터베이스 접근 권한을 조정한다9. .

% vi /usr/local/pgsql/data/pg-hba.conf

% chmod 400 /usr/local/pgsql/data/pg_hba.conf

테스트를 한다 원하는 경우에 테스트는 생략하고 번으로 갈 수 있다10. regression . , l2 .

% postmaster &

% setenv TZ PST8PDT

% cd /usr/src/pgsql/src/test/regress

% gmake clean

% gmake all runtest

% diff -w expected.out regress.out

% destroydb regression

% cd /usr/src/pgsql/src/test/regress

% gmake clean

Page 372: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 372 -

를 중지시키고 타임존을 원상태로 변경한다11. postmaster , .

% ps -ef lgrep postmaster

jmchoi 15912 6307 0 23:29:15 pts/7 0:00 postmaster

% kill -9 15912

% setenv TZ ROK

부팅 시에 데이터베이스 데몬이 실행되도록 한다12. .

% vi /etc/rc3

# postgres DBMS v.6.0

if [ -f /usr/local/pgsql/bin/postmaster ]; then

su postgres -c "/usr/local/pgql/bin/postmaster -S -D /usr/local/pgsql/data"

echo " POSTGRES DBMS ready"

fi

Page 373: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 373 -

나 데이터베이스 만들기.

포스트그레스에서 데이터베이스를 만들기 위해서는 명령어를 사용한다createdb .

% createdb mydb

데이터베이스를 만든 다음에는 명령어를 이용한다psql .

볼드체로 된 글은 사용자의 입력이다 테이블을 만들고 내용을 검색하는 것은 장에서. 11.1

배운 것과 동일하다.

Page 374: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 374 -

다 이용해서 데이터베이스 접근하기. DBC

자바 가 디렉토리에 설치되어 있다면 포스트그레스 용 드JDK /usr/local/java , 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

과 사용자는 다음 내용을 파일에 추가한다Boume-Shell Kom-Shell $HOME/.pronle .

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

export $CLASSPATH

추가한 후에 다음 명령어를 수행한다.

# . $HOME/.profile

드라이버를 설치하면 프로그램을 작성하기 위한 준비 작업은 끝났다 이제 프JDBC . JDBC

로그램을 작성해보자.

Page 375: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 375 -

설명JdbcTest

프로그래밍은 다음과 같은 절차에 따라 프로그램을 할 수 있다JDBC .

가 각 데이터베이스에 맞는 드라이버를 메모리에 로드한다. JDBC .

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

용 드라이버를 생성했다 드라이버는 생성되면서 메모리에 로드되고 자동적으로POSTGRES .

드라이버 매니저에 등록된다.

나 의 메소드를 이용해서 데이터베이스에 연결한다. DriverManager getConnection() .

메소드는 을 리턴 한다getConnection() Connection .

12 Connection conn = DriverManager.getConnection(url, "user-id", "password");

드라이버 매니저의 메소드를 이용해서 데이터베이스에 연결한다 드라이버getConnection() .

매니저는 내부적으로 을 보고 적당한 드라이버를 찾아 드라이버를 이용해서 데이터베이url

스와 연결한다 메소드는 데이터 베이스와 연결되면 객체를 리. getConnection() Connection

턴 한다 데이터 베이스에 연결할 때 어떤 는 사용자의 로그인 와 패스워드를 원하. DBMS ID

는 경우도 있다.

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

14 Statement stat = conn.createStatement();

라 의 메소드를 이용해서 문장을 데이터베이스에 전달한다. Statement executeQuery() SQL .

메소드는 을 리턴 한다 은 테이블 형태로 되어 있다executeQuery() ResultSet . ResultSet .

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

마 은 테이블 형태로 되어있기 때문에 를 이동하면서 결과를 검색한다. ResultSet cursor .

메소드는 를 한 행씩 이동시킨다 가 위치한 행에서 각 필드의 값을 검next() cursor . cursor

색하기 위해서는 함수를 이용한다 주의할 점은 값을 한번 읽으면 다시 접근할 수getXXX() . ,

없다는 사실이다.

Page 376: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 376 -

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

다.

Page 377: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 377 -

2. mSQL DBMS

가 설치. mSQL

은 로서 널리 알려진 공개 이다 호주의 에서 제공하mSQL mini SQL DBMS DBMS . Hughes

고 있으며 가격은 저렴하지만 공짜는 아니다 다운받아서 사용하는 경우 일 동안 무료로, . 14

사용할 수 있다 은 사이트에서 다운로드 받을 수 있다. mSQL http://www.Hughes.com.au/ .

다음은 유닉스에서 버전을 설치하는 예이다Solaris 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

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

다.

계정을 만든다11. msql .

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

Page 378: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 378 -

파일을 만들어 준다13. ACL .

% cd /usr/local/Hughes

% cp msql.acl.sample msql.acl

루트 권한으로 데몬을 실행시킨다14. msql .

% /usr/local/Hughes/bin/msql2d

필요한 경우에 이 어떤 포트를 사용하는지 알아본다15. mSQL .

% more /usr/local/Hughes/msql.conf

나 에서 사용하기. mSQL 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/dasses:$CLASSPATH

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

Page 379: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 379 -

Page 380: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 380 -

를 이용한 자바 프로그램을 작성한다5. JDBC .

자바 프로그램을 컴파일한다6. .

% javac mydb.java

자바 프로그램을 실행시킨다7. .

% java mydb

City :SEOUL

Temperature :20

설명

2 import com. imaginary.sql.msql.*;

용 드라이버 패키지를 하였다mSQL import .

7 new MsqlDriver();

용 드라이버를 생성한다 의 드라이버와 마찬가지로 도 생성되mSQL . POSTGRES MsqlDriver

면서 드라이버 매니저에 자동적으로 등록된다.

8 String ur1="jdbc:msql://203.253.259.3:1114/mydb";

데이터베이스에 접근하기 위해서 을 기술하였다 드라이버 이름은 이고mydb jdbc url . msql ,

데이터베이스가 있는 컴퓨터의 는 이고 포트는 번이다IP 203.253.259.3 1114 .

3. ORACLE DBMS

오라클은 국내에서 가장 널리 사용되는 로서 업체 및 관공서 학교 등에서 많이 사용DBMS ,

된다.

Page 381: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 381 -

오라클용 드라이버 오라클 사이트 에서 무료로JDBC JDBC Driver (http://www.oracle.com/)

다운로드 받아서 사용할 수 있다 오라클에서는 과 두 가지 타입의. JDBC Thin JDBC OCI

를 제공하고 있다 은 자바로 작성된 네트워크 드라이버이고 는JDBC . JDBC Thin , JDBC OCI

네이티브 메소드로 작성된 드라이버이다 는 네이티브 메소드로 작성되었기 때문. JDBC OCI

에 애플릿에서는 사용할 수 없다 다음의 은 드라이버를 이용해. JdbcOracle.java JDBC Thin

서 작성한 예제 프로그램이다.

설명

14 DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

오라클용 드라이버를 드라이버 매니저에 등록한다JDBC .

15 conn = DriverManager.getConnection (db_connect, db_user, db_passwd);

데이터 베이스에 연결하기 위해 함수를 호출한다 는getConnection() . db_connect

값을가지고있는데"jdbc:oracle:thin:@mycom.soongsil.ac.kr:1521:ORA7" , "jdbc:oracle:thin:"

는 드라이버를 기술하고 은 컴퓨터 이름을 의미한다 은 포트 번, mycom.soongsil.ac.kr . 1521

호를 나타내고 은 데이터베이스 를 의미한다 데이터베이스, ORA7 SID(system identifier) .

는 필요한 경우에 데이터베이스 관리자에게 문의하기 바란다SID .

Page 382: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 382 -

를 사용하는 경우4. ODBC

는 데이터베이스 엔진에 접근할 수 있는 언어 기반의 인터페이스이다ODBC SQL C . ODBC

는 데이터베이스와 일관된 인터페이스로 통신할 수 있고 데이터베이스 메타 데이터에 접근

할 수 있는 인터페이스를 제공한다 데이터베이스 업체들은 업체 고유의 드라이버를 제공하.

거나 로 접근할 수 있는 브리지를 제공한다 따라서 와 를 이용하면 표준ODBC . SQL ODBC

화된 방법으로 데이터베이스에 접근할 수 있다 다음 예제는 사의 를. MS Access

브리지를 이용하는 프로그램이다 예제를 살펴보면 알 수 있듯이 드라ODBC-JDBC . JDBC

이버를 기술하는 부분을 제외하고는 다른 를 사용하는 방법과 동일하다DBMS .

Page 383: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 383 -

설명

사이의 코드들은 데이터베이스 테이블을 생성하고 값을 입력하는 부분이다4 10, 26 28 .~ ~

따라서 이 부분은 처음 한번만 수행시키고 번 이상 수행시킬 때는 주석 처리를 해주어야2

한다.

13 String URL = "jdbc:odbc:mydb";

데이터베이스에 해당되는 을 기술한다 드라이버는 브리지를 사용JDBC URL . JDBC-ODBC

하고 데이터 소스 네임 은 이다, (DSN) mydb .

18 Class. forName("sun.jdbc.odbc.JdbcOdbcDriver");

썬에서 제공하는 드라이버를 드라이버 매니저에 등록한다JDBC-ODBC .

프로그래밍11.3 JDBC

와11.3.1 JDBC DBMS

프로그램은 다음 그림과 같은 절차로 실행된다 프로그래머는 클라이언트 부분만 절JDBC .

차에 맞게 프로그래밍 해준다 우선 드라이버를 드라이버 매니저에 등록하고 드라이버 매니. ,

저의 메소드를 이용해서 커넥션을 연다 메소드는getConnection() . getConnection()

객체를 리턴 하게 되고 객체를 이용해서 객체를 만든다Connection , Connection Statement .

객체는 문장을 데이터베이스 서버에 전송하는 역할을 한다 데이터베이스 서Statement SQL .

버는 문장을 수행하고 결과를 클라이언트에 전송한다 클라이언트에서는 메SQL . getXXX()

소드를 이용해서 결과를 얻게된다 모든 작업 끝나는 경우에는 객체와. Statement

객체를 메소드를 이용해서 닫는다Connection close() .

그림 클라이언트와 데이터 베이스 서버의 실행 절차11-1.

위에서 설명한 프로그램 절차를 다시 한번 기술해보자JDBC .

드라이버를 등록한다1. JDBC .

드라이버 매니저의 메소드를 이용해서 객체를 얻는다2. getConnection() Connection .

객체의 메소드를 이용해서 객체를 얻는다3. Connection createStatement() Statement .

객체의 나 메소드를 이용해서 을 데이터4. Statement executeQuery() executeUpdate() SQL

베이스 서버에 전송한다.

Page 384: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 384 -

객체의 메소드를 이용해서 문장의 실행 결과를 얻는다5. ResultSet getXXX() SQL .

객체와 객체의 메소드를 호출해서 커넥션을 닫는다6. Statement Connection close() .

다음 그림은 의 관계를 보여준다DriverManager, Connection, Statement, ResultSet .

그림 에서 중요한 인터베이스들 간의 관계11-2. JDBC

는 드라이버를 이용해서 여러 개의 을 만들 수 있다 각DriverManager Connection .

은 여러 개의 를 가질 수 있다 각 는 하나의 을 갖Connection Statement . Statement ResultSet

는다.

와 모델11.3.2 2 -tier 3-tier

는 와 를 모두 지원하고 있다 는 자바 애플릿이나 어플리케이션JDBC API 2-tier 3-tier . 2-tier

이 데이터베이스에 직접 접근하는 것을 말하고 란 클라이언트는 서비스를 위한 미들, 3-tier

티어 에 명령어를 보내고 미들티어가 데이터베이스에 접근하는 것이다(middle-tier) .

다음 그림은 를 사용할 때 의 일반적인 형태이다 자바 애플릿이나 어플리케이션JDBC 2-tier .

이 를 이용해서 의 데이터베이스에 직접 접근한다 이것은 가장 대표적인 클라JDBC DBMS .

이언트 서버 구조이다 자바 애플릿이나 어플리케이션은 클라이언트가 되고 는 서버/ . , DBMS

가 된다 형태는 프로그래밍이 간단하다는 장점이 있다 그러나 보안 로드 밸런싱. 2-tier . , ,

확장성 등에서는 문제점이 있기 때문에 요즘은 나 를 주로(load balancing), 3-tier multi-tier

사용한다.

그림 형태11-3.2-tier

는 자바 어플리케이션이나 애플릿이 를 직접 접근하는 것이 아니라 중간에 있3-tier DBMS

는 미들웨어 미들티어 를 거쳐 데이터베이스에 접근하게 되어 있다 형태는 보안 확( ) . 3-tier ,

장성 등에서 보다 뛰어나다2-tier .

Page 385: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 385 -

는 자바 애플릿에서 를 직접 접근하기 때문에 가 인터넷을 사용하는 사2-tier DBMS DBMS

람들 모두에게 노출된 상태이고 에 사용에 의해 이 직접 에 전달 실행되기, JDBC SQL DBMS /

때문에 해킹 당할 가능성이 높다 그러나 를 사용하는 경우에 중간에 있는 미들웨어. , 3-tier

는 해킹 의도가 있는 미심쩍은 명령어들을 체크해서 해킹을 방지할 수 있다.

를 사용하는 경우에 데이터베이스의 구조가 변경되었다고 가정해보자 데이터베이스의2-tier .

구조가 변경되면 데이터베이스를 직접 접근하는 모든 클라이언트들의 코드가 변경되어야 한

다 이것은 클라이언트의 수가 많은 경우에 상당히 많은 수정 작업을 필요로 한다 그러나. . ,

를 사용하는 경우에는 클라이언트가 데이터베이스에 직접 접근하는 것이 아니기 때문3-tier

에 클라이언트는 변경할 필요 없이 미들웨어만 변경해주면 된다 따라서 확장성 면에서도.

가 매우 뛰어남을 알 수 있다3-tier .

이밖에도 를 사용하면 미들웨어 부분에서는 한 곳의 서버에 많은 부하가 걸리3-tier DBMS

면 다른 에서 서비스를 해주는 로드 밸런싱 이나 많이 사용되는 데이DBMS (load balancing) ,

터는 미들웨어가 저장하고 있다가 서비스해주는 캐싱 기능 등을 제공할 수 있다.

그림 형태11-4. 3-tier

커넥션 열기11.3.3

데이터베이스와의 커넥션을 표현하기 위해서 클래스가 사용되고 한 응용 프로Connection ,

그램은 한 데이터베이스와 하나 이상의 커넥션을 가질 수 있고 여러 개의 데이터베이스와,

커넥션을 가질 수도 있다 데이터베이스와 커넥션을 여는 표준화된 방법은.

함수를 호출하는 것이다 이 메소드는 을 표현하는 문DriverManager.getConnection() . URL

자열을 아규먼트로 가지며 클래스는 에서 표현된 데이터베이스와 연결, DriverManager URL

될 수 있는 드라이버를 찾는다.

다음 코드는 에 위치한 데이터베이스를 사용자URL "jdbc:odbc:wombat" ID "oboy",

라는 암호를 이용해서 커넥션을 만드는 예이다"12Java" .

예 :

String url ="jdbc:odbc:wombat";

Connection con = DriverManager.getConnection(url,"oboy", "12Java");

는 데이터베이스를 지칭하기 위해서 다음과 같은 형태의 문법을 이용한다 이것JDBC URL .

을 보통 이라고 한다JDBC URL .

형태 :

jdbc:<subprotocol>:<subname>

란 프로토콜을 의미한다 은 사용될 드라이버 이름이나 데이터jdbc JDBC . subprotocol JDBC

베이스 연결할 때 사용되는 메커니즘 이름이다 부분은 사용될 데이터베이스 이름. subname

이다 은 에 따라 변경될 수 있으며 드라이버를 작성하는 곳의 문법에.subname subprotocol ,

Page 386: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 386 -

따라 을 가질 수 있다 중요한 것은 은 데이터베이스를 찾을 수 있는subsubname . subname

정보를 가지고 있다는 것이다 데이터베이스가 인터넷을 통해 접근될 수 있다면 네트워크.

주소와 포트 번호 등의 정보가 필요하다 따라서 의 은 일반적으로 다음과. , jdbc url subname

같은 형태를 갖는다.

Page 387: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 387 -

형태 :

//hostname:port/subsubname

다음은 을 사용한 예이다 라는 드라이버가 사용되고 는JDBC URL . postgres95 , DBMS

컴퓨터에 있다 포트는 를 사용하고 데이터베이스 이름은mycom.soongsil.ac.kr . TCP/IP 5432

이다mydb .

예 :

jdbc:postgres95://mycom.soongsil.ac.kr:5432/mydb

서브프로토콜은 특별한 케이스이다 서브프로토콜은 을 기술한 뒤에 다odbc . odbc subname

른 특성들을 기술할 수 있다 서브프로토콜의 일반적인 형태는 다음과 같다. odbc .

형태 :

jdbc:odbc:(data-source-name>[;<attribute-name>=<attribute-value>]*

다음은 의 사용 예들이다jdbc:odbc .

예 :

jdbc:odbc:sampledb

jdbc:odbc:qeora:UID=kgh;PWD=fooey

jdbc:odbc;wombat:CacheSize=20;ExtensionCase=LOWER

데이터베이스는 하나 이상의 드라이버를 이용해서 접근할 수 있다 는 드라. DriverManager

이버를 로드하고 드라이버의 특성을 처리할 수 있는 메소드들을 가지고 있다 드라이버 매, .

니저는 현재사용 가능한 드라이버들에 관한 정보를 가지고 있어야 한다 사용 가능한 드라.

이버에 관한 정보는 가지 방법으로 에 알려줄 수 있다2 JDBC .

가 프라퍼티를 사용하는 방법. jdbc.drivers

명령어 상에서 드라이버를 지정할 수 있다: .

예 :

java -Djdbc.drivers=pstgres95 mydb

애플릿이나 핫자바를 이용하는 경우에는 파일에 등록할 수도$HOME/.hotjava/properties

있다.

예 :

jdbc. drivers=postgres95

드라이버를 여러 개 지정하는 경우에는 으로 연결해서 지정할 수 있다':' .

예 :

java -Djdbc.drivers=postgres95:msql mydb

나 프로그램 내에서 지정하는 방법.

프로그램 내에서 드라이버를 로드해서 드라이버 메니저에 등록할 수 있다: .

예 :

Class. forName("sun.jdbc.odbc.JdbcOdbcDriver");

Page 388: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 388 -

예 :

Driver driver = new sun.jdbc.odbc.JdbcOdbcDriver():

java. sql. DriverManager.registerDriver(driver):

다음 그림은 와 와의 관계이다 에는 여러 개의DriverManager Driver . DriverManager Driver

가 등록될 수 있다.

그림 와 와의 관계11-143. DriverManager Driver

응용 프로그램에서 을 이용해서 연결을 요청하면 클래스는 현재 등jdbc url DriverManager

록되어 있는 드라이버들을 조사해서 에 맞는 드라이버를 찾아낸다 드라이버 매니저jdbc url .

는 이 드라이버를 이용해서 데이터베이스에 연결하고 클래스를 응용 프로그램에Connection

전달한다.

드라이버는 크게 가지 형태로 분류될 수 있다JDBC 4 .

브리지 드라이버를 통해서 데이터베이스에 접근할 수 있는 기능을1. JDBC-ODBC : ODBC

제공한다.

드라이버 이 드라이버는 일부분은 자바 언어로 일부는 다른 언2. native-API partly-Java :

어로 구현되었으며 호출을 오라클 사이베이스 혹은 다른 고유의 호출, JDBC , , DB2 DBMS

로 변경한다.

드라이버 이 드라이버는 모두 자바 언어로 구현되었으며3. net-Protocol all-Java : JDBC

호출을 에 독립적인 네트워크 프로토콜로 변경해준다 네트워크 프로토콜로 변경된 내DBMS .

용은 서버에 의해 해석된 후에 실행된다DBMS .

드라이버 이 드라이버는 모두 자바 언어로 구현되었으며 각4. native-protocol all-Java :

고유의 프로토콜에 맞게 호출을 변환해준다DBMS JDBC .

문장 전송하기11.3.5 SQL

커넥션이 한번 만들어지면 커넥션은 문장을 데이터베이스에 전송하는 작업을 수행한, SQL

다 는 전송되는 문장에 어떠한 제약 사항도 없기 때문에 문장이나 이. JDBC SQL SQL SQL

아닌 다른 내용을 데이터베이스에 전송할 수 있다 이것은 프로그래머에게 상당한 유연성을.

제공하지만 정확한 결과를 얻기 위해서는 프로그래머가 데이터베이스에 대한 지식을 가지고

있어야 한다 는 데이터베이스에 문장을 전송하기 위해 가지 형태의 클래스를. JDBC SQL 3

제공한다.

Page 389: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 389 -

클래스의 메소드를 이용해서 만들 수 있으며l. Statement - Connection createStatement() ,

간단한 을 전송할 때 사용된다SQL .

클래스의 메소드를 이용해서 만들2. PreparedStatement - Connection prepareStatement()

수 있으며 파라미터를 갖는 에 사용된다, IN SQL .

클래스의 메소드를 이용해서 만들 수 있3. CallableStatement - Connection prepareCall()

다 이 클래스는 저장된 프로시듀어를 실행시킬 때 사용된다. SQL .

가. Statement

클래스는 클래스의 메소드를 이용해서 만들 수 있Statement Connection createStatement()

다 다음 코드 예제를 살펴보자. .

클래스는 문장을 실행하기 위해서Statement SQL executeQuery, executeUpdate, execute 3

가지 메소드를 제공한다.

메소드 하나의 결과 집합 을 만드는 문장 예executeQuery : (result set) SQL ( , SELECT)■에 사용된다.

메소드 문장이나 이나executeUpdate : INSERT, UPDATE, DELETE CREATE TABLE■같은 문장들을 실행시킬 때 사용된DROP TABLE SQL DDL(Data Definition Language)

다 메소드는 리턴 값으로 인 경우에는. executeUpdate INSERT, UPDATE, DELETE SQL

문장을 실행시켜서 영향을 받은 행 의 수를 리턴 한다 문장인 경우에는 변(row) . SQL DDL

화된 행이 없기 때문에 을 리턴 한다0 .

메소드 하나 이상의 결과 집합을 리턴 하거나 사용될 이 미리 결정되지execute : SQL■않아 동적으로 을 처리할 때 사용된다 예를 들면 저장된 프로시듀어가 개의 결과 집SQL . 2

합을 리턴 한다면 메소드를 호출한 다음에 메소드를 호출해서 첫execute() getResultSet()

번째 결과 집합을 얻어와야 한다 두 번째 결과 집합을 얻기 위해서는 메. getMoreResults()

소드를 호출해야 한다 또 다른 예로 만약 등의 문장 실행돼서. INSERT, CREATE SQL 2

개의 업데이트 카운트 가 리턴 된다면 첫 번째 업데이트 카운트를 위해(update count) ,

메소드가 호출되고 다음 결과를 얻기 위해서 메소드를getUpdateCount() , getMoreResults()

호출하고 다시 번째 업데이트 카운트를 위해 메소드를 호출한다, 2 getUpdateCount() . SQL

문장의 리턴 값이 결과 집합인지 업데이트 카운트인지는 메소드의 리턴 값을 보, execute()

고 알 수 있다 메소드가 값을 리턴 하면 문장은 결과 집합을 리턴하. execute() true SQL

고 인 경우에는 업데이트 카운트를 리턴 한다 따라서 메소드를 호출한 뒤에, false . execute()

는 이 메소드의 결과 값에 따라 이나 메소드를 호출한다getResultSet() getUpdateCount() .

문장이 결과 집합을 리턴하지 않는 경우에 메소드를 호출하면 값SQL getResultSet() null

을 리턴하고 업데이트 카운트를 리턴하지 않는 경우에 메소드를 호출하, getUpdateCount()

면 을 리턴 한다-l .

다음 코드는 문장이 몇 개의 업데이트 카운트와 결과 집합을 리턴 할지 모르는 경우SQL

에 메소드를 사용한 예제이다execute() .

Page 390: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 390 -

커넥션이 모드로 설정되어 있으면 는 을 실행시키고 리턴 값을auto-commit , Statement SQL

받는 동시에 자동적으로 커밋 이나 롤백 된다 객체는 사용이 중(commit) (rollback) . Statement

지되면 자바 가비지 콜렉터에 의해 자동적으로 클로즈되지만 메소드를 이용해서 닫, close()

아주는 것이 바람직하다.

나. PreparedStatement

는 로부터 상속받아서 만들어졌다 는PreparedStatement Statement . PreparedStatement

와는 달리 미리 컴파일된 을 사용하기 때문에 보다 성능 면에서 뛰Statement SQL Statement

어나다 에 포함된 문장은 파라미터를 받을 수 있는 곳을 로. PreparedStatement SQL IN '?'

표시한다.

다음은 커넥션으로부터 를 생성하는 코드의 일부분이다PreparedStatement .

예 :

Connection con = DriverManager. getConnection();

PreparedStatement pstmt = con.prepareStatement(

"UPDATE table4 SET m = ? WHERE x = ?");

를 실행시키기 전에 부분은 파라미터를 이용해서 값을 채워주어야PreparedStatment '?' IN

한다 값을 채우기 위해서는 메소드를 이용한다 다음 코드 일부는 첫 번째 에. setXXX() . '?'

는 두 번째 에는 까지 정수 값을 넣고 을 실행시키는 예제이다'?' 0 9 SQL .~

예 :

pstmt. setString(1, “Hi");

for (int i = 0; i < 10; i++) {

pstmt. setInt(2, i);

int rowCount = pstmt. executeUpdate():

}

Page 391: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 391 -

나 은 무제한적인 길이의 데이터를 보낼 수 있지만 일반적으로는 큰setBytes() setString() ,

데이터는 작은 단위로 잘라서 보내는 것이 바람직하다 이것은 파라미터에 자바 입력스. IN

트림을 설정해주면 가능하다 이렇게 하는 경우에 문장이 수행되면서 드라이버. SQL , JDBC

가 반복적으로 입력스트림을 호출 내용을 읽어서 의 실제 파라미터에/ PreparedStatement IN

값을 전달한다 는 입력스트림을 연결하기 위해 가지 메소드를 제공한다 첫 번째로. JDBC 3 .

메소드는 바이너리 스트림을 가지며 문자를 포함하는 스트림을setBinaryStream() , ASCII

위해서는 메소드를 사용하고 유니코드 문자를 위해서는setAsciiStream()

메소드를 사용한다setUnicodeStream() .

Page 392: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 392 -

다음 코드는 바이너리 스트림을 이용해서 파일의 내용을 데이터베이스에 전달하는 예제이

다.

예 :

java. io. File file = new java.io.File("/tmp/data");

int fileLength = file.length();

java.io.InputStream fin = new java.io.FileInputStream(file);

java. sql. PrepredStatement pstmt = con.prepareStatement("UPDATE Table5 SET

stuff = ? WHERE index = 4");

pstmt. setBinaryStream (1, fin, fileLength);

pstmt. executeUpdate();

다. CallableStatement

는 로부터 상속받았으며 저장된 프로시듀어CallableStatement PreparedStatement , SQL

를 호출하기 위해 사용된다 저장된 프로시듀어는 에서 다음과(stored SQL procedure) . JDBC

같은 형태로 호출된다.

형태:

{ call procedure_name [(?, ?, ...)] }{ ? = call procedure_name [(?, ?, ...)] }{ call procedure_name }

는 메소드를 이용해서 만들 수 있다 다음은CallableStatement prepareCall() .

를 만드는 예제 코드이다CallableStatement .

예 :

Connection con = DriverManager. getConnection();

CallableStatement cstmt = con.prepareCall("{ call getTestData (?, ?) }" );

파라미터를 에 전달하기 위해서는 에서와 마찬가지IN CallableStatement PreparedStatement

로 메소드를 사용한다setXXX() .

만약 저장된 프로시듀어가 파라미터를 리턴 한다면 가 실행되기 전OUT CallableStatement

에 메소드를 이용해서 사전에 등록해야한다 다음 예제는registerOutParameter() .

프로시듀어를 호출하고 타입과 타입으로 개의 결과를getTestData TINYINT DECIMAL 2

파라미터를 이용해서 리턴 하는 예이다OUT .

는 파라미터를 사용할 수 있다 파라미터는 파라미터CallableStatement INOUT . INOUT IN

타입으로 메소드를 이용해서 에 값을 전달할 수 있고 파setXXX() CallableStatement , OUT

라미터 형식으로 내장된 프로시듀어의 결과를 리턴 받아 올 수도 있다 다음 예는. INOUT

파라미터를 사용한 예이다.

Page 393: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 393 -

결과 검색하기11.3.6

클래스는 문장의 조건을 만족하는 데이터의 행 들을 가지고 있으면서ResultSet SQL (row) ,

일련의 메소드를 이용해서 현재 행 에 포함된 데이터를 접근할 수getXXX() (current row)

있는 기능을 제공한다 다음 그림은 클래스로부터 데이터를 얻어오는 것을 보여. ResultSet

준다 의 메소드를 이용해서 커서 를 이동시키고 현재 커서의 위치. ResultSet next() (cursor) ,

에 있는 행 에서 메소드를 이용해서 각 열 의 데이터 값을 얻어올(row) getXXX() (column)

수 있다.

그림 에서 값 읽어오기11-144. ResultSet

일반적인 결과 집합 은 열 이름 과 질의어 결과에 해당되(result set) (column heading) (query)

는 값들로 구성된다 예를 들면 과 같은 질의어를 이용하. , "SELECT a, b, c FROM Table"

면 결과 집합은 다음과 같은 형태로 나타날 것이다.

a b c

12345 Cupertino 10.583472 Redmond 23.283492 Boston 21.3

다음은 을 이용해서 결과 집합에서 현재 행의 각 열의 값을 얻어오는 예제의 일부ResultSet

이다 결과 집합에서 첫 번째 열은 타입이고 두 번째 열을 세 번째 열을. int , String, float

타입이다 각 열의 데이터 타입에 따라 메소드가 달라진다 메소드에서. getXXX() . getXXX()

부분은 해당 열의 데이터 타입이다XXX .

Page 394: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 394 -

메소드는 아규먼트로 열의 이름이나 열의 인덱스를 사용할 수 있다 인덱스는getXXX() . 1

부터 시작해서 왼쪽에서 오른쪽으로 번호를 붙인다 예를 들면 다음 두 가지 경우 모두 사.

용할 수 있지만 열 인덱스를 사용하는 것이 약간 효율성이 높다 또한 에 열 이름을, . SQL

기술하지 않은 경우 에는 열 이름을 이용할 수 없다(SELECT * FROM Table 1) .

예 :

String s = rs.getString("b");

예 :

String s = rs.getString(2);

다음 표는 각 데이터 타입에 따른 메소드들이다 로 표시된 것은 사용 가능한getXXX() . 'x'

것을 의미하고 는 가장 적합한 메소드를 의미한다, 'X' .

Page 395: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 395 -

SQL데이터타입

getXXX()메소드

TINYINT

SMALLINT

INTEGER

BIG

NT

REAL

FLOAT

DOUBLE

DECI

MAL

NUMERIC

BIT

CHAR

VARCHAR

LONGVARCHAR

BINARY

VARBINARY

LONGVARBINARY

DATE

TIME

TI

MESTAMP

getByte X x x x x x x x x x x x x

getShort x X x x x x x x x x x x x

getInt x x X x x x x x x x x x x

getLong x x x X x x x x x x x x x

getFloat x x x x X x x x x x x x x

getDouble x x x x x X X x x x x x x

getBigDecimal x x x x x x x X X x x x x

getBoolean x x x x x x x x x X x x x

getString x x x x x x x x x x X X x x x x x x x

getBytes X X x

getDate x x x X x

getTime x x x X x

getTimestamp x x x x X

getAsciiStream x x X x x x

getUnicodeStream x x X x x x

getBinaryStream x x X

getObject x x x x x x x x x x x x x x x x x x x

메소드는 커서 를 현재 행에서 다음 행으로 이동하는 데 이용된다 최초에는next() (cursor) .

커서가 첫 번째 행 이전에 위치하기 때문에 첫 번째 행의 값을 읽기 위해서는 메소, next()

드를 한번 호출해주어야 한다 데이터베이스에서 와 를 지. positioned update positioned delete

원하면 커서에 이름을 붙여서 갱신이나 삭제 명령어에 파라미터로 제공할 수도 있다 커서.

의 이름은 메소드를 이용해서 알아볼 수 있다 는getCursorName() . positioned update/delete

모든 에서 지원하는 기능이 아니기 때문에 지원여부를 알아보기 위해서는DBMS

D a t a b a s e M e t a D a t a . s u p p o r t s P o s i t i o n e d D e l e t e ( ) ,

메소드를 이용할 수 있다DatabaseMetaData.supportsPositionedUpdate() .

의 각 열에 대한 정보가 필요한 경우에는 의 메소드를 이ResultSet ResultSet.getMetaData()

용해서 객체를 만들어서 정보를 알아볼 수 있다 객ResultSetMetaData . ResultSetMetaData

체를 이용하는 경우 열의 특성과 타입 개수를 알아볼 수 있다ResultSet , .

Page 396: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 396 -

나 메소드는 매우 큰 데이터를 리턴 할 수 있기 때문에 작은 단위의getBytes() getString()

단위로 읽어들이기 위해서 클래스는 입력 스트림을 제공한다 는 입력스트ResultSet . JDBC

림을 제공하기 위해 가지 형태의 메소드를 제공한다3 .

데이터베이스에서 변환 과정을 거치지 않은 로 바이트 스트림getBinaryStream() : (raw)◎

리턴 한다.

바이트의 문자 스트림을 리턴 한다getAsciiStream() : 1 ASCII .◎

바이트 유니코드 문자 스트림을 리턴 한다getUnicodeStream() : 2 .◎

다음은 메소드를 이용해서 데이터베이스에서 문자 스트림 정보를getAsciiStream() ASCII

읽어오는 예제의 일부이다.

예 :

Statement stmt = con.createStatement();

ResultSet rs = stmt. executeQuery("SELECT x FROM Table2");

byte buff = new byte[4096];

while (rs.next()) {

InputStream fin = rs.getAsciiStream(1);

for (;;) {

int size = fin.read(buff);

스트림의 끝이면if (size == -1) { //

break;

}

output. write(buff, 0, size):

}

}

트랜잭션11.3.7

트랜잭션은 하나 이상의 문장으로 구성되어 실행되면서 전체가 커밋 되던가SQL (commit)

롤백 된다 한 트랜잭션이 커밋이나 롤백되면 현재 트랜잭션을 종료되고 다른 트랜(rollback) .

잭션이 시작된다 새로운 커넥션은 디폴트로 모드로 설정되어 있다 이것은. auto-commit .

문장이 하나 실행되면 자동적으로 커밋 혹은 롤백됨을 의미한다 이러한 경우에 트랜SQL .

잭션의 각 문장들이 개별적으로 커밋 혹은 롤백됨으로 문제가 발생할 수 있다SQL .

모드가 해제되면 트랜잭션의 모든 문장들이 수행되고 이나auto-commit commit()

메소드가 호출되면 트랜잭션은 종료된다 모드를 변경하기 위해서는rollback() .auto-commit

클래스의 메소드를 이용한다Connection setAutoCommit(boolean mode) .

많은 트랜잭션들이 동시에 작업을 하다보면 데이터의 충돌이 발생할 수 있다 프로그래머는.

이러한 충돌이 발생하는 경우에 가 어떻게 해결할 것인지를 아이솔레이션 레벨DBMS

로 기술 해줄 필요가 있다 아이솔레이션 레벨을 기술하기 위해서는(isolation level) .

Page 397: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 397 -

클래스의 메소드를 이용한다 다음은Connection setTransactionIsolation(int level) . dirty

를 허용하는 레벨을 기술한 예이다read .

예 :

Connection con = DriverManager.getConnection():

con. setTransactionIsolation(Connection. TRANSACTION_READ_UNCOMMITTED);

를 이용하는 레벨로는 다음과 같은 것들이 있다setTransactionIsolation() .

Page 398: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 398 -

가 허용된다TRANSACTION_READ_UNCOMMITTED : dirty read .◎

트랜잭션이 종료될 때까지 행 읽기가 블TRANSACTION_READ_COMMITTED : (row)◎

락 된다

행 에 대해 반복적으로 읽혀진 데이터가TRANSACTION_REPEATABLE_READ : (row)◎

원래 데이터와 일치된다.

모든 읽기가 트랜잭션이 종료될 때까지 블락된다TRANSACTION_SERIALIZABLE : .◎

트랜잭션이 지원되지 않는다TRANSACTION_NONE: .◎

자바 자료형과 자료 형11.3.8 SQL

자료형을 자바 자료형으로 변환1. SQL

자료형을 자바 자료형으로 변환하는 경우에 다음 표와 같은 매핑 관계를 갖는다SQL .

자료형SQL 자료형JavaCHAR StringVARCHAR StringLONGVARCHAR StringNUMERIC java.math.BigDecimalDECIMAL java.math.BigDecimalBIT booleanTINYINT byteSMALLINT shortINTEGER intBIGINT longREAL floatFLOAT doubleDOUBLE doubleBINARY byte[]VARBINARY byte[]LONGVARBINARY byte[]DATE java.sql.DateTIME java.sql.TimeTIMESTAMP java.sql.Timestamp

자바 자료형을 자료형으로 변환2. SQL

자바 자료형을 자료형으로 변환하는 경우 다음 표와 같은 매핑 관계를 갖는다SQL .

Page 399: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 399 -

자료형Java 자료형SQLString VARCHAR / LONGVARCHARjava.math.BigDecimal NUMERICboolean BITbyte TINYINTshort SMALLINTlnt lNTEGERlong BIGINTfloat REALdouble DOUBLEbyte[] VARBINARY / LONGVARBlNARYjava.sql.Date DATEjava.sq1.Time TIMEjava.sql.Timestamp TIMESTAMP

자료형을 자바 객체로 변환3. SQL

자료형을 자바 객체로 변환하는 경우에 다음 표와 같은 매핑이 이루어진다SQL .

자료객체SQL 객체JavaCHAR StringVARCHAR StringLONGVARCHAR StringNUMERIC java.math.BigDecimalDECIMAL java.math.BigDecimalBIT BooleanTINYINT IntegerSMALLINT IntegerINTEGER IntegerBIGINT LongREAL floatFLOAT DoubleDOUBLE DoubleBINARY byte[]VARBINARY byte[]LONGVARBINARY byte[]DATE java.sql.DateTIME java.sql.TimeTIMESTAMP java.sql.Timestamp

자바 객체를 자료형으로 변환4. SQL

자바 객체를 자료형으로 변환하는 경우에 다음 표와 같은 매핑 관계가 있다SQL .

Page 400: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 400 -

Java Object Type SQL typeString VARCHAR / LONGVARCHARjava.math.BigDecimal NUMERICBoolean BITInteger INTEGERLong BIGINTFloat REALDouble DOUBLEbyte[] VARBINARY / LONGVARBlNARYjava.sql.Date DATEjava.sql.Time TIMEjava.sql.Timestamp TIMESTAMP

응용 프로그램11.4 JDBC

콜래스 애플릿을 이용한 동문회 주소록11.4.1 Alumna :

와 를 이용해서 웹 상에서 작동하는 동문회 주소록 프로그램을 모POSTGRES JDBC 2-tier

델을 이용해서 만들어 보자 만들고자 하는 주소록 프로그램은 다음 그림과 같은 모양으로.

되어있다 애플릿 뷰어로 프로그램을 실행시키는 경우에 다음과 같이 보인다. .

그림 결과11-145. Alumna

넷스케입으로 홈페이지를 방문하는 경우에 다음과 같이 보인다.

그림 결과11-146. Alumna

네스케이프( )

Page 401: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 401 -

동문 주소록 프로그램은 에서 내용을 추가 삭제 검색할 수 있는 기능을POSTGRES DBMS / /

제공한다 프로그램을 작성하기 전에 데이터베이스를 작성하여야 한다 데이터베이스 이름은. .

이고 테이블 이름은 로 하였다 다음은 의 을 이용해서 데이터베이alumna cs . POSTGRES psql

스의 구성을 알아본 것이다 테이블은 필드를 가지. cs num, name, phone, company, email

고 있다 은 학번을 의미하며 기본 키로 사용될 수 있다. num .

데이터베이스의 구성을 알아보았고 이제 를 이용해서 실제로 데이터 베이스에 값을, JDBC

입력 삭제 검색할 수 있는 프로그램을 작성해보자 프로그램은 실/ / Alumna.java . Alumna.java

제로 와 관련된 부분을 소수이고 대부분이 를 구성하는데 사용되었다 따라서JDBC GUI .

를 이용하는 경우에 프로그램이 매우 간단하고 쉽게 데이터베이스에 접근할 수 있다JDBC .

Page 402: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 402 -

Page 403: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 403 -

Page 404: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 404 -

Page 405: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 405 -

Page 406: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 406 -

설명

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

용 드라이버를 드라이버 매니저에 등록한다 드라이버는 생성POSTGRES JDBC . PGDriver

자에서 기본적으로 드라이버 매니저에 등록하는 루틴이 포함되어 있다.

70 String url = "jdbc:postgres95://mycom.soongsil.ac.kr:5432/alumna";

을 기술하고 있다 드라이버 이름 과 컴퓨터 이름JDBC URL . (postgres95)

포트 번호 데이터베이스 이름 을 기술한다(mycom.soongsil.ac.kr), (5432), (alumna) .

72 conn = DriverManager.getConnection(url, "user-id", "password");

커넥션을 열기 위해 메소드를 호출한다 과 사용자 와 암호를getConnection() . JDBC URL ID

아규먼트로 전달해야 한다.

73 stat = conn.createStatement();

문장을 전송할 클래스를 만든다SQL Statement .

180 String sql = “insert into cs values(?,?,?,?,?)";

를 위한 을 만든다preparedStatement SQL .

181 PrepredStatement stat = conn.prepareStatement(sql);

메소드를 이용해서 클래스를 만든다prepareStatement() PreparedStatement .

182 stat. setString(1, vnum);

Page 407: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 407 -

의 파라미터에 값을 전달하기 위해 메소드를 이용한다PrepareStatement IN setXXX() .

Page 408: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 408 -

187 stat. executeUpdate( );

의 문장을 실행시킨다PreparedStatement SQL .

23 rs = stat.executeQuery("select * from cs order by num");

검색하는 문장을 실행시킨다SQL .

236 while(rs.next()) {

237 String num = rs.getString(1);

메소드로 커서를 이동시키면서 로 현재 행의 원하는 열의 값을 얻어온다next() getXXX() .

주의

어떤 시스템은 의부에서 데이터베이스로 직접 접근하는 것을 보안상의 이유로 막고DBMS

있다 따라서 애플릿을 이용하는 경우에 보안상의 문제 때문에 이 발생한. SecurityException

다.

에서는 디렉토리의 파일에서 데이터베이스에 접근할 수 있는POSTGRES data pg_hba.conf

컴퓨터를 설정할 수 있다 은 파일에 외부 컴퓨터에서. mSQL /usr/1ocal/Hughes/msql.conf

데이터 베이스의 접근을 허용할 것인지를 설정하고 외부 컴퓨터에서 접근이 허용된 경우에,

도 파일에 등록된 컴퓨터에서만 데이터베이스에 접근할 수 있다 기타 다른/etc/hosts .

를 사용하는 경우에 보안에 관련된 사항은 데이터베이스 관리자 에게 문의할DBMS (DBA)

필요가 있다.

11.4.2 JDBC + CGI = 3-tier ?

이 장에서는 와 를 이용해서 모델 방법을 따라 앞의 클래스보다JDBC CGI 3-tier Alumna

조금 더 복잡한 예제 프로그램을 작성해보자 이곳에서 작성할 프로그램은 인력 풀 을. (pool)

관리하기 위한 것이다 인력 풀 은 어떤 학과의 재학생과 졸업생들로 이루어졌고 웹브. (pool) ,

라우저를 통해서 인력 풀에 등록 내용 변경 검색이 가능하도록 되어있다 이 프로그램의, , .

최상위 메뉴는 다음의 파일이다 파일에서는 입력 내용 변경 찾기에 대pool.html . pool.html , ,

한 링크를 가지고 있다.

인력 풀에 등록하기 위해서 파일을 웹브라우저로 보면 다음과 같은 형태로 보person.html

여진다 에서는 인력 풀에 등록하기 위한 각종 정보 이름 주민등록번호 주소. person.html ( , , ,

회사 학력 등 들을 입력할 수 있도록 되어 있다 입력된 내용은 등록하기 버튼을 클릭하, ) . “ ”

면 프로그램에 의해 데이터베이스에 등록된다CGI .

그림 11-147. person.html

Page 409: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 409 -

Page 410: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 410 -

Page 411: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 411 -

등록된 내용을 변경하고자 하는 경우에는 을 웹브라우저로 방문하면 다person_modify. html

음과 같이 사용자 인증을 위해 주민등록번호와 이름을 물어보게 된다 주민등록번호와 이름.

을 입력하고 버튼을 클릭하면 프로그램이 데이터베이스에서 주민등록번호와 이름이 정CGI

확한지 여부를 판단한다 사용자 인증이 되면 등록 정보를 화면에 보여주고 변경 가능하도.

록 해준다.

그림 11-148. person-modify.html

인력 풀에서 원하는 사람을 찾고자하는 경우에는 파일을 방문한다 찾기person_search.html .

는 사람 이름 재학생은 학기별 졸업생은 졸업 기수별로 찾을 수 있다, , .

Page 412: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 412 -

그림 11-149. person_search.html

파일을 알아보았고 이제 프로그램을 알아보자 프로그램은 자바 언어를HTML , CGI . CGI

이용하여 작성하였다 다음 은 프로그램을 구동시키기 위. person_insert.pl PersonInsert.java

한 쉘 프로그램이다.

Page 413: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 413 -

프로그램은 로부터 입력받은 프로그램을 전달받아서 데이터PersonInsert.java person.html

베이스에 등록하는 프로그램이다 인력 풀을 위한 데이터베이스는 이고 사용자의 개인. pool ,

정보를 위한 테이블은 이고 사용자의 학력정보를 입력하기 위한 테이블은 이person , school

다 는 기본 키를 지원하지 않기 때문에 기본 키를 만들기 위해서 테이. POSTGRES number

블의 필드를 이용한다 다음은 인력 풀을 위한 데이터베이스의 형태이다num . .

Page 414: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 414 -

Page 415: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 415 -

Page 416: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 416 -

Page 417: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 417 -

Page 418: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 418 -

설명

132 conn.setAutoCommit(false);

트랜잭션을 사용하기 위해 모드를 해제하였다auto-commit .

134 String testsql = "select num from person where ssn='"+ssn+"'";

135 ResultSet rs = stmt. executeQuery(testsql);

새로 등록하려는 내용이 이미 등록되어 있는지 여부를 주민등록번호를 이용해서 알아본다.

문장을 수행해서 결과 집합이 있으면 이미 등록된 것으로 볼 수 있다SQL .

143 String sqlnum = "setect num from number"'

145 rs = stmt.executeQuery(sqlnum);

새로 등록하는 내용이라면 테이블에서 값을 읽어오고 값을 하나 증가시number num , num

켜서 테이블을 업 데이트한다 테이블에서 얻어온 값은 등록하는 사number . number num

람을 위한 테이블과 테이블에서 기본 키로 사용된다person school .

문장에서 입력된 내용을 테이블에 등록한다158, 161 person .

문장에서 등록하는 사람의 학력 정보를 테이블에 등록한다177~182 school .

184 conn.commit();

모든 작업이 오류 없이 수행되면 트랜잭션을 커밋한다.

191 conn.rollback();

중간에 오류가 발생하면 모든 작업을 무시하도록 롤백한다.

다음은 내용을 변경하는 경우를 살펴보자 에서 올바른 주민등록번호와. person_modify.html

이름을 입력하면 다음 그림과 같이 데이터베이스에 입력된 정보가 수정할 수 있도록 웹브라

우저에 나타난다

Page 419: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 419 -

그림 11-150. person_modify.html

다음 파일은 자바 프로그램을 구동시키기 위한 쉘 프로그person-modify.pl PersonModify

램이다.

프로그램은 주민등록번호와 이름은 전달받아 데이터베이스에서 검색해서PersonModify.java

내용이 올바르면 그 사람에 해당되는 등록 정보를 의 태그를 이용해서 화면HTML FORM

에 보여주는 프로그램이다.

Page 420: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 420 -

Page 421: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 421 -

Page 422: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 422 -

Page 423: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 423 -

설명

29 String sqlnum = "select num from person where nameh = '"+nameh+"' and ssn

='"+ssn+"'";

30 Resultset rs = stmt.executeQuery(sqlnum);

전달받은 이름과 주민등록번호에 해당되는 내용이 데이터베이스에 있는가 알아본다.

46 Strin personsql = "select * from person where num = "+num;

51 rs = stmt.executeQuery(personsql);

52 while(rs.next()) {

데이터베이스에 해당되는 사람의 정보가 등록되어 있다면 데이터베이스에서 등록된 모든,

정보를 얻어온다.

115 String schoolsql = "select * from school where num = "+num;

123 rs = stmt.rxrcuteQuery(schoolsql);

등록된 사람의 학력 정보를 알아온다.

다음은 찾기 부분이다 찾기에서는 이름으로 혹은 학기나 졸업기수별로 찾기를 할 수 있다. .

다음그림은 재학생 중에서 학기인 사람을 모두 찾는 예이다 찾기를 수행하면 해당되는 사5 .

람의 학기 졸업기수 이름 연락처 학력이 화면에 나온다 연락처와 학력은 링크로 연결돼서/ , , , .

마우스로 다시 클릭하는 경우에 상세 정보가 나타난다.

Page 424: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 424 -

그림 결과11-151. PersonSearch

다음은 찾기를 수행하는 를 실행시키는 쉘 프로그램이다PersonSearch .

다음은 데이터베이스에서 실제로 검색을 수행하는 자바 프로그램이다 찾기 작업은 이름 학. ,

기 수 졸업기수 중에서 하나로만 수행할 수 있다 만약 이름 학기 졸업 기수가 동시에 사, . , ,

용된다면 앞에 있는 이름으로 찾기가 수행된다.

Page 425: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 425 -

Page 426: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 426 -

설명

36 sql = "select * from person where slnum = -"=searchNumber+" order by nameh“;

학기별로 검색하기 위한 문장이다SQL .

40 sql = "select * from person where alnum = "+searchNumber2+" order by nameh";

졸업기수별로 검색하기 위한 문장이다SQL .

44 sql = "select num, grd, alnum, nameh from person where nameh like '%"+keywoed + "%'

order by nameh";

이름으로 검색하기 위한 문장이다 이름이 완전하게 제공될 수도 있지만 이름의 일부SQL . ,

만으로도 검색할 수 있도록 와 절을 이용해서 의 정규문법을 사용하였다'%' 1ike SQL .

70 System.out.println("<td><a href=http://203.253.259.3/~jmchoi/classes

연락처/jdbc/psearch.pl?num="+num+"&f=c&name="+nameh+"> </a">;

연락처를 클릭하면 프로그램인 를 실행하고 아규먼트로 을 전달CGI psearch.pl num, f, name

해준다.

다음은 찾기에서 연락처 링크를 클릭했을 매 상세 정보를 보여주기 위한 프로그램이다 연'' .

락처와 학력의 상세한 정보는 다음 그림처럼 출력된다.

Page 427: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 427 -

그림 연락처 정보11-152.

그림 그림 학력 정보11-153.

Page 428: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 428 -

Page 429: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 429 -

Page 430: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 430 -

설명

층22 if( .equals("c")) {

가 와 같으면 연락처에 관한 상세 정보를 검색하고 같지 않으면 학력 정보를 검색한cmd "c" ,

다.

23 sql = "select * from person where num = "+num;

27 rs = stat.executeQuery(sql);

연락처에 대한 상세한 정보가 필요한 경우에 테이블을 검색해서 화면에 보여주기 위person

한 문장을 실행한다SQL .

97 String schoolsql = "select * from school where num = "+sum;

101 rs = stat.executeQuery(schoolsql);

학력에 관한 자세한 정보가 필요한 경우 테이블을 검색한다school .

Page 431: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 431 -

제 장12 . Java RMI

기초12.1 RMI

소켓을 이용해서 클라이언트 서버 프로그램을 작성한다면 서버와 클라이언트가 공통적으로/

사용할 수 있는 프로토콜을 개발해야한다 그러나 프로토콜 개발은 많은 노력이 소모될 뿐. ,

만 아니라 많은 에러를 유발한다 소켓을 이용하면 다음 그림처럼 작업이 이루어질 것이다. .

클라이언트는 서버에게 프로토콜에 맞게 포맷된 메시지 형태로 작업을 요청하고 서버는 메,

시지를 해석해서 클라이언트가 요청한 작업을 수행한다 작업이 완료되면 서버는 클라이언.

트에 작업 결과를 전달한다.

소켓을 이용하지 않고 함수 호출 형태로 분산 컴퓨팅이 이루어진다면 클라이언트에서는 서,

버의 함수를 호출하는 방식이 된다 함수 호출 형태로 분산 컴퓨팅이 이루어진다면 소켓을.

이용하는 경우처럼 포맷에 맞게 메시지를 만들고 메시지를 해석할 필요가 없어진다, .

일반 프로그래밍에서 함수 호출은 자연스럽게 사용된다 이러한 함수 호출이 인터넷 상에서.

이루어진다고 생각해보자 자바에서는 인터넷 상에 분산된 클라이언트와 서버간의 함수 호.

출 기능을 위해 기능을 제공한다RMI .

는 기존의 와 유사하다 는 자바라는 객체 지향 언어RMI RPC(Remote Procedure Call) . RMI

를 바탕으로 하기 때문에 전통적인 에 비해서 많은 장점을 가지고 있다 기본적인RPC . RMI

의 장점을 다음과 같이 요약할 수 있다.

객체 지향적이다 는 기본 데이터 타입을 제의하고는 전달되는 아규먼트 리턴 값: RMI ,◎

등이 모두 객체로 되어 있다 이것은 복잡한 자료 구조를 하나의 객체 단위로 전송 처리할. /

수 있음을 의미한다 따라서 기존의 에서 복잡한 자료 구조의 각 필드를 처리하는 것보. RPC

다 작업이 수월하다.

Page 432: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 432 -

프로그램 작성 및 사용이 쉽다 가 프로그램을 작성하기 어려운데 비해 는 일: RPC RMI◎

반 자바 프로그램과 거의 동일한 형식으로 되어 있기 때문에 프로그램 작성이 쉽다.

안전하고 보안성이 있다 자바 보안 기능을 사용하기 때문에 보안성이 있다. : .◎

기존 시스템과 통합해서 사용할 수 있다 와 를 이용하면 기존의 시스템: RMI JNI (legacy◎

을 약간의 변경만으로 분산 시스템으로 활용할 수 있다system) .

자바의 의 소켓을 이용해서 클라이언트의 요구사항을 서버에 전달하고 서버는 요구TCP/IP ,

사항을 처리하는 방식의 접근 방법은 저 수준 의 통신 프로토콜 방법이다 이러(Low level) .

한 방법보다는 응용 프로그램이 이해할 수 있는 응용 프로그램 수준의 프로토콜을 이용하는

경우에 클라이언트와 서버간에 통신에서 데이터의 포맷 등이 자연스럽게 일치된다.

자바 의 기본적인 목적은 저 수준의 소켓을 통하지 않고 원격 객체 의RMI , (remote object)

메소드를 호출할 수 있는 방법을 제공하는 것이다 원격 객체란 다른 자바 가상 머신 일반. (

적으로 다른 컴퓨터에 있는 에서 호출할 수 있는 메소드를 가지는 객체를 말한다 원격 객) .

체는 클래스로부터 상속받고 원격 인터페이스를 임플리멘츠해야 한UnicastRemoteObject

다.

자바 를 이용한 클라이언트 서버 프로그램은 다음 단계를 거쳐 작성할 수 있다RMI / 6 .

원격 인터페이스를 정의한다1. .

원격 인터페이스를 임플리멘츠하는 원격 객체 서버 를 작성한다2. ( ) .

원격 객체를 이용하는 프로그램 클라이언트 을 작성한다3. ( ) .

과 클래스를 생성한다4. stub skeleton .

를 실행시킨다5. registry .

서버와 클라이언트를 실행시킨다6. .

프로그램을 작성하는 순서를 그림으로 표현하면 다음과 같다RMI .

Page 433: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 433 -

그림 구현 단계12-157. RMI

모든 원격 인터페이스는 패키지에 있는 인터페이스로부터 직접 혹java.rmi.remote Remote

은 간접으로 상속받아야 한다 인터페이스는 메소드가 선언되지 않은 인터페이스이. Remote

다 즉 다음과 같이 되어 있다. , .

public interface Remote { }

패키지는 서버와 관련된 패키지이다 클래스는 환java.rmi.server RMI . RemoteObject RMI

경에서 자바 언어의 클래스와 유사한 역할을 한다 클래스로부터 상Object . RemoteObject

속받은 클래스는 객체를 생성하고 객체를 의부에서 다른 자바 가상 머신에RemoteServer (

서 사용할 수 있도록 하는 역할을 한다 클래스로부터 상속받은) . RemoteServer

클래스는 한 서버만 정의할 수 있도록 한다 원격 객체 메소드의 아UnicastRemoteObject .

규먼트와 리턴 값은 직렬화 가 가능한 어떤 자바 타입도 가능하다 원격 객체가(serialization) .

아닌 타입은 복제된 값이 전달된다 아규먼트가 원격 객체인 경우에는 원격 객체의 부. stub

분이 전달된다.

자바 예제12.2 RMI

우선적으로 자바 예제 프로그램을 통해 사용 방법을 알아보자RMI RMI .

라는 메소드를 갖는 라는 원격 인터페이스를 정의한다1. sayHello() Hello .

Page 434: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 434 -

참고 :

원격 인터페이스는 인터페이스로부터 상속받는다1) java.rmi.Remote .

원격 인터페이스는 으로 선언되어야 한다2) public .

인터페이스를 임플리멘츠한 이라는 원격 객체를 만든다2. Hello HelloImpl .

설명

7 public class HelloImpl extends UnicastRemoteObject implements Hello {

원격 객체는 클래스를 상속받고 원격 인터페이스를 임플리멘츠해야UnicastRemoteObject ,

한다.

9 public HelloImpl() throws RemoteException {

원격 객체의 생성자 및 원격 인터페이스에 선언된 메소드는 예외를RemoteException

해준다throws .

19 System.setSecurityManager(new RMISecurityManager());

를 사용하는 경우에 함수에서 시큐리티 매니저 를 설정해 줄RMI main() (SecurityManager)

수 있다.

Page 435: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 435 -

22 HelloImpl h = new HelloImpl();

원격 객체를 생성한다.

23 Naming.rebind("hello", h);

클래스를 이용해서 원격 객체를 라는 이름으로 등록한다 메소드와Naming hello . rebind()

메소드는 원격 객체를 등록하는데 사용되지만 차이점은 메소드는 동일한 이bind() , bind()

름이 이미 등록되어 있으면 을 발생시키지만 는 이java.rmi.AlreadyBoundException , rebind()

미 등록된 객체 대신에 새로운 객체로 대치한다.

Page 436: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 436 -

두 메소드 모두 아규먼트로 와 인스턴스 이름이 사용된다 은 다음과 같RMI URL . RMI URL

은 형태로 되어있다.

형태 :

rmi://host:port/object_name

따라서 예제 프로그램처럼 간단히 라고 이름만 기술한 경우는hello

예 :

Naming.rebind("rmi://localhost:1099/hello", h);

와 동일하다 는 기본적으로 포트를 사용한다. RMI 1099 .

참고 :

원격 객체는 클래스로부터 상속받고 원격 인터페이1) java.rmi.server.UnicastRemoteObject

스를 임플리멘츠한다.

원격 객체는 원격 인터페이스에 선언되지 않은 메소드들도 정의할 수 있지만 원격 인터2)

페이스에 선언되지 않은 메소드는 클라이언트에서 호출할 수 없다.

원격 객체의 생성자와 메소드들은 을 해야 한다3) RemoteException throws .

컴파일하기 :

% javac -d . Hello.java HelloImpl.java

원격 객체를 이용하는 프로그램 클라이언트 을 작성한다3. HelloImpl ( ) .

Page 437: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 437 -

설명

9 System.setSecurityManager(new RMISecurityManager());

클라이언트 프로그램에 시큐리티 매니저를 설정할 수 있다.

Page 438: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 438 -

12 Hello h = (Hello) Naming.lookup("rmi://mycom.soongsil.ac.kr/hello");

을 이용해서 원격 객체가 등록되어 있는 서버에서 원격 객체의 레퍼런스를 얻는RMI URL

다 은 다음과 같은 형태로 사용된다. RMI URL .

12 String message = h.sayHello();

원격 객체의 메소드 호출은 일반 메소드 호출과 동일한 형태로 사용된다.

참고 :

1) Hello h = (Hello) Naming.lookup("rmi://mycom.soongsil.ac.kr/hello");

원격 객체의 레퍼런스를 얻어올 때 타입은 원격 인터페이스 타입으로만 얻을 수 있다.

는 기본적으로 포트를 사용한다2) RMI 1099 .

를 이용해서 과 클래스를 만들고 파일을 만든다4. rmic stub skeleton , jar .

% rmic -d . hello.HelloImpl

% jar cvf hello.jar hello/*.class

참고 :

는 과 을 생성하는 컴파일러이다1) rmic stub skel .

를 등록한다5. rmiregistry .

% unsetenv CLASSPATH

% rmiregistry &

[1] 7382

참고 :

의 포트 번호를 변경하기 위해서는 다음과 같은 방식으로 작업할 수 있다1) rmiregistriy .

포트번호% rmiregistry &

윈도우즈 에서는 다음과 같은 방법으로 를 도스 창에서 실행시킨다2) 95/98/NT rmiregistry .

C: > start rmiregisty\

서버를 가동시킨다6. rmi .

% java hello.HelloImpl

Exception in thread "main" java.security.AccessControlException:

access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)

at java.security.AccessControlContext.checkPermission(Compiled Code)

참고 :

버전 이후부터는 보안 부분에 많은 기능이 향상되었다 따라서 버전에서는JDK l.2 . JDK 1.1

서버를 바로 실행시켰지만 버전에서는 보안을 설정해주어야 한다RMI , JDK l.2 .

Page 439: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 439 -

% java -Djava.security.policy=java.policy hello.HelloImpl

Hello Server ready

클라이언트 프로그램을 실행시킨다7. .

% java hello.HelloClient

Exception in main: java.security.AccessControlException: access denied

(java.net.SocketPermissionmycom.soongsil.ac.kr resolve)

참고 :

클라이언트에서도 보안을 설정해주어야 한다.

% java -Djava.security.policy=java.policy hello.HelloClient

HelloClient: Hello World

다음은 클라이언트를 애플릿으로 작성한 예이다RMI .

Page 440: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 440 -

구조 이해12.3 RMI

는 를 바탕으로 계층 계층 계층의RMI TCP/IP Stub/Skeleton , Remote Reference , Transport

계층으로 되어 있다 에서 원격 객체의 메소드를 호출할 때 메소드의 아규먼트와 리3 . RMI

턴 값이 네트워크를 통해 전달된다 네트워크를 통해 전송할 때 메소드의 아규먼트와 리턴.

값을 바이트 스트림으로 변경해서 전달하게되는데 이것을 마샬 스트림 이, (marshal stream)

라고 한다 또한 마샬 스트림을 만드는 과정을 마샬링 이라고 반대 과정은 언마. (marshaling)

샬링 이라고 한다 계층에서는 자료를 마샬 스트림을 이용해서(unmarshaling) .Stub/Skeleton

계층으로 전달한다Remote Refdence .

리모트 레퍼런스 계층은 객체의 속성을 알고 결정해서 프로그래머의 의도에 맞는 작업을 수

행하도록 하는 역할을 담당한다 예를 들면 객체가 하나의 기계에 존재하는지 아니면 여러. ,

개의 기계에 분산되어 있는지 등을 알아서 각 특성에 맞게 작업을 수행하도록 해준다.

트랜스포트 계층은 코드를 형태로 변경하고 이것을 네트워크를 통해서 전송RMI TCP/IP ,

하는 역할을 담당한다 따라서 트랜스포트 계층은 커넥션 설정 커넥션 유지 커넥션 종료. , ,

등의 작업을 수행한다.

원격 객체의 멤버 필드의 내용을 접근하는 메소드를 호출하는 여러 개의 클라이언트들이 있

을 때한 클라이언트에서 원격 객체의 멤버 필드 내용을 변경하고 다른 클라이언트에서 내용

을 접근한다면 어떻게 될까 이것을 실험해보기 위해 라는 원격 인터페이스를? SetMessage

정의해 보자 는 내용을 읽어오는 메소드와 내용을 설정하는 메소드를 가지고. SetMessage

있다.

원격 인터페이스를 작성한 후에 이것을 임플리멘츠한 클래스를 만들어 보SetMessageImpl

자 클래스는 라는 멤버 필드를 가지고 있다 메소드와. SetMessageImpl msg . setMessage()

메소드는 멤버 필드의 값을 읽어오거나 값을 변경하는 메소드로 정의할getMessage() msg

수 있다.

Page 441: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 441 -

이제 원격 객체의 메소드를 호출하는 클라이언트 애플릿을 만들어보자. SetMessageClient

클래스는 원격 객체의 메소드를 호출해서 멤버 필드의 내용을 화면에SetMessageImpl msg

출력하는 애플릿 클래스이다.

Page 442: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 442 -

설명

19 runner = new Thread(this);

주기적으로 원격 객체로부터 내용을 얻어오고 얻어온 내용을 화면에 출력하는 쓰레드를 하,

나 생성한다.

33 message = obj.getMessage();

원격 객체의 메소드를 호출한다getMessage() .

50 obj.setMessage(input,getText());

원격 객체의 메소드를 호출해서 원격 객체의 멤버 필드 내용을 변경한다setMessage() .

Page 443: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 443 -

그림 결과12-158. SetMessageClient

예제 프로그램을 통해 원격 객체의 메소드 호출은 일반 함수 메소드 호출과 동일한 방법으

로 작동되는 것을 알 수 있다 일반 함수 호출에서와 마찬가지로 에서도 한 클라이언트. RMI

에서 메소드 호출에 의한 내용 변경은 다른 클라이언트 의 메소드 호출 결과에 영향을 준

다.

콜백12.4 RMI (callback)

이제까지 는 모두 클라이언트에서 일방적으로 원격 객체 서버 의 메소드를 호출하는 내RMI ( )

용들이었다 어떤 경우에 이것은 매우 불편하다 예를 들어 서버측에서 어떤 사실을 클라이. . ,

언트에게 통보해야 할 경우에 서버는 클라이언트가 특정 메소드를 호출해주기를 기다릴 뿐

다른 적절한 방법이 없다 이러한 문제에 대비해서 제공되는 것이 콜백 이다. (callback) .

콜배은 다음 그림과 같이 작동된다 클라이언트는 서버에 메소드를 호출해서 클라. register()

이언트 자신을 서버측에 등록한다 추후에 작업을 하면서 서버가 클라이언트의 내용을 갱신.

할 필요가 있는 경우에 서버는 등록된 정보를 이용해서 클라이언트의 메소드를 호update()

출한다.

클라이언트RMI 서버RMI

그림 콜백에서 함수 호출12-159. RMI

이렇게 콜백은 클라이언트가 서버에 자신을 등록시킴으러서 서버가 필요한 경우에 클라이언

트의 메소드를 호출해줄 수 있는 기능을 제공한다 다음은 콜백을 이용한 채팅프로그램의.

예제이다.

Page 444: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 444 -

인터페이스는 채팅 서버를 위한 원격 인터페이스이다 에는RMIChatServer . RMIChatServer

클라이언 트가 자신을 등록할 수 있는 메소드와 등록을 취소할 수 있는register()

메소드 메시지를 모든 채팅 클라이언트에 전달할 수 있는 메소드unregister() , broadcast()

를 갖는다.

원격 객체 은 라는 벡터를 이용해서 클라이언트들을 등록한다RMIChatServerImpl clientList .

메소드를 이용해서 등록하는 클라이언트를 벡터에 메소드를 이용해register() addElement()

서 추가하는 것이다 원격 객체의 메소드는 등록되어 있는 클라이언트의. broadcast()

메소드를 반복적으로 호출한다 메시지를 전송하는 도중에 새로운 클라이언트setMessage() .

가 추가되거나 삭제되는 것을 방지하기 위해 를 사용한다synchronized .

Page 445: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 445 -

콜백에서 서버가 클라이언트의 메소드를 호출하기 때문에 이것도 이다 따라서 클RMI RMI .

라이언트도 원격 인터페이스를 임플리멘츠한 원격 객체이어야 한다 인터페. RMIChatClient

이스는 서버에서 메소드를 호출할 수 있도록 메소드를 선언해주어야 한다setMessage() .

클래스는 인터페이스를 임플리멘츠한 원격 클래스이다RMIChatCIientApp RMIChatClient .

클래스는 생성자에서 채팅 서버에 메소드를 이용해서 등록하RMlChatClientApp register()

고 종료될 때 메소드를 이용해서 등록을 삭제한다, unregister() .

Page 446: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 446 -

Page 447: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 447 -

그림 결과12-160. ChatClient

콜백을 이용하는 경우에 채팅 화이트 보드 등 상호 대화 방식의 프로그램을 작성하는RMI ,

것이 매우 간단하다 그러나 애플릿으로 작성된 이러한 프로그램들은 현재 넷스케이프 웹브. ,

라우저나 익스플로러의 경우 보안 문제 때문에 콜백 기능을 사용하기 어렵다 따MS RMI .

라서 콜백 기능을 이용하기 위해서는 자바 소프트에서 실행되는 자바 가상 머신RMI (Java

으로 에서 다운로드 받을 수 있다 자바 플러그인은 애플릿이 웹브VM) http://java.sun.com/ .

라우저에서 실행될 때 넷스케이프이나 익스플로러의 자바 가상 머신을 사용하는 것이 아니

고 자바 소프트에서 제공하는 자바 가상 머신을 사용하도록 한다 다음은 콜백을 사용, . RMI

하는 채팅 애플릿 프로그램이다.

Page 448: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 448 -

자바 플러그인을 사용하려면 을 약간 수정해야 한다 플러그인을 사용하면 넷스케이HTML .

프와 의 가 사용하는 태그가 서로 다르다 따라서 다음 예제는 넷스케이프와MS IE HTML .

를 사용하는 경우에 형태를 보여준다 다음 파일은 넷스IE HTML . javapluginNetscape.html

케이프를 위한 플러그인이 포함된 이다HTML .

다음의 파일은 를 위한 파일이다javapluginIE.html MS IE HTML .

Page 449: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 449 -

자바 플러그인을 사용하는 경우에 콜백이 잘 작동된다 다음 그림은 콜백을 이용RMI RML

한 채팅 프로그램을 자바 플러그인으로 실행시킨 모습이다.

그림 결과12-161. RMIChatClientApplet

12.5 JDBC + RMI = 3 tier ?

이전 과정에서 와 애플릿을 이용해서 형태의 클라이언트 서버 프로그램JDBC JDBC 2-tier /

을 작성하여 보았다 형태의 클라이언트 서버 프로그램은 개발하기 쉽고 간단하지만. 2-tier / ,

캐싱 기능이나 미러링 기능들을 제공할 수 없고 보안상 문제가 있다 이러한 문제들을 해결.

하기 위해서 보다는 약간 복잡하지만 유연성이 뛰어난 나 형태의 클2-tier 3-tier multi-tier

라이언트 서버 프로그램이 많이 사용된다 이제 과정에서 작성한 형태의/ . JDBC 2-tier

프로그램을 의 원격 객체를 미들티어 로 사용하는 형태Alumna.java RMI (middle tier) 3-tier

의 클라이언트 서버 프로그램으로 변경해 보자 우선 졸업생 데이터를 표현하기 위한 레코/ .

드가 필요하다 졸업생을 위한 레코드를 클래스로 표현할 수 있다. AlumnaRecord .

클래스는 클라이언트 측에서 서버의 메소드 호출을 통해 리턴 값으로 전달AlumnaRecord

되어야 하기 때문에 직렬화 되어야 한다(serializable) .

사용된 데이터베이스는 프로그램에서 사용된 것과 동일하다 다음은 데이터베JDBC 2-tier .

이스 테이블이다.

Page 450: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 450 -

설명

3 public class AlumnaRecord implements java.io.Serializable

클래스를 리턴 값으로 사용하기 위해서는 직렬화되어야 한다 클래스를AlumnaRecord RMI .

직렬화시키기 위해서는 인터페이스를 임플리멘츠한다Serializable .

다음은 미들티어 역할을 하는 부분이다 우선적으로 미들티어의 서비스를(middle-tier) RMI .

기술하는 원격 인터페이스를 로 정의한다 미들티어의 서비스는 클라이언트의RMIAlumna .

요청에 따라 데이터베이스에 접근해서 새로운 레코드를 추가 삭제 검색 둥의 작업을 수행할/ /

수 있다.

원격 인터페이스의 메소드 선언에 따라 원격 객체를 기술한RMIAlumna RMIAlumnaImpl

다 원격 객체는 포스트그래스의 데이터베이스에 접근해서 새로운. RMIAlumnaImpl alumna

레코드를 추가 삭제 검색 등의 기능을 제공한다/ / .

Page 451: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 451 -

Page 452: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 452 -

프로그램에서 클라이언트 부분은 애플릿으로 작성하였다 클라이3-tier . RMIAlumnaApplet

언트 프로그램은 미들티어와 연결돼서 직접 데이터베이스에 접근하지 않RMIAlumnaImpl

고 작업을 수행할 수 있다.

Page 453: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 453 -

Page 454: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 454 -

Page 455: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 455 -

Page 456: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 456 -

Page 457: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 457 -

그림 결과12-162. RMIAlumnaApplet

Page 458: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 458 -

제 장 자바와 코바13 . (CORBA)

코바 개요13.1 (CORBA)

코바란13.1.1

는 분산 객체와 관련된 기술적인 문제를 지원하고 표준을OMG(Object Management Group)

제정하기 위해 설립된 비영리 단체로서 년 개 업체들이 참여하여 설립되었으며, 1989 7 , 1999

년 현재 여 개 이상의 업체들이 참여하고 있다 특징은 특정 기술을 이용하여 구800 . OMG

체화된 제품을 만드는 것이 아니라 그 기술을 표현한 규격을 제시하여 업체들이 각자 구현,

하게 한다는 것이다 는 크게 두 가지 목표를 가지고 있다. OMG .

소프트웨어 공학 전반에 객체지향 기법의 적용◎

분산 환경에서 하드웨어 운영체제에 영향을 받지 않고 응용프로그램을 통합할 수 있는/◎

공통된 아치텍쳐 프레임워크의 제공

는 이러한 목표를 달성하기 위해 년에 를OMG 1990 Object Management Architecture Guide

출간하면서 의 활동 방향과 목적 및 를 구성OMG OMA(Object Management Architecture)

하는 오브젝트 모델과 레퍼런스 모델을 발표하였다 오브젝트 모델은 객체지향에서 가장 기.

본적인 객체 연산 타입 서브 타입 상속 등의 개념들을 다루었다 레퍼런스 모델은, , , , . OMG

에서 제안한 소프트웨어 컴포넌트 환경으로 를 비롯한 몇 가지 컴포넌트로 구성되어ORB

있다 다음 그림은 레퍼런스 모델이다. OMA .

그림 레퍼런스 모델13-163. OMA

모델의 각 구성 요소들을 살펴보자OMA .

ORB◎ 구조에서 는 통신 표준의 가장 핵심적인 부분: OMA Object Request Broker(ORB)

이다 는 객체들이 서로 요청 을 보내고 응답을 받을 수 있는 메커니즘을 제공. ORB (request)

하는 객체버스 혹은 소프트웨어 버스 라고 불린다 는 클라이(object bus) (software bus) . ORB

언트 객체가 서버 객체가 어디에 있는지 몰라도 서로를 연결시켜 줄 수 있을 뿐만 아니라

하드웨어 운영체제 구현 프로그래밍 언어에 무관하게 객체들간에 통신할 수 있는 방법을 제/ /

공한다 를 상업적으로는 라고. ORB CORBA(Common Object Request Broker Architecture)

부른다.

Page 459: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 459 -

객체 서비스(Object Service)◎ 객체 서비스는 에서 이외에 가장 기본적으로: CORBA ORB

제공되는 서비스들을 말한다 객체서비스에서 제공하는 기능들로는 객체의 생성 객체에 대. ,

한 접근 제어 위치가 변경된 객체 추적 객체들 간의 일관된 관계성 유지 등이 있다 객체, , .

서비스는 객체가 작업을 수행할 수 있는 가장 기본적인 환경을 제공한다 대표적인 객체 서.

비스들은 다음과 같은 것들이 있다.

Life Cycle○ 객체의 생성에서 삭제까지 객체의 전체적인 라이프사이클을 관리하는 기능:

을 제공한다.

Naming○ 이름을 이용해서 객체를 찾을 수 있는 기능을 제공한다 기존의: . X.500, OSF

등의 명명 규칙과 네트워크 디렉토리 등을 지원한다DCE .

Event○ 이벤트 서비스는 특정 이벤트에 관련된 컴포넌트들이 동적으로 등록되거나 등록:

을 취소할 수 있는 기능을 지원한다.

Concurrency Control○ 트랜잭션이나 쓰레드 수행에 필요한 락 기능을 제공한다: (lock) .

Relationship○ 이 서비스는 서로 알지 못했던 컴포넌트간의 동적인 연관성을 생성하게 해:

준다.

Query○ 질의 서비스는 객체에 대한 표준 질의 기능을 제공한다: .

Licence○ 라이센스 서비스는 컴포넌트의 사용량을 측정할 수 있는 기능을 제공한다: .

공통 기능(Common Facilities)◎ 특정한 구성에 맞는 요구 사항에 따라 구성할 수 있는 응

용 기능들을 제공한다 예를 들면 프린트 기능 데이터베이스 기능 전자 메일 기능 등이 있. , , ,

다.

응용 인터베이스(Application Interface)◎ 사용자의 특정 작업을 수행할 수 있는 응용 객:

체들을 제공한다 하나의 응용 객체는 여러 개의 기본적인 클래스들을 바탕으로 만들어진다. .

따라서 새로운 클래스는 기존의 클래스를 확장하거나 일반화해서 최소한의 변경을 통해서

만들어질 수 있다.

도메인 인터베이스(Domain Interface)◎ 응용 프로그램 도메인을 위한 도메인 인터페이스:

이다 예를 들면 재무 건강 관리 전자 상거래 운송 등이 있다. , , , .

다음은 에서 정적 동적 메소드 호출을 보여주는 그림이다 클라이언트는 컴파일 시CORBA / .

에 호출할 메소드를 미리 알고 있는 정적 메소드 호출과 실행 시에 호출할 메소드를 결정하

는 동적 메소드 호출을 지원한다 정적 메소드 호출을 위해서는 프리컴파일러. IDL

에 의해 클라이언트 스텁 클래스를 생성한다 동적 메소드 호출은 실행(precompiler) (stub) .

시에 호출할 메소드를 결정해서 호출할 수 있기 때문에 보다 유연하게 작동될 수 있다 동.

적 호출은 많은 유연성을 제공하지만 대부분의 응용프로그램은 정적 호출 방법을 사용해서

작성할 수 있다 정적 호출은 동적 호출에 비해 다음과 같은 장점을 가지고 있다. .

프로그램 작성이 쉽다.○

타입 체킹에서 동적 호출보다 에러를 찾기 쉽다.○

성능이 동적 호출보다 우수하다.○

프로그램을 이해하기 쉽다.○

Page 460: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 460 -

그림 의 정적 동적 호출13-164. CORBA /

응용 프로그램은 다음과 같은 절차를 거쳐 작성할 수 있다CORBA .

그림 프로그램 작성 절차13-165. CORBA

응용프로그램 개발자는 객체가 제공할 서비스를 로 기술한1. IDI(Inteface Definition Languge)

다.

로정의된객체정의는전용컴파일러를통해컴파일함으로서클라이언트용 프로그램2. IDL stub

과 서버용 프로그램을 생성한다skeleton .

서버 프로그램을 원하는 언어로 작성한다3. .

개발자는클라이언트프로그램을원하는언어 등 를이용해서작4. (C, C++,Smalltalk, Ada, java )

성한다.

클라이언트 프로그램과 프로그램을컴파일및링크해서실행파일을작성한다 마찬가지5. stub .

로 서버 프로그램과 프로그램을 컴파일 및 링크해서 실행코드를 생성한다skeleton .

Page 461: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 461 -

코바와 관련돼서 수많은 문서와 논문들이 발표되어서 내용이 방대하기 때문에 코바에 관한

자세한 설명은 생략하기로 한다 이 장에서는 주로 자바언어로 코바 프로그래밍을 하는 방.

법을 다루도록 한다 코바 관련 서적이 국내외적으로 많이 출판되었기 때문에 코바에 관한.

자세한 내용은 다른 서적들을 참조하기 바란다.

코바 예제 프로그램13.1.2 (CORBA)

코바에 대해 간단히 알아보았다 코바는 내용이 상당히 방대하기 때문에 깊이 공부하고자.

하는 사람은 코바에 관한 책을 참고할 필요가 있다 그러나 를 이용해서 간단하게. CORBA

프로그램을 작성하는 것은 그리 어렵지 않을 것 같다 코바를 이용하는 경우에 구현 언어는.

크게 상관없기 때문에 이곳에서는 자바 언어를 이용해서 구현해보도록 하자 또한. CORBA

제품은 사의 비지브로커 를 이용하도록 한다 비지브로커는 사INPRISE (Visibroker) . INPRISE

의 홈페이지 를 방문해서 데모 버전을 얻(http://www.inprise.com/) VisiBroker for Java 3.x

을 수 있다 데모버전은 개월 간 사용할 수 있다 비지브로커를 설치한 후에 파. 2 . README

일을 읽어보고 환경 변수를 적절하게 설정해주어야 한다.

우선 비지브로커를 이용해서 간단한 프로그램을 작성해보자 코바 프로그램은 다음Hello .

절차를 따라 작성할 수 있다.

로 서비스를 기술한다1. IDL . 코바의 서버 객체를 만들기 의해서는 먼저 IDL(Interface

을 이용해서 서버 객체의 서비스 함수와 멤버 필드를 기술해주어야 한Definition Language)

다 다음 파일은 라는 객체에 라는 멤버 필드와 라는 서. greeting.idl Hello message sayHello()

비스 함수를 기술한다.

를 이용해서 로 기술된 내용을 자바 언어로 변환한다2. idl2java IDL .

% idl2java greeting.idl

Traversing greeting.idl

Creating: greeting

Creating: greeting/Hello.java

Creating: greeting/HelloHolder.java

Creating: greeting/HelloHelper.java

Creating: greeting/_st_Hello.java

Creating: greeting/_HelloImplBase.java

Creating: greeting/HelloOperations. java

Creating: greeting/_tie_Hello. java

Creating: greeting/_example_Hello. java

% ls greeting/*Hello.java HelloOperations.java _st_Hello.javaHelloHelper.java _HelloImplBase.java _tie_Hello.javaHelloHolder.java _example _Hello.java

Page 462: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 462 -

서버 객체를 구현한다3. .

서버 객체는 의 인 의 메소드와 멤버 필드를 구현한 클래스이다 서버 객IDL interface Hello .

체는 명령어로 생성된 클래스로부터 상속받아 만든다 서버 객체의idl2java _HelloImplBase .

이름은 보통 인터페이스의 이름에 붙여서 만든다(Hello + Impl) .

서버 객체를 구동할 서버 프로그램을 작동한다4. .

다음으로 할 일은 클래스를 구동시킬 서버 프로그램을 작성하는 것이다HelloImpl .

클라이언트를 작성한다5. .

서버가 작성되었으면 서버의 함수를 호출할 클라이언트를 작성하여야 한다 클라이언트는.

클래스의 메소드를 이용해서 서버 객체의 레퍼런스를 얻어온다 서버 객체의Helper bind() .

레퍼런스는 다른 로컬 객체의 레퍼런스와 동일한 방법으로 사용될 수 있다.

Page 463: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 463 -

를 실행킨다6. osagent .

% osagent &

서버 프로그램을 실행시킨다7. .

% java greeting.HelloServer &

클라이언트를 실행시킨다8. .

박준서% java greeting.HelloClient

박준서Hello ^_*~

코바 애플릿 예제 프로그램13.1.3 (CORBA)

바로 앞에서 작성된 클라이언트를 애플릿으로 작성한다면 어떨까 클라이언트를 애플릿으로?

작성하기 때문에 서버 부분은 변경이 없다.

Page 464: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 464 -

애플릿을 이용해서 클라이언트를 만든다5-1. .

파일을 작성한다5-2. HTML .

를 실행시킨다6-1. osagent .

% osagent &

Page 465: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 465 -

를 실행시킨다6-2. gatekeeper .

% gatekeeper &

서버 프로그램을 실행시킨다7. .

% java greeting.HelloServer &

애플릿뷰어나 웹브라우저를 이용해서 애플릿을 실행시킨다8. .

% appletviewer HelloClientApplet.html

그림 결과13-4. HelloClientApplet

비지브로커13.1.4 (Visibroker)

비지브로커는 여러 가지 도구들을 제공하는데 많이 사용되는 도구들을 간단하게 살펴보자, .

idl2java◎ 파일로부터 자바 소스 파일을 생성한다: IDL .

사용법 옵션: idl2java [ ] { filename.idl }

예 : idl2java -no_tie greeting.jdl

옵션 :

을 이용해서 이식성 있는 스- portable : DII(Dynamic Interface Invocation) (portable)

텁 코드를 생성한다.

간에 완전히 이식성 있는 코드를 생성한다- strict : ORB .

생성된 코드에서 주석문은 생략한다- no_comments : .

예제 프로그램은 생성하지 않는다- no_example : .

클래스는 생성하지 않는다- no_tie : _tie .

gatekeeper◎ 를 실행시킨다: IIOP Gatekeeper .

사용법 옵션: gatekeeper [ ]

예 : gatekeeper -port 2999

옵션 :

디버깅 모드로 수행한다- debug : .

파일을 파일에 저장한다- IOR filename : gatekeeper IOR filename .

애플릿에서 콜백 기능을 제거한다- no_callbacks : .

osagent◎ 스마트 에이전트 를 수행시킨다 는 비지브로커의 역: (smart agent) . osagent ORB

할을 수행한다.

사용법 옵션: osagent [ ]

Page 466: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 466 -

예 : osagent -a l99.10.9.5

옵션 :

윈도우즈 에서 실행할 때 사용한다- C : NT .

새로운 포트번호를 사용한다- p UDP_port : .

모드로 수행한다- v : verbose .

비지브로커의 자바 컴파일러는 이다 컴파일러를 이용하는 경우에lDL idl2java . idl2java IDL

은 여러 가지 유용한 자바 클래스와 인터페이스 파일들을 생성한다 이 파일들을 을 직. IDL

접 자바로 매핑시키는 클래스들과 프로그래머를 위한 헬퍼 와 흘더 클래스들(heper) (holder)

로 구성된다.

Page 467: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 467 -

자바에서 파라미터 패싱은 를 사용해서 파라미터의 값을 전달만 하지만call-by-value , IDL

에서는 파라미터의 방향성 에 따라 값을 전달하거나 값을 받아와야 할 경우(in, out, inout) ,

가 있다 따라서 에서 파라미터의 방향성에서 특성을 자바에서 제공하기 위해. IDL out, inout

홀더 클래스들이 필요하게 된다.

사용자가 정의한 모든 타입에는 말로 끝나는 헬퍼 클래스를 갖는다 헬퍼 클래IDL (helper) .

스는 관련 객체들을 위한 여러 유틸리티 메소드들을 포함하고 있다.

다음 그림은 을 컴파일러를 통해 생성되는 파일들을 보여준다greeting.idl idl2java .

그림 로 생성되는 파일13-167. idl2java

의 인터페이스에 해당되는 자바 인터페이스 파일이다 프로그Hellojava : IDL Hello .◎

래머는 이 인터페이스를 임플리멘츠해야 한다.

에서 파라미터를 위해 사용되는 홀더 클래스 파일HelloHolder.java : IDL out, input◎

이다.

객체를 위한 유틸리티 메소드들을 제공하는 헬퍼 클래스HelloHelper.java : Hello◎

파일이다.

인터페이스 를 위한 서버 측 스켈리톤 클_HelloImplBase.java : IDL Hello (skeleton)◎

래스 파일 이다.

인터페이스 를 위한 클라이언트 측 스텁 클래스 파_st_Hello.java : IDL Hello (stub)◎

일이다.

상속 대신에 위임 방식을 사용하는 메커니즘을 사tie-Hello.java : (delegation) Tie◎

용하는 경우에 사용되는 클래스이다.

메커니즘을 지원하기 위한 오퍼레이션들을 포함한다HelloOperations.jav a: Tie .◎

인터페이스를 임플리멘츠하는 것을 보여주는 예제 프로그_example_Hellojava:Hello◎

램이다.

Page 468: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 468 -

코바 클라이언트 프로그램은 다음과 같은 순서로 프로그램을 기술한다.

를 초기화한다1. ORB . - org.omg.CORBA.ORB.init()

서버 클래스를 시킨다2. bind . - HelloHelper.bind(orb, "hello")

서버에 리퀘스트를 보낸다3. . - hello.sayHello(name)

Page 469: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 469 -

클라이언트 프로그램은 서버의 메소드를 호출하기 전에 메소드를 이용해서 서버 객bind()

체의 레퍼런스를 얻어야한다 메소드는 헬퍼 클래스를 통해서 호출할 수 있. bind() (helper)

다 메소드의 첫 번째 아규먼트로는 객체가 사용된다. bind() org.omg.CORBA.ORB . bind()

메소드가 호출되면 는 프로그래머를 위해 다음과 같은 다양한 작업들을 수행한다ORB .

는 와 연결해서 원하는 서버 객체의 위치를 파악한다1. ORB osagent .

서버 객체의 위치를 파악한 는 서버와 연결을 시도한다2. ORB .

서버객체와연결이성공하면 는프록시객체 를생성하고객체의레퍼런스3. , ORB (proxy object)

를 리턴 한다.

코바 서버 프로그램은 다음과 같은 순서로 프로그램을 기술해준다.

를 초기화한다1. ORB . - org.omg.CORBA.ORB.init()

를 초기화한다2. BOA . - orb.BOA_init()

서버 클래스를 생성한다3. . - HelloImpl hello = new HelloImpl("hello")

서버 클래스를 활성화한다4. . - boa.obj_is_ready(hello)

클라이언트로부터 요청이 올 때까지 기다린다5. . - boa.impl_is_ready()

서버 객체는 객체가 활성화시켜 클라이언트 프로그램이 사용할 수 있도록 하기 위해ORB

서 를 이용한다 객체를 생성할 때 서버 클래스인 경우에는 클라이언트 프로그램이BOA .

를 통해 서버의 메소드를 호출할 수 있도록 하기 위해서는 객체의 이름을 지정해주osagent

어야 한다 객체가 이름을 가지면 서버에서 메소드를 호출할 때 객체의. , BOA.obj.is_ready()

인터페이스 이름이 비지브로커의 에 등록된다 서버 객체는 다시osagent .

메소드를 호출해서 클라이언트의 요청을 기다리는 무한 루프를 수행한BOA.impl_is_ready()

다.

다음 그림은 를 통해서 클라이언트와 서버가 작동하는 모습을 보여준다 서버는ORB .

메소드를 호출해서 서버를 에 등록한다 클라이언트는 메소드를obj_is_ready() ORB . bind()

이용해서 이름을 통해 원하는 서버를 찾는다 는 이름을 찾은 경우에 클라이언트에 객. ORB

체의 레퍼런스를 전달한다 클라이언트는 레퍼런스를 통해 서버에 요청을 보낼 수 있다. .

그림 의 동작13-168. ORB

Page 470: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 470 -

문법과 자바 언어로의 매핑13.2 IDL

앞의 간단한 예제에서 살펴보았듯이 코바를 사용하기 위해서는 을 이용해서 인터페이스IDL

를 기술해주어야 한다 은 의 문법과 유사하게 만든 인터페이스를 기술하기 위해 고. IDL C++

안된 언어이다 은 객체지향 언어로서 캡슐화 폴리모피즘 상속 등의 개념을 지원한다. lDL , , .

다음은 로 인터페이스를 기술한 예이다IDL .

에서 은 의미 있는 서브 시스템을 구성하는데 사용된다 은 여러 개의IDL module . module

들로 구성되어 있다 인터페이스는 객체지향에서 클래스와 유사한 개념으로 다른interface .

인터페이스로부터 상속받을 수 있다 인터페이스는 을 포함할. attribute, exception, operation

수 있다.

어트리뷰트는 객체지향에서 클래스의 멤버필드와 같다 따라서 이름과 자료 유형을 갖는다. .

자료유형은 기본 자료형과 에서 정의한 객체를 사용할 수 있다IDL IDL .

오퍼레이션은 메소드에 해당된다 오퍼레이션은 리턴 타입 오퍼레이션 이름 아규먼트를 갖. , ,

고 추가적으로 을 기술할 수 있다 오퍼레이션에서 각 아규먼트는 의exception . in/out/inout

방향 자료유형 아규먼트 이름으로 구성된다, , .

이제 의 각 구성 요소들이 자바 언어로 어떻게 매핑되는지 알아보자 의 자바 매핑IDL . IDL

은 년에 표준으로 제정되었다1997 .

모 듈1. (module)

의 모듈은 일련의 인터페이스들을 하나의 네임 스페이스 로 묶음으로IDL IDL (name space)

서 스코프 를 제어하기 위해서 사용된다 의 모듈은 자바의 패키지로 매핑된다(scope) . IDL .

// IDL

module Example {...}

// Java

pckage Example:

...

Page 471: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 471 -

인터 페이스2. (interface)

의 인터페이스는 분산 객체 시스템에서 객체 및 객체가 제공하는 서비스를 기술하기 위IDL

해서 사용된다 따라서 인터페이스는 일반적인 객체로 볼 수 있다 인터페이스는. IDL . IDL

어트리뷰트와 오퍼레이션을 포함할 수 있다.

Page 472: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 472 -

의 인터페이스는 자바의 인터페이스에 매핑된다 이것은 에서는 다중 상속을 지원하IDL . IDL

지만 자바의 클래스에서는 다중 상속을 지원하지 않기 때문에 다중 상속을 위해 자바 인터

페이스를 이용하는 것이다.

어트리뷰트3. (attribute)

어트리뷰트는 객체의 멤버 필드에 해당되는 변수이다 의 어트리뷰트는 키워드. IDL attribute

를 사용하고 그 뒤에 데이터 타입과 어트리뷰트의 이름을 기술해준다 어트리뷰트는 구현언, .

어로 매핑될 때 멤버필드와 그 멤버필드의 값을 읽어오고 값을 설정할 수 있는 함수로 매핑

된다 앞의 예제에서 어트리뷰트 과 는 각각 타입과 타입을 갖는다. name id string long . IDL

의 어트리뷰트가 자바 언어로 매핑된 예를 보면 과 의 변수는 정의되면서 추가적으name id

로 변수의 값을 설정하기 위한 과 메소드가 선언된name(java.lang.String name) id(int id)

다 또한 변수의 값을 알아보기 위한 과 메소드도 선언된다. java.lang.String name() int id() .

키워드를 이용하면 어트리뷰트의 값을 읽기 전용으로 선언할 수도 있다readonly .

오퍼레이션4. (operation)

의 오퍼레이션은 객체의 메소드에 해당되며 이것은 클라이언트가 호출할 수 있는 서비IDL ,

스가 된다 오퍼레이션은 리턴 타입과 아규먼트를 가지며 특별한 경우에 예외 를. (exception)

발생시킬 수 있다 아규먼트는 방향성을 기술해주어야 한다. in/out/inout .

in 호출되는함수로값을전달한다.

out 호출되는함수로부터값을얻어온다.

inout 호출되는함수에값을전달하고 값을받아온다, .

오퍼레이션이 예의를 발생할 수 있는 경우에는 뒤에 키워드와 예외의 이름을 기술한raises

다 오퍼레이션은 기본적으로 동기적 으로 작동한다 이것은 오퍼레이션을 호출. (synchronous) .

하면 함수의 수행 결과를 리턴할 때까지 기다리는 방식이다 그러나 결과를 기다릴 필요가. ,

Page 473: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 473 -

없는 경우에는 키워드를 사용해서 단방향임을 기술할 수 있다 를 선언하는oneway . oneway

경우에는 다른 오퍼레이션들 보다 먼저 기술해주어야 한다.

oneway void broadcast(in string message):

예외5. (exception)

예외는 키워드를 이용해서 선언할 수 있다 의 자바의 클래스로 매핑한다exception . IDL .

// IDL

//Java

파일BadMoneyValue.Java

Page 474: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 474 -

상속6. (inheritance)

은 다중 상속을 허용하고 상속을 위해서는 에서와 같이 를 사용한다 의 상IDL , C++ “:” . IDLD

속 관계는 자바에서도 마찬가지로 상속 관계로 매핑된다.

//IDL

에서 다중 상속이 필요한 경우에는 부모 클래스를 로 연결해서 선언하면 된다 다음IDL ',' .

예에서 는 과 로부터 다중 상속을 받는 경PremiumAccount CheckingAccount SavingAccount

우이다.

Page 475: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 475 -

전방 선언7. (forward declaration)

에서 인터페이스나 예외는 다른 곳에서 참조되기 전에 선언되어야 한다 전방 선언IDL .

은 인터페이스나 예외를 정의하지 않고 이름만 미리 선언하는 것이다(forward declaration) .

자료형8.

에서는 다음과 같은 종류의 자료형을 지원한다IDL 4 .

기본형◎

구조체형 - enum, struct, union◎

템플릿형(templete type)◎

가상 객체형(pseudo object type)◎

Page 476: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 476 -

기본형(1)

다음 표는 에서 사용되는 자료 유형과 자바 언어에서 사용되는 자료 유형을 비교한 것IDL

이다.

타입IDL 타입Java Exceptionsboolean booleanchar char CORBA::DATA_CONVERSIONwchar charoctet byte

string java.lang.String CORBA::MARSHALCORBA::DATA_CONVERSION

wstring java.lang.String CORBA::MARSHALshort shortunsigned short shortlong intunsigned long intlong long long

unsigned long long long

float floatdouble double

구조체형(2)

가( ) enum

타입은 데이터 멤버들을 특정한 순서로 나열할 때 사용된다 은 자바의 클enum . enum final

래스로 매핑되고 의 각 요소의 이름과 동일한 이름의 클래스 인스턴스들이 생긴다, enum .

Page 477: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 477 -

Page 478: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 478 -

나( ) struct

타입은 다양한 타입의 멤버들을 하나로 묶을 때 사용된다 의 타입은 자바struct . IDL struct

의 클래스로 매핑되고 의 멤버들은 자바 클래스의 멤버필드로 매핑된다final , struct .

다( ) union

타입은 서로 다른 데이터형을 동일한 이름으로 접근할 필요가 있을 때 사용된다union . IDL

의 유니온은 자바의 클래스로 매핑된다final .

Page 479: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 479 -

Page 480: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 480 -

템플릿 형(3)

가( ) sequence

시퀀스는 최대 크기와 길이를 갖는 일차원 배열이다 최대 길이는 컴파일 시에 결정되고 길.

이는 실행 시에 결정된다 시퀀스는 최대 길이가 결정된 바운드와 최대 길이가 결정되지 않.

은 언바운드가 있다 의 시퀀스는 자바의 배열로 매핑된다. IDL .

Page 481: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 481 -

나( ) array

의 배열은 크기가 고정된 다차원 배열이다 의 배열은 의 바운드 시퀀스와 동일IDL . IDL IDL

한 방법으로 자바의 배열로 매핑된다.

가상 객체(4) (Pseudo-Object)

코바의 가상 객체는 자바의 클래스로 매핑된다 다음 테이블은 가상 객체가 자바 클래스로.

매핑되는 것을 보여준다.

타입IDL 타입JavaCORBA::ORB org.omg.CORBA.ORBCORBA::Object org.omg.CORBA.ObjectCORBA::Namedvalue org.omg.CORBA.NamedValueCORBA::NVList org.omg.CORBA.NVListCORBA::Request org.omg.CORBA.RequestCORBA::ServerRequest org.omg.CORBA.ServerRequestCORBA::TypeCode org.oIng.CORBA.TypeCodeCORBA::TCKind org.omg.CORBA.TCKind

Page 482: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 482 -

(5) const

는 상수를 정의하기 위해 사용되며 한번 값이 초기화되면 값을 변경할 수 없다const , . const

는 내부에 선언되면 자바 클래스의 멤버필드로 매핑된다 그러나 가interface , final . , const

밖에 선언된 경우에는 자바 클래스로 매핑된다interface , final .

(6) typedef

키워드는 에서 새로운 타입을 선언하기 위해서 사용된다typedef IDL .

Page 483: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 483 -

Page 484: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 484 -

응용 프로그램13.3

은행 프로그램13.3.1

다음은 유명한 은행 프로그램을 알아보자 예제를 살펴보기 전에 기본적인 시나리오를 살펴.

보자 프로그램의 기본 시나리오는 이렇다 모듈은 계정을 위한 와 계정을 관. . Bank Account

리하기 위한 를 가지며 클라이언트가 이름을 아규먼트로AccountManager , AccountManager

의 메소드를 호출하면 는 해당되는 이름의 레퍼런스를 클open() AccountManager Account

라이언트에 리턴 값으로 전달한다 해당되는 이름의 가 없는 경우에는 새로운. Account

를 만든다 의 레퍼런스를 전달받은 클라이언트는 이 레퍼런스를 이용해서Account . Account

의 메소드를 호출해서 현재 은행 잔고를 알아본다Account balance() .

프로그램을 위한 은 다음의 과 같이 나타낼 수 있다 는 문자열IDL Bank.idl . AccountManager

을 아규먼트로 갖고 를 리턴하는 메소드를 갖는다 는 현재 은행 잔Account open() . Account

고를 알아보는 메소드를 갖는다balance() .

다음은 를 위한 자바 클래스 를 만든다 은 패키지의Account (AccountImpl) . AccounImpl Bank

클래스로부터 상속받는다 클래스는 을_AccountImplBase . _AccountImplBank Bank.idl

명령어를 이용해서 자동적으로 생성한 자바 클래스이다idl2java .

다음은 를 위한 클래스를 작성한다 과AccountManager AccountManagerImpl . AccountImpl

마찬가지로 도 패키지의 클래스로부AccountManagerImpl Bank _AccountManagerImplBase

터 상속받아 작성한다.

Page 485: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 485 -

을 구동시킬 서버 프로그램을 작성한다 서버 프로그램에서는AccountManagerImpl .

클래스를 생성하고 서비스할 수 있도록 준비 상태 로 만든다AccountManagerImpl (ready) .

서버가 작성된 다음에 클라이언트 프로그램을 작성한다 클라이언트는 메소드를 이용. bind()

해서 레퍼런스를 얻어오고 이 레퍼런스를 이용하여AccountManagerdmlll , AccountManager

의 메소드를 호출한다 메소드는 의 레퍼런스를 리턴하고 클라이언트open() . open() Account ,

는 이 의 레퍼런스를 이용해서 메소드를 호출할 수 있다Account balance() .

Page 486: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 486 -

Page 487: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 487 -

결과

% osagent &

% java BankServer &

% java BankClient

Created Choi Jong Myung's account:

AccountImpl[Server,oid=TransientId[repId=IDL:Bank/Account:1.0,serverId=2,creationTime=-

1290607182]]

The balance in Choi Jong Myung's account is $73.46

% java BankClient

The balance in Choi Jong Myung's account is $73.46

% java BankClient "Kim Young Chul"

Created Kim Young Chul's account:

AccountImpl[Server,oid=TransientId[repId=IDL:Bank/Account:1.0,serverId=9,creationTime=-

1290560887]]

The balance in Kim Young Chul's account is $957.76

애플릿 만들기

Page 488: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 488 -

% osagent &

% gatekeeper &

% java BankServer &

% appletviewer BankClientApplet.html

그림 결과13-7. ClientApplet

콜백13.3.2 (callback)

코바에서 콜백은 에서 콜백과 동일하다 클라이언트가 일방적으로 서버의 메소드를 호RMI .

출하는 방법에서 탈피하여 클라이언트가 서버에 등록되면 서버가 클라이언트의 메소드를 호

출할 수 있도록 허용하는 것을 콜백이라 한다 에서와 마찬가지로 콜백을 이용해서 채. RMI

팅할 수 있는 프로그램을 작성해보자 다음의 은 채팅을 위한 을 기술하고 있다. chat.idl IDL .

채팅 서버를 위한 은 로서 클라이언트가 서버에 등록할 수 있는IDL CORBAChatServer ,

메소드와 등록을 해지할 수 있는 메소드 클라이언트가 메시지를 전register() unregister() ,

송할 수 있는 메소드를 가지고 있다 클라이언트가 메소드를 호출하broadcast() . broadcast()

는 경우에 서버는 등록된 모든 클라이언트들에 대하여 메소드를 호출한다setMessage() .

Page 489: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 489 -

다음은 를 위한 자바 클래스이다 메소드는 아규먼트로 넘겨받CORBAChatServer . register()

은 과 를 클래스에 등록한다 메소드는 에 등록된name client Vector . unregister() Vector

과 를 제거한다 메소드는 에 등록된 들을 찾아서name client . broadcast() Vector client

의 메소드를 호출하도록 한다CORBAChatClient setMessage() .

다음은 클라이언트 애플릿과 를 구현한 클래스이CORBAChatClient CORBAChatClientImpl

다.

Page 490: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 490 -

Page 491: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 491 -

Page 492: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 492 -

그림 로그인13-170. CORBAChatClientApplet화면

그림 채팅13-170. CORBAChatClientApplet화면

13.3.3 CORBA + JDBC = 3-tier ?

앞에서 자바 와 를 이용해서 형태의 동문 주소를 관리하는 프로그램을 작RMI JDBC 3-tier

성하여 보았다 이 장에서는 와 를 이용해서 형태의 동문 주소 관리 프. CORBA JDBC 3-tier

로그램을 작성하여 보자.

우선적으로 프로그램을 위한 을 작성하여야 한다 다음 은 서버를 위한IDL . alumna.idl

인터베이스와 졸업생 정보를 관리하기 위한 레코드 타입을 위해 를Alumna AlumnaRecord

정의한다.

클래스는 서버를 위한 인터페이스를 구현한 것이다 은 클AlumnaImpl Alumna . AlumnaImpl

라이언트로부터 오는 등의 요청에 따라 와 을 이add(), delete(), search(), total() JDBC SQL

용해서 데이터베이스에서 정보를 추가 삭제 검색 기능을 수행한다, , .

Page 493: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 493 -

Page 494: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 494 -

다음은 동문 주소록을 위한 클라이언트 프로그램이다.

Page 495: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 495 -

Page 496: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 496 -

Page 497: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 497 -

Page 498: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 498 -

Page 499: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 499 -

그림 결과13-172. CORBAAlumnaApplet

코바 응용 프로그램13.3.4 : WebPostIt

다음은 인터넷에서 자바 애플릿과 코바를 이용해서 메시지를 주고받을 수 있는 WebPostIt

응용프로그램을 작성해 보자 은 등록한 모든 사용자들에게 메시지를 보낼 수 있. WebPostIt

고 특정사용자들에게만 메시지를 보낼 수도 있다 메시지를 받은 사람은 메시지를 보낸 사, .

람에게 응답 할 수 있다 이러한 기능들을 위해 코바의 콜백 기능을 이용한다 다음은(reply) . .

파일이다 는 서버를 위한 이고 는 콜백을 위한 이다IDL . PostServer IDL PostitReceiver IDL .

Page 500: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 500 -

Page 501: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 501 -

Page 502: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 502 -

Page 503: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 503 -

Page 504: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 504 -

Page 505: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 505 -

그림 로그인 화면13-173. PostItApplet

Page 506: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 506 -

Page 507: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 507 -

Page 508: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 508 -

그림 결과13-174. WebPostIt

Page 509: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 509 -

Page 510: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 510 -

그림 13-175. PostItMessage 그림 포스트잇 모습13-176. reply

Page 511: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 511 -

Page 512: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 512 -

Page 513: 자바강좌 - ITFIND - IT 지식포털 · -5-10.7.1http cgi와이해 10.7.2 cgi서버측 응용프로그램 10.7.3cgi클라이언트프로그램 제 장 프로그램11 .jdbc 11.1sql기본

- 513 -