Ⅰ. Java 언어의 소개

자바 프로그래밍

1. 자바의 유래

자바는 월드 와이드 웹이 개발되기 시작하였던 1991년 선 마이크로시스템즈(Sun Microsystems)에서 제임스 고슬링(James Gosling)에 의해 단순하고 버그가 없는 가전 전자 제품을 만드는 것을 목적으로 개발되기 시작하였으며, 그 결과 나온 것이 바로 Oak라는 언어이다. Oak는 나중에 자바라는 이름으로 바뀌게 된다. 1993년 고슬링은 핫자바를 개발하였다.

※ 핫자바(Hot Java) : 자바 애플릿(Java Applet)을 구현한 최초의 웹 브라우저

2. 자바 애플리케이션과 자바 애플릿

□ 자바 언어는 우리가 보통 사용하고 있는 C나 C++언어처럼 에디터를 통해 소스를 편집하고

자바 컴파일러를 통해 실행 파일을 만들게 된다.

□ 자바로 만든 실행 파일은 프로그램을 실행시키는 하드웨어와 운영체제에 관계없이 실행될 수

있기 위해 □바이트 코드(Byte Code)□라는 포맷을 사용하고 있다.

※자바 애플릿(Java Applet) : 월드 와이드 웹에서 브라우저를 통해 실행할 수 있는 프로그램.

※자바 애플리케이션(Java Application) : 브라우저 없이 독립적으로 실행될 수 있는 프로그램.

3. JDK(Java Developers Kit) 설치하기

□ 윈도우95나 NT상태에서 도스 창을 하나 연 후에 압축을 풀어야 한다.

SET PATH = %PATH%;C:\java\bin

SET CLASSPATH = .;C:\java\lib\classes.zip

SET LIB = C:\java\lib

SET HOME = C:\java

Ⅱ. 자바의 특징

자바 프로그래밍

1. 코드의 단순성

□ C++에서 잘 사용되지 않거나 모호하고 좋지 않은 기능들은 제외시키고 단순화시켰다.

자바가 C/C++과 다른점

1. 구조체(struct), 공용체(Union), 포인터(pointer)를 지원하지 않는다.

2. typedef와 #define을 지원하지 않는다.

3. 연산자 다중 정의를 지원하지 않는다.

4. 클래스 다중 상속을 지원하지 않는다.

5. 문자 배열로서 String이라는 클래스를 지원한다.

6. 쓰레기 수집( Garbage Collection ) 기능을 제공함으로써 메모리 할당과 해제

함수를 사용할 필요가 없다.

2. 객체지향 언어

□ C++에서와 같은 전역 변수와 독립 함수라는 것이 존재하지 않는다. 자바에서는 오직 객체

만이 존재하고 있다.

□ 객체 = 속성(Attributes) + 행위(Behavior)

= 변수(Variables) + 메소드(Method)

3. 플랫폼 독립

□ 특정 플랫폼이 아닌 네트웍 환경과 다양한 하드웨어에서 작동할 수 있다.

□ 자바로 작성된 프로그램은 윈도우, 매킨토시, 유닉스 등 자바 코드를 실행할 수 있는 자바        가상(virtual) 머신만 있으면 자바 코드를 변경할 필요없이 실행할 수 있다.

□ 자바 컴파일러는 바이트 코드(Byte Code)라는 중립적인 구조의 실행 코드를 만들어낸다.

□ 바이트 코드는 각 플랫폼에 있는 인터프리터를 통해 실제로 실행된다.

(자바 인터프리터가 자바 코드를 한줄 한줄 실행하게 되어 있다.)

4. 신뢰성과 안정성

□ 컴파일시에 엄격한 데이터 형을 검사함으로써 프로그램 실행시 발생할 수 있는 비정상적인

상황 등을 미리 막을 수 있다.

□ 시스템의 힙(Heap)이나 스택(Stack) 등의 메모리에 접근할 수 없기 때문에 바이러스로부터

안전하게 보호될 수 있다.

□ 공용키 암호화 방법으로 사용자를 식별하기 때문에 해커들로부터 암호화 같은 중요한 정보

들을 보호할 수 있게 된다.

5. 높은 성능

□ 쓰레기 수집(Garbage Collection)기능이 추가되어 있어서 한 번 메모리가 할당된 객체의

상태를 끝까지 추적하여, 더 이상 사용되지 않거나 메모리가 해제되면 자동적으로 메모리를

수거한다.

6. 멀티스레드(Multi-thread)

하나의 프로그램 안에서 여러 작업을 동시에 처리할 수 있는 기능이 있다.

Ⅲ. 프로그램 소개

1. 자바 애플리케이션 소스 입력

윈도우즈 95에서 도스 창을 열고 □edit□를 사용하거나 보조 프로그램인 워드패드를 사용하여 입력.

/* HelloWorld 클래스 정의 시작 */

class HelloWorld{

// main 메소드 : 프로그램에서 가장 먼저 실행되는 메소드

public static void main(String args[]) {

/** Hello World!라는 문장을 화면에 출력하는 부분 */

System.out.println("Hello World!");

}

}

□HelloWorld.java□라는 이름으로 소스를 저장.

2. 자바 애플리케이션 분석

□ 주석문

자바 언어에서 주석문(Comment)은 □/*□ 와 □*/□사이, □//□뒤에 기술하며, 컴파일 대상에서 제외된다. (주석문은 프로그램의 이해를 증진시킨다.)

□ class 키워드

□class 라는 것은 객체지향 프로그래밍에서 가장 기본이 되는 클래스를 정의하는 키워드.

□모든 자바 프로그램은 이 클래스를 하나 이상 가지게 된다.

□보통의 경우 주 클래스 이름이 프로그램의 이름이 된다.

□컴파일하게 되면 클래스 이름뒤에 .class라는 확장자가 붙는다.

□ main 메소드

□ 자바에서는 함수라는 이름 대신에 메소드라는 말을 사용.

□ 메소드의 입력은 String타입의 args라는 매개변수.

□ main메소드의 출력(리턴값)은 void - 아무 것도 출력하지 않는다.

□ public 키워드 - 누구든지 이 메소드를 호출할 수 있도록 공개하겠다는 의미.

□ static 키워드 - 이 클래스에는 오직 하나의 main 메소드를 공유하도록 하겠다는 의미.

□ ( ) : 소 괄호 - 메소드, 수식의 우선 순위

{ }          : 중 괄호 - Block의 시작과 끝.

[ ] : 대 괄호 - 배열 선언 및 요소 지정.

□ 변수와 키워드

□ 변수는 영문자, □_□, □$□로 시작해야 한다. (대, 소문자 구분)

□ 키워드를 변수로 사용해서는 안된다.

□ 출력부분

□ System.out.println - "Hello World!"라는 문장을 화면에 출력.

□ 컴파일

□ 확장자를 반드시 적어야 한다.

C:\〉javac HelloWorld.java□

□ 실행

□ 인터프리터 방식으로 작동.

□ .class라는 확장자를 붙이지 말아야 한다.

C:\〉java HelloWorld□

□ appletviewer

□ 웹 브라우저 없이도 자바 애플릿을 볼 수 있게 해주는 프로그램

C:\〉appletviewer HelloWorld□

□ 자바 프로그램 개발도구

bin 디렉토리에는 실행 파일과 DLL 파일이 들어 있으며, 실행 파일은 다음과 같다.

□ javac : 자바 컴파일러.  자바 코드를 바이트 코드로 컴파일 해준다.

□ java : 자바 인터프리터.  javac로 컴파일된 바이트 코드를 실행한다.

□ jdb : 자바 프로그램을 디버깅할 수 있는 command 라인 디버거.

□ javah : 자바 클래스로부터 C 헤더 파일과 C stub 파일을 만들어 주는 도구.

이를 통해 자바 코드와 C 코드를 연결할 수 있다.

□ javap : 컴파일된 자바 파일을 disassemble 해주는 도구.  바이트 코드를 프린트해준다.

□ javadoc : 자바 소스 코드로부터 HTML 형태의 API 문서를 만들어 준다.

□ appletviewer : 웹 브라우저 없이 애플릿을 실행할 수 있게 해 주는 도구.

3. 예약어(Keywords)

□ Java Keywords

abstract	do	implements	private	throw
boolean	double	import	protected	throws
break	else	instanceof	public	transient
byte	extends	int	return	true
case	false	interface	short	try
catch	final	long	static	void
char	finally	native	super	volatile
class	float	new	switch	while
continue	for	null	synchronized
default	if	package	this

4. 자료형

자바에서 지원하는 기본적인 자료형에는 정수, 부동소수점, 문자, Boolean 등이 있다.

1) 정수형

정수 자료형	비트크기	처리범위
byte short int long	8(1byte) 16(2byte) 32(4byte) 64(8byte)	-27 ∼ 27 -1 -215 ∼ 215 -1 -231 ∼ 231 -1 -263 ∼ 263 -1

예) byte  bytenum;   // 8비트 정수 선언

short    shortnum;  // 16비트 정수 선언

int            intnum;       // 32비트 정수 선언

long         longnum;     // 64비트 정수 선언

□ 접두사 □0□과 □0x'의 의미

□ □0□  : 수치데이타 앞에 붙여 상수값을 8진수로 변환시킨다.

□ □0x□ : 수치데이타 앞에 붙여 상수값을 16진수로 변환시킨다.

예)    int num;

num = 120;           // 10진수 120

num = 0120;      //    8진수 120

num = 0x120;    // 16진수 120

2) 실수형(float, double)

□ float - 32비트(4byte).

□ double - 64비트(8byte).

예)    float          floatnum;       // float형 부동소수점

double   doublenum;         // double형 부동소수점

floatnum = 12.23f;              // float형 값을 할당

doublenum = 12.23;        // double형 값을 할당

3) 문자형

자바에서 문자형은 유니코드 문자를 처리하기 위한 것으로, 16비트 부호없는 정수로 표현된다.

예) char characterval;   // 문자형 변수 선언

characterval = □a□;   // 문자형 값 할당

4) 문자열형

예) String stringval;                  // 문자열 변수 선언

stringval = "test statement";         // 문자열 변수에 문자열 할당

5) Boolean

□ 크기가 1비트인 자료형으로, true와 false 두 값을 가진다.

□ 메소드의 리턴값이나 관계 연산자의 결과값으로 사용.

예)   boolean bool;   // Boolean 형 변수 선언

bool = true;    // Boolean 형 값 할당

각 자료형의 디폴트 값 여기에서 나온 각 자료형으로 변수를 선언한 후에 값을 할당하지 않은 경우에는 다음과 같은 디폴트(default)값이 들어가게 된다.
byte int float char	: 0 : 0 : 0.0f : '\u0000'(NULL)	short long double boolean	: 0 : 0 : 0.0d : false

[ 예제 ]

class DataTypePractice {

public static void main (String args[]) {

int intnum;

float floatnum;

double doublenum;

char characterval;

boolean bool;

intnum = 120;

floatnum = 12.23f;

doublenum = 12.23;

characterval = □a□;

bool = true;

System.out.println("Data Practice Program");

System.out.println("Integer Data Type");

System.out.println(intnum);

System.out.println("Float Data Type");

System.out.println(floatnum);

System.out.println("Double Data Type);

System.out.println(doublenum);

System.out.println("Character Data Type");

System.out.println(characterval);

System.out.println("Boolean Data Type");

System.out.println(bool);

}

}

<실행결과>

Data Practice Program

Integer Data Type

120

Float Data Type

12.23

Double Data Type

12.23

Character Data Type

a

Boolean Data Type

true

5. 배열

자료형을 여러개 연속적으로 나열해 놓은 것.

□ 배열의 선언

□ 대괄호□[]□내에 정수(첨자)를 지정 하므로써 배열을 선언한다.

□ new 연산자를 통해 메모리를 할당받는다.

□ 배열의 첨자는 배열요소의 개수를 의미하며 배열요소 사용시 첨자는 □0□부터 시작한다.

□ 배열의 길이를 알아보려면 배열명 뒤에 □.length'라는 단어를 붙인다.

예)int intnum[] = new int[10];

요소개수

배열명

자료형

[ 예제 ]

class ArrayPractice {

public static void main (String args[]) {

int intnum[] = new int[5];

int length_of_array;

intnum[0] = 1;

intnum[1] = 2;

intnum[2] = intnum[0] + intnum[1];

intnum[3] = intnum[1] + intnum[2];

intnum[4] = intnum[2] + intnum[3];

length_of_arrray = intnum.length;

System.out.println("Array Practice Program");

System.out.println("Fifth Integer Number");

System.out.println(intnum[4]);

System.out.println("Array Size");

System.out.println(length_of_array);

}

}

<실행결과>

Array Practice Program

Fifth Integer Number

8

Array Size

5

6. 연산자

1) 수치 연산자

□ 수치를 계산하기 위해 사용하는 연산자

□ 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%), 증감연산자(++,--), 단항 연산자 등이 있다.

double num;

num = 12.0 + 13.0;

num = 14.2 - 1.3;

num = 12.3 * 12.4;

num = 122.0 / 2.43;

num = 12.0 % 5.0;

num = 12.3 + 3.2 * 4.2;

□ % : 나머지 연산자 (modulus연산자) - 실수연산(×), 정수연산(○)

예) 13 % 4 □ 1 (나머지)

13 / 4 □ 3 (몫)

□ 증감 연산자

++ : 1증가 연산자 (Increment) - 변수의 값을 1증가 시킴

-- : 1감소 연산자 (Decrement) - 변수의 값을 1감소 시킴

예)    int num, assign;

num = 10;

num++; // num = num + 1;

++num;

assign = num++;

assign = ++num;

□ 단항 연산자 (-)

num이라는 변수에 □-□부호를 붙여 -num이라고 쓰면, (-1)*num이 된다.

2) 관계, 등가 연산자

두 개의 값을 비교하여 그 결과를 리턴하는 연산자. 주로 수가 큰지 작은지, 같은지 다른지를 판단한다.

관계 연산자	의 미
A < B A > B A <= B A >= B A == B A != B	A는 B보다 작다 A는 B보다 크다 A는 B보다 작거나 같다 A는 B보다 크거나 같다 A는 B와 같다 A는 B와 같지 않다

3) 논리, 조건 연산자

주어진 조건이 참인지 거짓인지를 판단하여 결과를 리턴하는 연산자

□ AND 연산자 : 주어진 두 가지 조건이 동시에 만족해야 참

□ OR 연산자 : 두 가지 조건 중 하나만 만족해도 참

□ ? 연산자 : 주어진 조건이 참인지 거짓인지에 따라 적절한 값을 취한다.

A	B	A && B	A || B
T T F F	T F T F	T F F F	T T T F

□형식 : (조건식)? 식1 : 식2 - 조건식이 참이면 식1, 거짓이면 식2를 수행.

예)    int num, assign;

num = 10;

assign = (num > 5) ? 15 : 20;

4) 대입 연산자 ( =, +=, -=, *=, /=, %= )

오른쪽에 있는 값을 왼쪽에 있는 변수에 대입하는 연산자

예) double num;

num = 10.0;

num += 20.0;  // num = num + 20.0;

5) 비트 연산자

□ &       : Bitwise AND(비트곱) - 두 대의 비트가 1인 경우만 진리값이 1이된다.

□ ^        : Bitwise eXclusive OR(비트차) - 두 비트중 하나만 1이면 진리값이 1이된다.

□ |  : Bitwise OR(비트합) - 두 비트중 어느하나라도 1이면 진리값이 1이 된다.

( T : 1, F : 0)

A	B	A & B	A ^ B	A | B
1 1 0 0	1 0 1 0	1 0 0 0	0 1 1 0	1 1 1 0

예)

		A & B	A | B	A ^ B
A B	1010 1110	1010	1110	0100

□ Shift 연산자 (<<, >>)

□ << : 한 비트씩 좌로 이동

□ >> : 한 비트씩 우로 이동

□ 넘어간 비트는 무시, 빈 부분은 0으로 채움

6) Boolean NOT 연산자

Boolean 값을 반전시켜 주는 연산자

□ true에 ! 연산자가 붙으면 false가 되고,  false에 ! 연산자가 붙으면 true가 된다.

예) boolean bool = false;

bool = !bool;

7) 연산자의 우선 순위

우선 순위라는 것은 어떤 연산을 먼저 처리하고, 어떤 연산을 나중에 처리할 것인가에 대한 기준을 의미한다

우선 순위	명칭	연산자	비고
1 2 3 4 5 6 7 8 9 10 11 12 13 14	1차 연산자 증감 연산자 승법 연산자 가법 연산자 Shift 연산자 관계 연산자 등가 연산자 bit곱 연산자 bit차 연산자 bit합 연산자 논리곱 연산자 논리합 연산자 조건 연산자 대입연산자	. [] () ++ -- ! ∼ * / % + - << >> < > <= >= == != & ^ | && || ? : = += -= *= /= %= &= ^= |= >>= <<=	□ □ □ □ □ □ □ □ □ □ □ □ □

예제)

class OperatorPractice {

public static void main (String args[]) {

double dnum;

int num, assign;

System.out.println("Operator Practice");

/* 연산자의 우선순위가 지켜지는지 확인 */

dnum = 12.3 + 34.5 * 12.3;

/* print 와 println의 차이는 커서가 다음 줄로 이동하는가의 차이 */

System.out.print("12.3 + 34.5 * 12.3 = ");

Syetem.out.println(dnum);

/* 증감 연산자의 전후 배치에 따른 차이 확인 */

num = 10;

Syetem.out.println("num = 10");

assign = num++;

System.out.print("After assign = num++ : assign = ");

System.out.println(assign);

assign = ++num;

System.out.print("After assign = ++num : assign = ");

System.out.println(assign);

/* 관계 연산자 확인 */

System.out.print("10 > 5 : ");

System.out.println(10 > 5);

/* 조건연산자 확인 */

assign = (num > 5) ? 10 : 20;

System.out.print("(num > 5) ? 10 : 20 = ");

System.out.println(assign);

}

}

<실행결과>

Operator Practice

12.3 + 34.5 * 12.3 = 436.65

num = 10

After assign = num++ : assign = 10

After assign = ++num : assign = 12

10 > 5 : true

(num > 5) ? 10 : 20 = 10

7. 제어문

프로그램 안에 원하는 기능을 구현하기 위해 만들어놓은 형식으로, 특정 조건에 맞는 기능을 수행시킨다든가, 같은 기능을 반복해서 수행시킨다든가, 특정위치로 이동시킨다든가 하는 식으로 프로그램을 구조화 시키게 된다.

자바의 제어문은 조건 제어문, 반복 제어문, 이동 제어문으로 나뉘어 진다.

□ 조건 제어문 : if, switch ∼ case

□ 반복 제어문 : while, do-while, for

□ 이동 제어문 : break, continue, return

1) if문

< 형식 1 >

if(condition) {

statement; // condition이 참(true)인 경우에만 statement를 실행

}

< 형식 2 >

if(condition) {

statement1; // condition이 참일 때 수행

}

else {

statement2; // condition이 거짓일 때 수행

}

< 형식 3 >

if(condition 1) {

statement1; // condition 1이 참일 때 수행

}

else if(condition 2) {

statement2; // condition 1이 거짓이고, condition 2가 참일 때 수행

}

else {

statement3; // condition 1, 2가 모두 거짓일 때 수행

}

< 예제 >

class IfPractice {

public static void main (String args[]) {

int num;

num = 13 / 2;

if(num == 6) {

System.out.println("13 / 2 is 6");

}

else {

System.out.println("13 / 2 = " + num);

}             // + 기호는 □13 / 2 = □과 함께 num변수값을 출력하라는 의미

}

}

<실행결과>

13 / 2 is 6

2) switch ∼ case문

각 경우에따라 별개의 문장을 수행한다.

< 형식 >

switch(조건식) {

case 상수1 : 문장1; break;

case 상수2 : 문장2; break;

…

case 상수n : 문장n; break;

default : 문장;

}                                   ※ break : 생략가능

<예제>

class SwitchPractice {

public static void main (String args[]) {

int num;

num = 13 / 2;

switch(num) {

case 6 : System.out.println("13 / 2 is 6"); break;

default : System.out.println("13 / 2 = " + num); break;

}

}

}

<실행결과>

13 / 2 is 6

3) while문

조건이 참인 동안 반복시키는 제어문

< 형식 >

while(조건식) {

반복할 문장; // 조건식이 참인 동안 실행, 거짓이 되는 순간 while문을 벗어남

}

< 예제 >

class WhilePractice {

public static void main (String args[]) {

int i;

i = 10;

System.out.println("Countdown start!");

/* 변수가 10에서 1이 될 때까지 계속해서 i 값 출력 */

while(i > 0) {

System.out.println(i);

i--;

}

}

}

4) do ∼ while문

< 형식 >

do {

반복할 문장;

}while(조건식);

□ 조건식이 참일 동안 반복하는 후조건비교 제어문

□ 일단 한 번은 실행된 후에 조건식을 수행

< 예제 >

class DoWhilePractice {

public static void main (String args[]) {

int i;

i = 10;

System.out.println("Countdown start!");

do {

System.out.println(i);

i--;

}while(i > 0);

}

}

5) for문

< 형식 >

for(초기식; 조건식; 증감식) {

반복할 문장;

}

□ 각 식의 역할

□ 초기식 : Loop 제어변수를 초기화 한다. (단 1회만 수행)

□ 조건식 : Loop 제어변수의 범위를 검사하여 반복여부를 결정. (조건식이 참일 동안 반복)

□ 증감식 : Loop 제어변수를 증가 또는 감소 시킨다.

< 예제 >

class ForPractice {

public static void main (String args[]) {

int i;

System.out.println("Countdown start");

for(i = 10; i > 0; i--) {

System.out.println(i);

}

}

}

6) break, continue문

□ break : for문, while문, do∼while문에서 반복 Loop나 switch∼case문을 종료시키는데 사용.

□ continue : for문, while문, do∼while문의 조건부로 제어를 옮기는데 사용.

< 예제 > break문

class BreakPractice {

public static void main (String args[]) {

int i;

i = 10;

System.out.println("Countdown start!");

while(true) {

if(i == 0) break;

System.out.println(i);

i--;

}

}

}

< 예제 > continue문

class ContinuePractice {

public static void main (String args[]) {

int i;

i = 20;

System.out.println("Countdown start!");

while(true) {

i--;

if(i > 10) continue; // i변수가 10이상이면 처음 while문으로 되돌려 보낸다

if(i == 0) break; // i변수가 0이 되면 while문을 끝낸다

System.out.println(i);

}

}

}

7) return문

메소드를 종료하면서 메소드의 리턴값을 보내고 싶을 때 사용한다. 리턴값이 int형인 메소드라면, 반드시 return뒤에 int형 변수값을 적어야 하고, 리턴값이 void인 메소드라면 return만 쓰면 된다.

< 예제 >

class ReturnPractice {

public static void main (String args[]) {

int i;

i = 10;

System.out.println("Countdown start!");

while(true) {

if(i == 0) return;

System.out.println(i);

i--;

}

}

}

<실행결과>

Countdown Start!

10

9

8

7

6

5

4

3

2

1

8. 표준 입출력

□ 자바에서의 표준 출력 : System.out

표준 입력 : System.in

□System.in.read() - 키보드로부터 하나의 문자를 받아서 리턴하게 된다.

만약 더 이상 문자가 들어오지 않는다면 -1을 리턴하게 된다.

< 예제 >

class InOutPractice{

public static void main(String args[]) throws java.io.IOException{

char ans;

System.out.println("Do you want quit? (y/n)");

while(true){

ans = (char)System.in.read();

if(ans=='y'){

System.out.println("You answered yes.");

break;

}

else if(ans=='n'){

System.out.println("You answered no.");

break;

}

else {

System.out.println("You must use y or n.");

}

}

}

}

※ ans = (char)System.in.read(); : 메소드가 리턴하는 정수형값을 문자형으로 바꾸어준다.

※ 'throws java.io.IOException' : 예외처리

9. 명령행 인자(Command line argument)

□args[]

사용자가 프로그램을 실행시킬 때 입력한 매개변수를 저장하기 위한 문자열 배열 변수.

예>

C:\>java app arg1 arg2 arg3 arg4□

args[0] : arg1

args[1] : arg2

args[2] : arg3

args[3] : arg4

< 예제 > 에러 발생 다시함 해보장!!

class CommandLine{

public static void main(String args[]){

System.out.println("Hi! " + args[0]);

}

}

컴파일 : javac CommandLine.java

실  행 : java CommandLine HongGilDong

< 문제 > 매개변수의 수와 관계 없이 처리할 수 있는 프로그램 작성

class CommandLine{

public static void main(String args[]){

int i;

for(i=0;                ; i++){

System.out.println("Hi! " +         );

}

}

}

컴파일 : javac CommandLine.java

실  행 : java CommandLine Hello World Java

10. 예외 처리(Exception Handling)

□ 프로그램에서 발생할 수 있는 여러 가지 에러들에 대해 적절한 대비를 취하는 것을

말한다.

□ CommandLine 프로그램은 아무런 매개변수를 주지 않으면 다음과 같은 에러가 발생한다.

'ArrayIndexOutOfBoundsException' 이라는 이름을 가지고 있다.

매개변수가 들어오지도 않았는데 args[0]의 값을 읽으려 했기 때문에 에러가 발생하였다.

□ 예외처리는 try, catch 문을 통해 구현한다.

□ 에러가 발생할 수 있는 부분을 try문으로 감싸놓고,

에러가 발생할 떄 처리할 내용은 catch문으로 감싸 놓는다.

□ catch의 매개변수로는 Exception 클래스 변수를 넣는데,

여기에 발생한 에러의 정보가 들어간다.

< 예제 >

class ExceptionCommandLine{

public static void main(String args[]){

try{

System.out.println("Hi " + args[0]);

}

catch(Exception e){

System.out.println("Error : " + e);

}

}

}

컴파일 : javac ExceptionCommandLine.java

실  행 : java ExceptionCommandLine

Ⅳ. 객체지향 프로그래밍

1. 객체지향 프로그래밍

1) 소프트웨어에 대한 객체지향적 시각

□객체 + 객체 = 프로그램

□데이터 + 함수 = 객체

2) 정의

□특정 데이터와 관련된 함수들을 가지는 프로그램 모듈

□실세계 영역에 있는 정보, 물건, 사물, 개체, 개념 등을 표현함

□객체 = 속성(Attributes) + 행위(Behaviors)

= 변수(Variable) + 메소드(Methods)

□자동차

3) 객체지향 프로그래밍에서 모든 객체는 추상화된다.

□추상화(Abstraction)

객체가 자신의 정보를 안에 감추고 있으면서 외부에 구체적인 것이 아닌 추상적인

내용만 알려주는 것을 의미한다.

□추상화는 정보은폐(Information Hiding)이라고 표현하기도 한다.

□연산자 추상화(Operation Abstraction), 데이터 추상화(Data Abstraction)

4) 객체지향 프로그래밍에서는 클래스(class)라는 것을 이용하여 새로운 데이터형을

정의함으로써 데이터 추상화 기법을 구현한다.

5) 객체지향 프로그래밍에서 모든 객체들은 메시지를 통해서만 정보를 교환할 수 있다.

6) 메시지(Message)

□객체 접근 방법

한 객체는 다른 객체에게 메시지를 보내어 교류한다.

□메시지 교환(Message Passing)

메시지 교환(Message Passing)은 객체들 사이에 정보를 교환할 수 있는 유일한 수단이다.

한 객체가 다른 객체의 함수를 부르는 과정을 메시지 교환(Message Passing)이라고 한다.

7) 메시지 형태

□수신객체, 함수명, 함수의 Arguments

□수신객체는 이 메시지를 받을 객체를 나타낸다.

□<receiver>.<operation_name><arguments>

□myPoint.move(10, 5);

myPoint.setcolor(blue);

8) 클래스

□개념

□클래스는 객체의 타입(Object Type)이다.

□정의

□클래스는 유사한 객체들이 갖는 공통된 데이터와 함수들을 정의한 객체의 기본 규격

(Specification)이다.

□유사한 객체들의 타입을 정의한다.

9) 인스턴스(Instance)

□어떤 클래스에서 생성된 객체 혹은 한 클래스에 속하는 각각의 객체

□한 클래스에 속한 모든 객체들은 같은 종류의 데이터와 함수들을 가진다.

□생성된 각 객체는 클래스에서 정의된 변수들에 대한 메모리를 할당 받는다.

10) 상속성(Inheritance)

□개념

□서브 클래스가 자신의 수퍼 클래스에서 정의된 모든 변수와 메소드를 물려 받는 성질

□한 클래스가 여러 종류의 서브 클래스로 세분화된다.

그래픽 클래스는 선, 다각형, 원 등으로 세분화

학생 클래스는 학부학생과 대학원생으로 세분화

□기존의 클래스 위에 필요한 데이터와 함수들을 추가하여 새로운 클래스를 만드는

경제적인 방법

□용어(Terminology)

□수퍼 클래스(Super class, Base class)

□서브 클래스(Sub class, Derived class, Extended class)

□대학 인사관리 시스템

Person

Employee

Student       Faculty       Temporary       Staff

11) 추상 클래스(Abstract Class)

□서브 클래스들의 공통된 특성을 추출하여 묘사하기 위한 클래스

□Printer Software

□모든 종류의 프린터가 공통으로 가지는 특성을 추상클래스에 정의

□변수 : 프린터의 상태, 속도

□함수 : print();

□프린트마다 인쇄하는 방법이 다르므로 이 추상 클래스 안에서는 Print라는 함수를 완전히

구현할 수 없다.

□실제 구현은 여러 서브클래스에서 각 프린터 종류에 맞게 하면 된다.

□추상 클래스 'Printer'

(추상 클래스)

Printer

도트 매트릭스            레이저            잉크젯

프린터               프린터            프린터

2. 자바의 클래스와 객체

1) 클래스의 정의

□형식

<Modifiers> class Classname <extends Superclassname >

<implements Interface (, Interface)> {

클래스 정의 부분 (변수와 메소드 정의)

}

※ <> 안에 있는 것은 옵션이기 때문에 필요한 경우에만 사용하면 된다.

□Modifiers

□정의하려는 클래스의 성질을 지정해 주는 부분

□public, final, abstract 중 하나의 값을 사용하게 된다.

□class 앞에 아무것도 아무 것도 쓰지 않으면 디폴트로 public

□final로 선언된 클래스는 서브 클래스를 가질 수 없다.

(상속받는 클래스는 정의할 수 없다.)

□abstract로 선언된 클래스는 abstract로 선언된 메소드를 가질 수 있다.

□abstract 메소드는 선언만 있고 실제 내용이 없는 추상적인 메소드이다.

□extends Superclassname

□수퍼 클래스에서 상속을 받고자 할 때 사용

□이때 수퍼 클래스는 final이 아닌 public이나 abstract으로 선언되어 있어야 한다.

□extends 구문이 생략되면 'Object'라는 이름의 클래스를 상속받게 된다.

□implements Interface(,Interface)

□클래스를 정의할 때 클래스 내에서 사용할 인터페이스들을 선언하는 부분

□implements 뒤에 사용하고 싶은 인터페이스들을 ','로 구분하여 나열한다.

□인터페이스

□실제 정의가 없이 선언만 되어 있는 메소드들의 집합

□자바에서 다중 상속이 되지 않기 때문에 인터페이스가 필요하다.

□자바는 오직 하나의 수퍼 클래스만을 가질 수 있다.

□만약 여러 개의 클래스로부터 상속받고자 할 경우에는 문제가 생긴다.

□클래스 정의 부분

□클래스의 내부에는 변수와 메소드만 정의할 수 있다.

□클래스 변수의 정의

□public - 언제 어디서나 접근할 수 있는 속성을 갖게 된다.

□private - 클래스 내부에서만 접근할 수 있고 외부에서는 접근할 수 없다.

□protected - private처럼 클래스 내부에서 접근할 수 있고, 이 클래스에서 상속된 서브

클래스에서 상속할 수 있다.

(단, protected는 외부에서 접근하는 것이 금지되어 있다.)

[ 예제 ] error 발생

class SuperJavaTest{

private int privatevalue;

protected int protectedvalue;

void test(){

privatevalue = 1;

protectedvalue = 2;

class SubJavaTest extends SuperJavaTest{

void test(){

privatevalue = 1;     // Error

protectedvalue = 2;   // Okay

}

}

□메소드의 정의

□클래스에서 사용하던 접근 권한 키워드를 그대로 사용한다.

□메소드는 함수이기 때문에 함수가 가지고 있는 특성을 그대로 갖는다.

[ 형태 ]

class JavaTest{

public void testprint(int x, int y){

System.out.println(x);

System.out.println(y);

}

}

□클래스 변수와 메소드의 성질 선언

□static - 변수가 클래스에 오직 하나만 존재할 수 있도록 만들어준다.

static으로 지정된 변수는 객체가 아무리 많이 선언되더라도 오직 하나만 존재한다.

□final - final로 선언된 변수는 선언시 반드시 초기값을 지정해 주어야 한다.

□transient

□volatile

□클래스 메소드의 중복 정의(Overloading)

class JavaTest{

int value1;

double value2;

void GetValue(int a){

value1 = a;

}

void GetValue(double b){

value2 = b;

}

void GetValue(int a, double b){

value1 = a;

value2 = b;

}

}

2) 클래스의 객체 선언

□객체선언

class JavaTest1{

public int value;

private int testvalue;

public void test(int x){

testvalue = x;

System.out.println("JavaTest1 Class");

}

}

class JavaTest2{

public void test(){

JavaTest1 a;                // JavaTest1 클래스 객체 a 선언

a = new JavaTest1();       // 메모리 할당, 디폴트 생성자를 호출

a.value = 1;                 // Okay

a.testvalue = 2;             // Error

a.test(10);                   // Okay

}

}

□new 연산자를 이용한 객체의 메모리 할당

□객체에 대한 메모리를 할당한 후 해제는 하지 않아도 된다.

□쓰레기 수집(Grabage Collection) 기능이 메모리를 더 이상 쓰지 않는 경우에는 자동으로

해제시켜 준다.

□객체의 메모리 할당은 new 연산자를 사용한다.

□new 연산자는 메모리를 할당할 때 생성자(Constructor)를 호출한다.

□만약 생성자를 만들어 놓지 않았다면, 디폴트 생성자가 호출된다.

3) 클래스의 생성자

□생성자는 리턴값을 지정하지 않아도 되고, 클래스와 이름이 동일해야 한다.

□생성자는 객체를 선언하고 메모리를 할당할 때 자동으로 호출된다.

[ 예제 ]

class JavaTest{

int value1;

double value2;

JavaTest(){                 // 매개변수 없는 생성자

value1 = 0;

value2 = 0.0;

}

JavaTest(int x){            // int형 변수를 매개변수로 받는 생성자

value1 = x;

value2 = 0.0;

}

JavaTest(double y){        // double형 변수를 매개변수로 받는 생성자

value1 = 0;

value2 = y;

}

JavaTest(int x, double y){  // int형 변수와 double형 변수를 매개변수로 받는 생성자

value1 = x;

value2 = y;

}

static void test(){

JavaTest a = new JavaTest();       // 생성자 호출

JavaTest b = new JavaTest(4);

JavaTest c = new JavaTest(4.0);

JavaTest d = new JavaTest(4, 4.0);

}

}

4) 클래스의 상속

□this와 super변수

□this - static으로 선언되지 않은 메소드에서 현재 자신의 객체를 가리킨다.

□super - static으로 선언되지 않은 메소드에서 사용한다.

현재 클래스가 상속받은 수퍼 클래스의 객체를 가리키는 것이 된다.

※메소드가 static으로 선언되면 이 메소드는 오직 하나만 존재하기 때문에 객체를 가리키는

것이 아니라 클래스를 가리키는 것이 된다.

예)

class Classname{

void test(OtherClassname a){

....

a.othertest(this); // 매개변수로 들어온 객체의 메소드에 자기를 매개변수로 넘겨준다.

....

}

}

class JavaTest{

int value1;

double value2;

JavaTest(){

}

JavaTest(int x){

value1 = x;

}

JavaTest(double y){

value2 = y;

}

JavaTest(int x, double y){

this(x);    // JavaTest(int x) 호출

this(y);    // JavaTest(double y) 호출

}

}

※this가 객체 자신을 가리키기 때문에 this를 메소드로 사용하게 되면 생성자가 된다.

class JavaTest{

int value1;

JavaTest(int value1){

this.value1 = value1;  // 앞에 this를 붙임으로써 클래스 변수라는 것을 구분한다.

}

}

class SuperJavaTest{

int value;

SuperJavaTest(int x){

value = x;

}

}

class SubJavaTest extends SuperJavaTest{

SubJavaTest(int x) {

super(x);   // 수퍼 클래스의 생성자인 SuperJavaTest(int x)를 호출한다.

}

}

□클래스 메소드의 재정의(Overriding)

□매개변수의 개수와 타입, 접근 제한 키워드가 같아야 한다.

class Shape{

String name;

public void print(String n){

name = n;

System.out.println(name + " Shape Print");

}

}

class Rectangle extends Shape{

public void print(String n){  // 수퍼 클래스의 print 메소드를 재정의

// Rectangle 클래스의 객체에서 print 메소드를 호출하면 아래의 메소드가 호출된다.

name = n;

System.out.println(name + " Rectangle Print");

// 만약 여기에서 수퍼 클래스의 print를 호출하고 싶다면

// super 변수를 이용하여 super.print(n) 루틴을 사용하면 된다.

}

}

※상속시 주의할 점

클래스를 상속하면서 새로운 변수를 만든 경우, 수퍼 클래스에 있는 변수와 이름이 같다면?

수퍼 클래스의 변수가 무시되고 서브 클래스의 변수가 사용된다.

5) 클래스의 형변환

[ 예제 ]

class Super{

String name = "Super Class";

}

class Sub extends Super{

String name = "Sub Class";

}

class TypeCastDemo{

public static void main(String args[]){

Sub a = new Sub();

System.out.println(a.name);

Super b;

b = (Super)a;   // Sub형 변수를 Super형 변수로 형변환

System.out.println(b.name);

}

}

3. 패키지(Package)

1) 패키지란 무엇인가?

서로 관련있는 클래스와 인터페이스를 모아놓은 것

2) 패키지 선언

□package Packagename;

[ JDK에서 제공하는 패키지 ]

패키지 이름	설명
java.lang java.io java.util java.net java.awt java.applet	기본 자바 클래스를 포함한 것으로 모든 자바 프로그램에 디폴트로 import된다. 입출력과 관련된 클래스 포함 유틸리티 클래스 포함 네트웍 연결에 사용되는 클래스 포함 플랫폼에 독립된 그래픽 유저 인터페이스 프로그램을 만들기 위해 필요한 클래스 포함 자바 호환 브라우저에서 실행되는 자바 애플릿을 만들기 위해 필요한 클래스 포함

※awt : Abstract Window Toolkit

3) 패키지 활용

예) □ import java.applet.Applet;

□ import java.awt.*;

□컴파일시에 java.applet.Applet에 있는 모든 클래스와 인터페이스를 자동으로 프로그램에

불러오게 된다.

□import는 C/C++에서 사용하는 #include문과 같다.

4. 인터페이스(Interface)

1) 인터페이스란 무엇인가?

□실제 정의가 없이 선언만 되어 있는 메소드들의 집합

□자바에서는 다중 상속이 되지 않기 때문에 여러 개의 클래스로부터 상속을 받아야 하는

경우에 사용하는 방법이 바로 인터페이스이다.

※ 클래스와 인터페이스의 차이점

□클래스 - 메소드의 정의를 반드시 적어야 한다.

□인터페이스 - 메소드는 선언만 하면 된다.

2) 인터페이스 정의

□형식

<Modifiers> interface Interfacename <extends Interface> {

인터페이스 정의 부분

}

□Modifiers

□인터페이스에 대한 접근 여부를 결정하는 키워드 (public, abstract)

□public키워드를 쓰지 않으면 디폴트로 abstract로 인식된다.

□extends Interface

□인터페이스에서 선언된 변수와 메소드들을 포함시킬 수 있다.

□인터페이스 정의 부분

□변수와 클래스를 선언한다.

3) 인터페이스 예

□클래스가 인터페이스를 받아들인 후에는 반드시 인터페이스에 선언되어 있는 메소드들을

정의해야 한다.

interface Fruit{

void printname();  // 선언만 한다.

}

class Apple implements Fruit{

void printname() {                 // 인터페이스 메소드들을 정의한다.

System.out.println("Apple");

}

}

class Orange implements Fruit{

void printname() {                 // 인터페이스 메소드들을 정의한다.

System.out.println("Orange");

}

}

5. 스레드(Thread)

1) 스레드란 무엇인가?

□프로그램 내에서 실행되는 일종의 프로세스(process)

□Process - 실행중인 프로그램

□자바는 멀티 스레드(Multi-thread) 기능을 제공하고 있다.

□멀티 스레드 - 하나의 프로그램 안에서 여러 작업을 동시에 처리할 수 있는 기능

□보통의 프로그램은 한 번에 하나의 작업밖에 수행할 수 없기 때문에 사용자는 수행시킨

작업이 끝날 때까지 기다려야 한다.

□한 스레드가 수행시킨 작업을 백그라운드로 계속해서 실행시키는 동안 다른 스레드가

사용자의 요구를 받을 수 있기 때문에 멀티 스레드에서 사용자는 기다릴 필요가 없다.

※ Sun - '스레드는 프로그램 내에서 처음부터 끝까지 순차적으로 수행되는 하나의 제어

흐름이다(A thread is a sequential flow of control within a program).'

2) 스레드를 활용한 프로그램 - Thread 클래스 상속을 통해

class ThreadDemo1{

public static void main(String args[]){

SubThread a = new SubThread("thread1");

SubThread b = new SubThread("thread2");

SubThread c = new SubThread("thread3");

a.start();   // start 메소드는 Thread 클래스에 정의된 것을 상속받음

b.start();

c.start();

}

}

class SubThread extends Thread{

public SubThread(String str){

super(str);   // 수퍼 클래스인 Thread의 생성자 호출

}

public void run(){

for(int i=0; i<5; i++){

System.out.println(getName() + " No." + i);  // 스레드의 이름과 출력 횟수 출력

try{  // 예외처리

sleep((int)(Math.random() * 1000));  // 잠시 휴식

}catch(InterruptedException e){}

}

System.out.println(getName() + " End.");

}

}

3) 스레드를 활용한 프로그램 - Runnable 인터페이스를 통해

□Runnable 인터페이스는 Thread 클래스가 아닌 다른 클래스로부터 상속을 받고 싶을 때 사용

class ThreadDemo2 implements Runnable{

Thread threaddemo;

public static void main(String args[]){

ThreadDemo2 a = new ThreadDemo2("thread1");

ThreadDemo2 b = new ThreadDemo2("thread2");

ThreadDemo2 c = new ThreadDemo2("thread3");

}

public ThreadDemo2(String name){

// 스레드를 만들기 위해 Thread형 변수에 메모리 할당

// 이번 Thread 생성자에는 스레드를 만드는 클래스의 변수와 스레드 이름을

매개변수로 넘겨준다.

threaddemo = new Thread(this, name);

threaddemo.start();  // 스레드 동작 시작 - run 메소드 실행

}

public void run(){   // start 메소드로 시작하게 되는 메소드

for(int i=0; i<5; i++){

System.out.println(threaddemo.getName() + " No." + i);

try{

Thread.sleep((int)(Math.random() * 1000));

}catch(InterruptedException e){}

}

System.out.println(threaddemo.getName() + " End.");

}

}

Ⅴ. 애플릿(Applet)

자바 프로그래밍

1. 자바 애플릿 만들기

[ 예제 ]

import java.applet.Applet;   // import Applet class

import java.awt.Graphics;   // import Graphics class

public class Welcome extends Applet{

public void paint(Graphics g){

g.drawString("Welcome to Java Programming!", 25, 25);

}

}

□ 자바 애플릿은 자바 어플리케이션처럼 자체적으로 실행되는 프로그램이 아니라,

넷스케이프 같은 웹 브라우저에 삽입되어 실행되는 보조 프로그램이다.

□ 이 경우, main은 브라우저에 포함되어 있고, 자바 애플릿은 오직 브라우저에서 호출할

때만 실행되도록 되어 있다.

□ 자바 애플릿은 이벤트가 발생할 때만 실행된다.

□ 자바 애플릿 컴파일

c:\>javac Welcome.java

□ HTML 문서 작성

<HTML>

<APPLET CODE = Welcome.class WIDTH=200 HEIGHT=50>

</APPLET>

</HTML>

□ 출력부분

메소드 원형	public abstract void drawString(String str, int x, int y)
기능	자바 애플릿의 (x,y)좌표에 str 문자열을 출력하는 메소드
매개변수	str : 출력할 문자열 x : x좌표 y : y좌표
클래스	Graphics

[ 예제 ] 1 ∼ 100 사이에서 짝수들의 합을 구하는 프로그램

import java.awt.Graphics;

import java.applet.Applet;

public class Sum extends Applet {

public void paint(Graphics g)

{

int sum = 0;

for( int number = 2; number <= 100; number += 2 )

sum += number;

g.drawString( "Sum is " + sum, 25, 25 );

}

}

[ 예제 ]

import java.awt.Graphics;

import java.applet.Applet;

public class ContinueTest extends Applet{

public void paint(Graphics g)

{

int xPos = 25;

for(int count = 1; count <= 10; count++){

if(count==5)

continue;

g.drawString(Integer.toString(count), xPos, 25);

xPos += 10;

}

g.drawString("Used continue to skip printing 5", 25, 40);

}

}

[ 예제 ]

import java.awt.Graphics;

import java.applet.Applet;

public class ContinueLabelTest extends Applet{

public void paint(Graphics g)

{

int xPos, yPos = 0;

nextRow:

for(int row = 1; row <= 5; row++){

xPos = 25;

yPos += 15;

for( int column = 1; column <= 10; column++ ){

if(column > row)

continue nextRow;

g.drawString( "#", xPos, yPos);

xPos += 7;

}

}

}

}

Ⅵ. Methods

메소드	설명	예
abs(x) ceil(x) cos(x) exp(x) floor(x) log(x) max(x, y) min(x, y) pow(x, y) sin(x) sqrt(x) tan(x)	absolute value of x rounds x to the smallest integer not less than x trigonometric cosine of x (x in radians) exponential method ex rounds x to the largest integer not greater than x natural logarithm of x(base e) larger value of x and y smaller value of x and y x raised to power y(xy) trigonometric sine of x (x in radians) square root of x trigonometric tangent of x (x in radians)	if x>0 then abs(x) is x if x=0 then abs(x) is 0 if x<0 then abs(x) is -x ceil (9.2) is 10 ceil (-9.8) is -9 cos (0.0) is 1 exp (1.0) is 2.71828 exp (2.0) is 7.38906 floor (9.2) is 9 floor (-9.8) is -10 log (2.718282) is 1 log (7.389056) is 2 max(2.3, 12.7) is 12.7 max(-2.3, -12.7) is -2.3 min(2.3 12.7) is 2.3 min(-2.3, -12.7) is -12.7 pow (2, 7) is 128 pow (9, .5) is 3 sin (0.0) is 0 sqrt (900.0) is 30 sqrt (9.0) is 3 tan (0.0) is 0

[ 예제 ] 제곱을 구하는 프로그램

import java.awt.Graphics;

import java.applet.Applet;

public class SquareInt extends Applet{

public void paint(Graphics g)  // 1∼10의 제곱값을 출력

{

int xPos = 25;

for(int x = 1; x <= 10; x++){

g.drawString(String.valueOf(square(x)), xPos, 25);

xPos += 20;

}

}

public int square(int y)   // 제곱 함수 정의

{

return y * y;

}

}

[ 예제 ] 메소드 오버로드 프로그램

import java.awt.Graphics;

import java.applet.Applet;

public class MethodOverload extends Applet{

public void paint(Graphics g)

{

g.drawString("The square of integer 7 is " + square(7), 25, 25);

g.drawString("The square of double 7.5 is " + square(7.5), 25, 40);

}

int square(int x)

{

return x * x;

}

double square(double y)

{

return y * y;

}

}

[ 예제 ] Factorial 프로그램

import java.awt.Graphics;

import java.applet.Applet;

public class FactorialTest extends Applet{

public void paint(Graphics g)

{

int yPos = 25;

for(long i = 0; i <= 10; i++) {

g.drawString( i + "! = " + factorial(i), 25, yPos);

yPos += 15;

}

}

public long factorial(long number)  // factorial 메소드의 재귀적 호출 정의

{

if(number <= 1)

return 1;

else

return number * factorial( number -1 );

}

}

[ 예제 ] 수학함수 사용 프로그램

public class MathTest {

public static void main(String args[])

{

System.out.println("Math.abs(23.7) = " + Math.abs(23.7));

System.out.println("Math.abs(0.0) = " + Math.abs(0.0));

System.out.println("Math.abs(-23.7) = " + Math.abs(-23.7));

System.out.println("Math.ceil(9.2) = " + Math.ceil(9.2));

System.out.println("Math.ceil(-9.8) = " + Math.ceil(-9.8));

System.out.println("Math.cos(0.0) = " + Math.cos(0.0));

System.out.println("Math.exp(1.0) = " + Math.exp(1.0));

System.out.println("Math.exp(2.0) = " + Math.exp(2.0));

System.out.println("Math.floor(9.2) = " + Math.floor(9.2));

System.out.println("Math.floor(-9.8) = " + Math.floor(-9.8));

System.out.println("Math.log(2.718282) = " + Math.log(2.718282));

System.out.println("Math.log(7.389056) = " + Math.log(7.389056));

System.out.println("Math.max(2.3, 12.7) = " + Math.max(2.3, 12.7));

System.out.println("Math.max(-2.3, -12.7) = " + Math.max(-2.3, -12.7));

System.out.println("Math.min(2.3, 12.7) = " + Math.min(2.3, 12.7));

System.out.println("Math.min(-2.3, -12.7) = " + Math.min(-2.3, -12.7));

System.out.println("Math.pow(2, 7) = " + Math.pow(2, 7));

System.out.println("Math.pow(9, .5) = " + Math.pow(9, .5));

System.out.println("Math.sin(0.0) = " + Math.sin(0.0));

System.out.println("Math.sqrt(25.0) = " + Math.sqrt(25.0));

System.out.println("Math.tan(0.0) = " + Math.tan(0.0));

}

}

<실행결과>

Math.abs(23.7) = 23.7

Math.abs(0.0) = 0.0

Math.abs(-23.7) = 23.7

Math.ceil(9.2) = 10

Math.ceil(-9.8) = -9

Math.cos(0.0) = 1

Math.exp(1.0) = 2.71828

Math.exp(2.0) = 7.38906

Math.floor(9.2) = 9

Math.floor(-9.8) = -10

Math.log(2.718282) = 1

Math.log(7.389056) = 2

Math.max(2.3, 12.7) = 12.7

Math.max(-2.3, -12.7) = -2.3

Math.min(2.3, 12.7) = 2.3

Math.min(-2.3, -12.7) = -12.7

Math.pow(2, 7) = 128

Math.pow(9, .5) = 3

Math.sin(0.0) = 0

Math.sqrt(25.0) = 5

Math.tan(0.0) = 0

Ⅶ. 이벤트

1. 기본 이벤트

기본 이벤트란? 자바 애플릿이 브라우저에 읽혀지고 시작될 때 발생하는 이벤트와

브라우저를 떠나고 종료될 때 발생하는 이벤트를 의미한다.

□자바 애플릿의 초기화를 위해 여러 가지 변수를 설정해야 하는 경우에는 반드시 메소드를

정의해야만 한다.

□이 메소드들은 이미 Applet 클래스에 정의되어 있는 것들로, 새로 만든 자바 애플릿에서

재정의(Overriding)함으로써 사용할 수 있다.

메소드 원형	public void init()
기능	애플릿이 브라우저에 읽혀질 때 애플릿을 초기화시키는 메소드. 이 메소드는 시스템에 의해 오직 한 번만 호출된다.
매개변수	없음
클래스	Applet

메소드 원형	public void start()
기능	애플릿이 동작이 시작할 때 호출되는 메소드. 이 메소드는 애플릿이 포함된 페이지를 처음 읽을 때나 다시 방문할 때 호출된다.
매개변수	없음
클래스	Applet

메소드 원형	public void stop()
기능	애플릿의 동작이 정지될 때 호출되는 메소드. 이 메소드는 애플릿이 포함된 페이지를 떠나거나 브라우저를 종료시킬 떄 호출된다.
매개변수	없음
클래스	Applet

메소드 원형	public void destroy()
기능	애플릿의 동작이 정지한 후 최종적으로 정리하는 메소드. stop 메소드 다음에 호출되는 메소드
매개변수	없음
클래스	Applet

[ 예제 ] 기본 이벤트가 언제 발생하는지를 확인하기 위한 프로그램

import java.applet.Applet;

import java.awt.Graphics;

public class ShowBasicEvent extends Applet {

String message;

public void init() {                    // 애플릿 초기화 메소드

message = "init event start.";

}

public void start() {                   // 애플릿 시작 메소드

message = "start event start.";

}

public void stop() {                   // 애플릿 정지 메소드

message = "stop event start.";

}

public void destroy() {                // 애플릿 종료 메소드

message = "destroy event start.";

}

public void paint(Graphics g) {

g.drawString(message, 50, 25);

}

}

2. 화면 출력 이벤트

애플릿에 이미지를 출력하려 할 때 발생하는 이벤트

□애플릿에서 출력해야 할 메시지나 이미지가 있다면 반드시 paint 메소드를 통해서 해야 한다.

□방금 처리한 작업을 화면에 빠르게 출력시키려면 repaint 메소드를 호출하여 다시 한 번

paint 메소드를 호출해야 한다.

□update 메소드는, 시스템에 의해 자동으로 호출되는 메소드로, 주로 화면의 깜박임을

막기 위해 사용한다.

메소드 원형	public void paint(Graphics g)
기능	애플릿 영역에 이미지 출력
매개변수	g : Graphics 클래스형 변수 이 클래스 안에 이미지 출력에 관한 메소드가 정의되어 있다.
클래스	Component (Applet의 수퍼 클래스)

메소드 원형	public void update(Graphics g)
기능	애플릿 영역의 갱신을 위해 사용되는 메소드
매개변수	g : Graphics 클래스형 변수 이 클래스 안에 이미지 출력에 관한 메소드가 정의되어 있다.
클래스	Component (Applet의 수퍼 클래스)

메소드 원형	public void repaint()
기능	애플릿 영역에 재출력. paint 메소드 호출
매개변수	없음
클래스	Component (Applet의 수퍼 클래스)

3. 마우스 이벤트

□Component 클래스에 정의되어 있다.

□이 메소드들을 사용할 수 있는 것은 Applet 클래스를 Component로 부터 상속받았기 때문이다.

□활성화 - 윈도우에 현재 마우스나 키보드로 입력할 수 있는 상태

□비활성화 - 윈도우에서 현재 실행되고는 있으나 이를 사용하지 않는 상태

메소드 원형	public boolean mouseDown(Event evt, int x, int y)
기능	마우스 버튼이 눌려졌을 때 호출되는 메소드
매개변수	evt : Event 클래스형 변수 x : 마우스 버튼이 눌려진 곳의 x좌표 y : 마우스 버튼이 눌려진 곳의 y좌표
클래스	Component (Applet의 수퍼 클래스)

메소드 원형	public boolean mouseUp(Event evt, int x, int y)
기능	마우스 버튼이 놓여졌을 때 호출되는 메소드
매개변수	evt : Event 클래스형 변수 x : 마우스 버튼이 놓여진 곳의 x좌표 y : 마우스 버튼이 놓여진 곳의 y좌표
클래스	Component (Applet의 수퍼 클래스)

메소드 원형	public boolean mouseMove(Event evt, int x, int y)
기능	마우스를 움직일 때 호출되는 이벤트
매개변수	evt : Event 클래스형 변수 x : 마우스의 현재 위치 (x좌표) y : 마우스의 현재 위치 (y좌표)
클래스	Component (Applet의 수퍼 클래스)

메소드 원형	public boolean mouseEnter(Event evt, int x, int y)
기능	마우스가 다른 곳에서 애플릿 영역으로 들어오는 경우에 호출되는 메소드
매개변수	evt : Event 클래스형 변수 x : 마우스가 들어온 곳의 x좌표 y : 마우스가 들어온 곳의 y좌표
클래스	Component (Applet의 수퍼 클래스)

메소드 원형	public boolean mouseExit(Event evt, int x, int y)
기능	마우스가 애플릿 영역에서 밖으로 나갈 때 호출되는 메소드
매개변수	evt : Event 클래스형 변수 x : 마우스가 나간 곳의 x좌표 y : 마우스가 나간 곳의 y좌표
클래스	Component (Applet의 수퍼 클래스)

메소드 원형	public boolean mouseDrag(Event evt, int x, int y)
기능	마우스의 버튼을 누른채 마우스를 움직일 때 호출되는 메소드
매개변수	evt : Event 클래스형 변수 x : 마우스가 드래그 되는 곳의 x좌표 y : 마우스가 드래그 되는 곳의 y좌표
클래스	Component (Applet의 수퍼 클래스)

메소드 원형	public boolean gotFocus(Event evt, Object what)
기능	브라우저가 활성화되었을 때 호출되는 메소드
매개변수	evt : Event 클래스형 변수 what : Object 클래스형 변수. 무엇이 활성화 되었는지
클래스	Component (Applet의 수퍼 클래스)

메소드 원형	public boolean lostFocus(Event evt, Object what)
기능	브라우저가 비활성화되었을 때 호출되는 메소드
매개변수	evt : Event 클래스형 변수 what : Object 클래스형 변수. 무엇이 비활성화 되었는지
클래스	Component (Applet의 수퍼 클래스)

□ 리스트(List)

□자바 애플릿에서 리스트는 java.awt.List 패키지에 정의되어 있는 List 클래스를 사용하여

만든다.

□List 클래스형 변수를 하나 선언하고 메모리를 할당한 후, 애플릿에 포함시켜 주기만 하면 된다.

□변수에 메모리를 할당 - 생성자를 사용

□리스트를 애플릿에 추가 - add 메소드를 사용

□리스트 상자에 목록을 추가 - List 클래스에 정의되어 있는 addItem 이라는 메소드를 사용

메소드 원형	public Component add(Component comp)
기능	컴포넌트(여기서는 리스트 상자)를 추가하는 메소드
매개변수	comp : 추가할 컴포넌트
클래스	Container (Applet의 수퍼 클래스)

메소드 원형	List(int n, boolean select)
기능	리스트 상자를 만드는 List 클래스의 생성자
매개변수	n : 화면에 나타나는 목록의 수 select : 사용자가 목록을 선택할 수 있는지의 여부 true : 선택할 수 있다. false : 선택할 수 없다.
클래스	List

메소드 원형	public synchronized void addItem(String item)
기능	리스트가 상자에 목록을 추가하는 메소드
매개변수	item : 추가할 목록
클래스	List

[ 예제 ] 마우스 이벤트 처리 프로그램

import java.applet.Applet;

import java.awt.*;

public class ShowMouseEvent extends Applet {

List list;

public void init() {

list = new List(10, false);

add(list);

list.addItem("init event start.");

}

public void start() {

list.addItem("start event start.");

}

public void stop() {

list.addItem("stop event start.");

}

public void destroy() {

list.addItem("destroy event start.");

}

public void paint(Graphics g) {

list.addItem("paint event start.");

}

public void update(Graphics g) {

list.addItem("update event start.");

}

public boolean mouseDown(Event evt, int x, int y) {

list.addItem("mouse down event : (" + x + "," + y + ")");

return true;

}

public boolean mouseUp(Event evt, int x, int y) {

list.addItem("mouse up event : (" + x + "," + y + ")");

return true;

}

public boolean mouseMove(Event evt, int x, int y) {

list.addItem("mouse move event : (" + x + "," + y + ")");

return true;

}

public boolean mouseEnter(Event evt, int x, int y) {

list.addItem("mouse enter event : (" + x + "," + y + ")");

return true;

}

public boolean mouseExit(Event evt, int x, int y) {

list.addItem("mouse exit event : (" + x + "," + y + ")");

return true;

}

public boolean mouseDrag(Event evt, int x, int y) {

list.addItem("mouse drag event : (" + x + "," + y + ")");

return true;

}

public boolean gotFocus(Event evt, Object what) {

list.addItem("gotFocus event start.");

return true;

}

public boolean lostFocus(Event evt, Object what) {

list.addItem("lostFocus event start.");

return true;

}

}

4. 키보드 이벤트

사용자가 키보드의 키를 입력하였을 때 발생하는 이벤트를 의미한다.

메소드 원형	public boolean keyDown(Event evt, int key)
기능	키보드의 키를 눌렀을 때 호출되는 메소드
매개변수	evt : Event 클래스형 변수 key : 키 코드
클래스	Component (Applet의 수퍼 클래스)

메소드 원형	public boolean keyUp(Event evt, int key)
기능	키보드의 키를 놓았을 때 호출되는 메소드
매개변수	evt : Event 클래스형 변수 key : 키 코드
클래스	Component (Applet의 수퍼 클래스)

[ 예제 ] 키보드 이벤트 프로그램

import java.applet.Applet;

import java.awt.*;

public class ShowKeyEvent extends Applet {

List list;

public void init() {

list = new List(10, false);

add(list);

list.addItem("init event start.");

}

public void start() {

list.addItem("start event start.");

}

public void stop() {

list.addItem("stop event start.");

}

public void destroy() {

list.addItem("destroy event start.");

}

public void paint(Graphics g) {

list.addItem("paint event start.");

}

public boolean keyUp (Event evt, int key) {

list.addItem((char) key + " key released.");

return true;

}

public boolean keyDown (Event evt, int key) {

list.addItem((char) key + " key pressed.");

return true;

}

}

Ⅷ. 애플릿(Applet)

1. 매개변수를 처리하는 자바 애플릿

HTML 문서 <PARAM> 택을 통해 넘겨준 옵션은 Applet 클래스에 정의되어 있는

getParameter 메소드를 통해 받을 수 있다.

메소드 원형	public String getParameter(String name)
기능	애플릿의 매개변수를 넘겨받는 메소드
매개변수	name : 매개변수 이름
클래스	Applet

□HTML 문서의 경우 <PARAM> 택의 NAME을 통해 먼저 'Message'라는 매개변수 이름을

넘기고, VALUE를 통해 매개변수의 값을 넘기게 된다.

[ 예제 ]

import java.applet.Applet;

import java.awt.Graphics;

public class ShowParameter extends Applet {

String message;

public void init() {

// Message 매개변수를 통해 넘어온 값을 message 변수에 저장

message = getParameter("message");

}

public void paint(Graphics g) {

g.drawString(message, 50, 25);

}

}

[ HTML ]

<HTML>

<HEAD>

<TITLE> The ShowParameter Applet Demo</TITLE>

</HEAD>

<BODY>

Get User Parameter!

<P>

<APPLET CODE = ShowParameter.class WIDTH=300 HEIGHT=50>

<PARAM NAME="Message" VALUE="Hi! This is message passed by parameter.">

</APPLET>

</BODY>

</HTML>

2. 그래픽을 처리하는 자바 애플릿

1) 자바 애플릿 그래픽 메소드

□ 선

□자바 애플릿에서 원점 좌표가 좌측 상단에 있다.

□선의 색은 현재 설정된 색을 사용하게 된다.

메소드 원형	public abstract void drawLine(int x1, int y1, int x2, int y2)
기능	선을 그리는 메소드
매개변수	x1 : 시작점의 x좌표 y1 : 시작점의 y좌표 x2 : 끝점의 x좌표 y2 : 끝점의 y좌표
클래스	Graphics

□ 사각형

□선의 색은 현재 설정된 색을 사용하게 된다.

□drawRect 메소드는 사각형의 테두리만 그릴 뿐 내부는 칠하지 않는다.

메소드 원형	public void drawRect(int x, int y, int width, int height)
기능	사각형을 그리는 메소드
매개변수	x : 사각형 시작점의 x좌표 y : 사각형 시작점의 y좌표 width : 사각형의 너비 height : 사각형의 높이
클래스	Graphics

□내부를 칠하는 색은 현재 설정되어 있는 색을 사용하게 된다.

메소드 원형	public abstract void fillRect(int x, int y, int width, int height)
기능	사각형의 내부를 칠하는 메소드
매개변수	x : 사각형 시작점의 x좌표 y : 사각형 시작점의 y좌표 width : 사각형의 너비 height : 사각형의 높이
클래스	Graphics

메소드 원형	public abstract void clearRect(int x, int y, int width, int height)
기능	사각형의 내부를 지우는 메소드
매개변수	x : 사각형 시작점의 x좌표 y : 사각형 시작점의 y좌표 width : 사각형의 너비 height : 사각형의 높이
클래스	Graphics

메소드 원형	public void draw3DRect(int x, int y, int width, int height, boolean raised)
기능	3차원 사각형을 그리는 메소드
매개변수	x : 사각형 시작점의 x좌표 y : 사각형 시작점의 y좌표 width : 사각형의 너비 height : 사각형의 높이 raised : 사각형이 위로 올라온 듯한 효과를 줄지의 여부(true/false)
클래스	Graphics

메소드 원형	public void fill3DRect(int x, int y, int width, int height, boolean raised)
기능	3차원 사각형의 내부를 칠하는 메소드
매개변수	x : 사각형 시작점의 x좌표 y : 사각형 시작점의 y좌표 width : 사각형의 너비 height : 사각형의 높이 raised : 사각형이 위로 올라온 듯한 효과를 줄지의 여부(true/false)
클래스	Graphics

□ 원호

□각도의 원점 : 3시 위치

□양의 각도 : 시계 반대 방향, 음의 각도 : 시계 방향

□원을 그리려면 : startAngle - 0, arcAngle - 360

메소드 원형	public abstract void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
기능	원호를 그리는 메소드
매개변수	x : 원호를 그릴 사각형 시작점의 x좌표 y : 원호를 그릴 사각형 시작점의 y좌표 width : 원호를 그릴 사각형의 너비 height : 원호를 그릴 사각형의 높이 startAngle : 시작 각도 arcAngle : 끝 각도 (startAngle을 기준으로)
클래스	Graphics

메소드 원형	public abstract void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
기능	원호 내부를 칠하는 메소드
매개변수	x : 원호를 그릴 사각형 시작점의 x좌표 y : 원호를 그릴 사각형 시작점의 y좌표 width : 원호를 그릴 사각형의 너비 height : 원호를 그릴 사각형의 높이 startAngle : 시작 각도 arcAngle : 끝 각도 (startAngle을 기준으로)
클래스	Graphics

□ 다각형

메소드 원형	public abstract void drawPolygon(int xPoints[], int yPoints[], int nPoints)
기능	다각형을 그리는 메소드
매개변수	xPoints : 다각형을 그리는데 사용되는 점들의 x좌표(배열) yPoints : 다각형을 그리는데 사용되는 점들의 y좌표(배열) nPoints : 다각형을 그리는데 사용되는 점의 개수
클래스	Graphics

메소드 원형	public abstract void fillPolygon(int xPoints[], int yPoints[], int nPoints)
기능	내부가 채워진 다각형을 그리는 메소드
매개변수	xPoints : 다각형을 그리는데 사용되는 점들의 x좌표(배열) yPoints : 다각형을 그리는데 사용되는 점들의 y좌표(배열) nPoints : 다각형을 그리는데 사용되는 점의 개수
클래스	Graphics

□ 색

□Color 클래스는 java.awt.Color 패키지에 정의된 것.

□이 변수들은 정적 변수로 정의되어 있기 때문에 Color 클래스 자체를 그대로 사용한다.

메소드 원형	public abstract void setColor(Color c)
기능	현재 색깔을 설정하는 메소드
매개변수	c : Color 클래스형 변수. 설정하고자 하는 색의 종류
클래스	Graphics

메소드 원형	public abstract Color getColor()
기능	현재 설정된 색을 알아내는 메소드
매개변수	없음
클래스	Graphics

[ Color 클래스에 정의된 색깔 정보 ]

색	변수	색	변수	색	변수
검은색	black	녹색	green	빨간색	red
파란색	blue	밝은 회색	lightGray	흰색	white
청록색	cyan	자홍색	magenta	노란색	yellow
어두운 회색	darkGray	오랜지색	orange
회색	gray	분홍색	pink

메소드 원형	public Color(int r, int g, int b)
기능	Color 클래스의 생성자
매개변수	r : Red 성분 (0 ∼ 255사이의 정수값) g : Green 성분 (0 ∼ 255사이의 정수값) b : Blue 성분 (0 ∼ 255사이의 정수값)
클래스	Graphics

□ 글자체

□Font 클래스는 java.awt.Font 패키지에 정의된 것.

□Font 클래스의 변수를 만들기 위해 생성자를 호출한다.

□이 때 사용할 폰트 이름, 스타일 종류, 글자 크기에 대한 정보를 매개변수로 전달한다.

메소드 원형	public abstract void setFont(Font font)
기능	글자체를 설정하는 메소드
매개변수	font : Font 클래스 변수.
클래스	Graphics

메소드 원형	public abstract Font getFont()
기능	현재 설정된 글자체를 알아내는 메소드
매개변수	없음
클래스	Graphics

메소드 원형	public Font(String name, int style, int size)
기능	Font 클래스의 생성자
매개변수	name : 폰트 이름 style : 스타일 이름(PLAIN, BOLD, ITALIC) size : 글자체 크기
클래스	Font

□생성자를 호출할 때 가장 문제가 되는 것은 글자체 이름을 알아내는 것.

□이 때 사용할 수 있는 메소드가 java.awt.ToolKit 패키지에 정의되어 있다.

메소드 원형	public abstract String[] getFontList()
기능	현재 사용할 수 있는 글자체의 이름을 알아내는 메소드
매개변수	없음
클래스	ToolKit

[ Font 클래스에 정의된 스타일 정보 ]

글자체	변수
보통체	PLAIN
볼드체	BOLD
이탤릭체	ITALIC

□FontMetrics 클래스 : 현재 설정된 글자체에 대한 정보를 알아내기 위해 사용.

글자체의 너비와 높이를 알아낼 수 있다.

□public void paint(Graphics g) {

// Graphics 클래스에 정의된 getFontMetrics 메소드로 알아낸다.

FontMetrics fm = g.GetFontMetrics();

// 현재 글자체의 높이를 현재 글자체를 기준으로 알아낸다.

int height = fm.getHeight();

// "TEST FONT" 문자열의 실제 길이를 현재 글자체를 기준으로 알아낸다.

int length = fm.stringWidth("TEST FONT");

}

2) 자바 애플릿 그래픽 예제

□size 메소드 : java.awt.Component 패키지에 정의되어 있다.

□Applet 클래스라는 컴포넌트에서 호출하게 되므로 애플릿의 크기 정보가 리턴된다.

□리턴값으로 나오는 Dimension 클래스는 java.awt.Dimension 패키지에 정의되어 있으며,

너비와 높이에 대한 정보가 포함되어 있다.

메소드 원형	public Dimension size()
기능	현재 컴포넌트의 크기를 알아내는 메소드
매개변수	없음
클래스	Component (Applet의 수퍼 클래스)

import java.applet.Applet;

import java.awt.*;

public class GraphicDemo extends Applet {

int h, w;

public void init() {

Dimension d = size();     // 현재 애플릿의 크기를 알아냄

h = d.height;                // 애플릿의 높이와 너비를 알아낸다.

w = d.width;

}

public void paint(Graphics g) {

int x[] = new int[20];

int y[] = new int[20];

int npoint = 0;

Font current_font = g.getFont();       // 현재 설정된 글자체

g.setColor(Color.blue);                 // 파란색을 현재 색깔로 설정

g.drawLine(0, 0,     w/5, 0);

g.drawLine(0, h/5,   w/5, h/5);

g.drawLine(0, h*2/5, w/5, h*2/5);

g.drawLine(0, h*3/5, w/5, h*3/5);

g.drawLine(0, h*4/5, w/5, h*4/5);

g.setColor(Color.red);                  // 빨간색을 현재 색깔로 설정

g.drawRect(w/5+5,  0, w/5,       h-1);  // 사각형 그리기

g.drawRect(w/5+10, 5, w/5-10, h-11);

g.draw3DRect(w/5+15, 10, w/5-20, h-21, true);

g.draw3DRect(w/5+20, 15, w/5-30, h-31, true);

g.fillRect(w/5+25, 20, w/5-40, h-41);

g.setColor(Color.green);               // 녹색을 현재 색깔로 설정

g.drawArc(w*2/5+5,  0, w/5,      h-1,  0, 360);  // 원그리기

g.drawArc(w*2/5+10, 2, w/5-10, h-11, 0, 360);

g.drawArc(w*2/5+15, 4, w/5-20, h-21, 0, 360);

g.drawArc(w*2/5+20, 6, w/5-30, h-31, 0, 360);

g.drawArc(w*2/5+25, 8, w/5-40, h-41, 0, 360);

g.setColor(Color.cyan);                // 청록색을 현재 색깔로 설정

x[npoint] = w*3/5+5;  y[npoint] = 0;     npoint++;  // 다각형 그리기

x[npoint] = w*4/5;    y[npoint] = 0;      npoint++;

x[npoint] = w*4/5;    y[npoint] = h/3;    npoint++;

x[npoint] = w*3/5+5;  y[npoint] = h/3;   npoint++;

x[npoint] = w*3/5+5;  y[npoint] = h*2/3; npoint++;

x[npoint] = w*4/5;    y[npoint] = h*2/3;     npoint++;

x[npoint] = w*4/5;    y[npoint] = h-1;   npoint++;

x[npoint] = w*3/5+5;  y[npoint] = h-1;   npoint++;

g.drawPolygon(x, y, npoint);

g.setColor(Color.magenta);            // 자홍색을 현재 색깔로 설정

g.setFont(new Font(current_font.getName(), Font.PLAIN, 20));  // 문자열 출력

g.drawString("Plain", w*4/5+20, h/3);

g.setFont(new Font(current_font.getName(), Font.BOLD, 20));

g.drawString("Bold", w*4/5+20, h*2/3);

g.setFont(new Font(current_font.getName(), Font.ITALIC, 20));

g.drawString("Italic", w*4/5+20, h*3/3);

}

}

3) 마우스를 이용하여 사각형을 그리는 그래픽 에디터 예제

□마우스 버튼을 누르는 경우(mouseDown 메소드에서) 현재 마우스 위치를 기억해 두었다가 사각형의

시작점으로 사용하게 된다.

□버튼을 누른 채로 마우스를 드래그하면 현재 위치와 사각형 시작점과의 차이을 계산하여 사각형의

너비와 높이를 결정하게 된다.(mouseDrag 메소드에서)

□repaint 메소드를 호출하여 애플릿 영역에 새로운 크기의 사각형을 그리게 된다.

□마우스의 드래그가 끝난 후에 다시 마우스 버튼을 누르면 또 다른 새로운 사각형이 만들어진다.

□이때 기존의 사각형은 지워지게 되는데, 이는 기존 사각형에 대한 정보를 기억해 놓지 않았기

때문이다.

□만약 사각형을 그대로 유지시키고 싶으면 이 데이터를 기억해 둘 수 있는 변수를 정의해서

사용하면 된다.

import java.applet.Applet;

import java.awt.*;

public class MouseRectangle extends Applet {

int rx, ry, rwidth, rheight;

int h, w;

public void init() {           // 현재 애플릿의 크기를 알아냄

Dimension d = size();

h = d.height;

w = d.width;

}

public void paint(Graphics g) {

g.drawRect(0, 0, w-1, h-1);         // 사각형 그리기. 너비와 높이에서 1을 빼는 이유?

g.drawRect(rx, ry, rwidth, rheight);

}

public boolean mouseDown(Event evt, int x, int y) {  // 새로운 사각형 시작

rx = x;

ry = y;

return true;

}

public boolean mouseDrag(Event evt, int x, int y) {  // 사각형 너비와 높이를 계산

rwidth = x - rx;

rheight = y - ry;

repaint();    // paint() 메소드 호출

return true;

}

}

<html>

<body>

Simple Graphic Editor Demo - Just click and drag.

<p>

<applet code = MouseRectangle.class width=400 height=250>

</applet>

</body>

</html>

3. 멀티미디어를 처리하는 자바 애플릿

1) 이미지 처리

□자바에서 이미지를 처리하기 위해 주어진 URL 주소에서 이미지 객체를 가져오는 2가지

메소드가 제공되고 있다.

□주의할점 : 이 메소드는 단지 주어진 주소로부터 이미지 객체에 대한 정보를 받을

뿐이지, 실제 이미지 데이터는 받지 않는다.

□자바에서 처리할 수 있는 이미지 파일의 종류 : GIF, JPEG

메소드 원형	public Image getImage(URL url)
기능	주어진 주소에서 이미지 객체를 가져오는 메소드. 이 메소드는 실제 이미지 데이터가 아닌 이미지 객체 정보만 가져온다.
매개변수	url : 이미지 파일의 URL 주소. 이미지의 절대 주소를 입력한다.
클래스	Applet

메소드 원형	public Image getImage(URL url, String name)
기능	주어진 주소에서 이미지 객체를 가져오는 메소드. 이 메소드는 실제 이미지 데이터가 아닌 이미지 객체 정보만 가져온다.
매개변수	url : 이미지 파일의 URL 주소. 이미지의 절대 주소를 입력한다. name : 이미지 파일의 주소. url을 바탕으로 한 이미지의 실제 주소
클래스	Applet

메소드 원형	public URL getDocumentBase()
기능	현재 HTML 문서가 존재하는 URL 주소를 알아내는 메소드
매개변수	없음
클래스	Applet

메소드 원형	public URL getCodeBase()
기능	현재 애플릿이 존재하는 URL 주소를 알아내는 메소드
매개변수	없음
클래스	Applet

예) 현재 애플릿이 존재하는 디렉토리에 'test.gif'라는 이미지가 있을 때, 이 이미지 파일의

객체를 읽는 방법

Image img = getImage(getCodeBase(), "test.gif");

메소드 원형	public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer)
기능	이미지를 그리는 함수
매개변수	img : 이미지 객체 (getImage에서 리턴된 값) x : 이미지를 그릴 x 위치 y : 이미지를 그릴 y 위치 observer : 이미지가 완전히 그려졌는지 알려줄 곳 (보통 this변수 사용)
클래스	Graphics

메소드 원형	public abstract boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
기능	이미지를 주어진 사각형 안에 그리는 함수
매개변수	img : 이미지 객체 (getImage에서 리턴된 값) x : 이미지를 그릴 사각형의 x 위치 y : 이미지를 그릴 사각형의 y 위치 width : 이미지를 그릴 사각형의 너비 height : 이미지를 그릴 사각형의 높이 observer : 이미지가 완전히 그려졌는지 알려줄 곳 (보통 this변수 사용)
클래스	Graphics

메소드 원형	public abstract boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)
기능	이미지를 그리는 함수. 배경색 지정 가능
매개변수	img : 이미지 객체 (getImage에서 리턴된 값) x : 이미지를 그릴 x 위치 y : 이미지를 그릴 y 위치 bgcolor : 이미지의 배경색 observer : 이미지가 완전히 그려졌는지 알려줄 곳 (보통 this변수 사용)
클래스	Graphics

메소드 원형	public abstract boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)
기능	이미지를 주어진 사각형 안에 그리는 함수. 배경색 지정 가능
매개변수	img : 이미지 객체 (getImage에서 리턴된 값) x : 이미지를 그릴 사각형의 x 위치 y : 이미지를 그릴 사각형의 y 위치 width : 이미지를 그릴 사각형의 너비 height : 이미지를 그릴 사각형의 높이 bgcolor : 이미지의 배경색 observer : 이미지가 완전히 그려졌는지 알려줄 곳 (보통 this변수 사용)
클래스	Graphics

[ 예제 ]

import java.applet.Applet;

import java.awt.*;

public class ImageTest extends Applet {

Image img;

public void init() {

String image = getParameter("Image");

img = getImage(getDocumentBase(), image);

}

public void paint(Graphics g) {

g.drawImage(img, 0, 0, this);

}

}

<html>

<body>

Image Viewer

<p>

<applet code=ImageTest.class width=100 height=100>

<PARAM NAME="Image" VALUE="duke.gif">

</applet>

</body>

</html>

2) 오디오 처리

□ 자바에서 오디오를 연주하는 방법

□첫 번째 : 오디오 파일이 존재하는 URL 주소에서 직접 가져다가 바로 연주하는 방법

□여러 가지 신경 쓸 필요 없이 오디오 파일의 URL 주소만 지정해 주면 된다.

□두 번째 : 오디오 파일의 객체를 먼저 가져온 다음 나중에 연주하는 방법

□두 단계를 거쳐야만 오디오 파일을 연주할 수 있다.

□오디오 파일의 연주, 정지, 연속 연주 등과 같은 기능을 사용할 수 있다.

□오디오 파일을 직접 가져다가 바로 연주하는 것은 Applet 클래스에 정의되어 있는

play 메소드를 이용한다.

□자바에서 연주할 수 있는 오디오 파일의 종류 - '*.au'

□첫 번째 방법

메소드 원형	public void play(URL url)
기능	오디오 파일을 연주하는 메소드. 오디오 파일을 못찾는 경우에는 아무 일도 일어나지 않는다.
매개변수	url : 오디오 파일의 URL 주소. 오디오 파일의 절대 주소 입력
클래스	Applet

메소드 원형	public void play(URL url, String name)
기능	오디오 파일을 연주하는 메소드. 오디오 파일을 못찾는 경우에는 아무 일도 일어나지 않는다.
매개변수	url : 오디오 파일의 URL 주소. 오디오 파일의 기본 주소 입력 name : 오디오 파일의 주소. url을 바탕으로 한 오디오의 실제 주소
클래스	Applet

public void init() { // 오디오 파일 연주. HTML문서와 같은 디렉토리에 있는 test.au연주

play(getDocumentBase(), "test.au");

}

□ 두 번째 방법

□연주할 오디오 파일의 이름은 'Audio'라는 매개변수를 통해 넘겨받게 된다.

□오디오 파일은 HTML 문서와 동일한 위치에 있는 것으로 가정하게 된다.

□주의해야 할 점 - AudioClip 클래스를 사용하기 때문에 반드시 java.applet.AudioClip을

import시켜야 한다.

메소드 원형	public AudioClip getAudioClip(URL url)
기능	오디오 객체를 가져오는 메소드. 실제 연주하지는 않는다.
매개변수	url : 오디오 파일의 URL 주소. 오디오 파일의 절대 주소 입력
클래스	Applet

메소드 원형	public AudioClip getAudioClip(URL url, String name)
기능	오디오 객체를 가져오는 메소드. 실제 연주하지는 않는다.
매개변수	url : 오디오 파일의 URL 주소. 오디오 파일의 기본 주소 입력 name : 오디오 파일의 주소. url을 바탕으로 한 오디오의 실제 주소
클래스	Applet

메소드 원형	public abstract void play()
기능	오디오 연주. 이 메소드를 호출할 때마다 연주를 새로 시작
매개변수	없음
클래스	AudioClip

메소드 원형	public abstract void loop()
기능	오디오 연속 연주
매개변수	없음
클래스	AudioClip

메소드 원형	public abstract void stop()
기능	오디오 연주 정지
매개변수	없음
클래스	AudioClip

[ 예제 ]

import java.applet.AudioClip;

import java.awt.*;

public class AudioTest extends Applet {

AudioClip audio;

int h, w;

public void init() {

Dimension d = size();   // 애플릿의 크기

h = d.height;

w = d.width;

// 매개변수를 통해 넘어온 오디오 파일 객체를 얻는다.

String audiostring = getParameter("Audio");

audio = getAudioClip(getDocumentBase(), audiostring);

}

public void start() {

audio.play();

}

public void stop() {

audio.stop();

}

public void paint(Graphics g) {    // 오디오 연주 이미지 그리기

double f = ((double)(h-1))/((w-1)*2);

int offset = h/2;

for(int i=w-1; i>=0; i-=3){

int h=(int)(i*f);

g.drawLine(i, offset-h, i, offset+h);

}

}

}

[ html ]

<html>

<body>Audio Player

<P>

<applet code=AudioTest.class width=50 height=50>

<param name="Audio" value="spacemusic.au">

</applet>

</body>

</html>

Ⅸ. 그래픽 유저 인터페이스(GUI)

1. AWT란 무엇인가?

자바는 그래픽 유저 인터페이스를 구현하기 위해 AWT(Abstract Window Toolkit)를

제공하고 있다.

□AWT는 여러 가지 다양한 플랫폼에서 동작할 수 있는 그래픽 유저 인터페이스를 구현하기

위해 제공되는 툴킷이다.

□AWT의 장점은 한 번 프로그램을 만들어 놓으면 윈도우에서 사용하든, 매킨토시에서

사용하든, 웍스테이션에서 사용하든 관계 없이 동일하게 동작한다.

[ AWT 클래스의 계층 구조 ]

						Component
											Button Canvas Checkbox Label List Scrollbar TextArea TextFiled Choice
				Container
		Window				Panel
Dialog				Frame
FileDialog

□Window 클래스 - 대화상자나 프레임과 같은 윈도우 요소를 만들 때 사용한다.

□Panel 클래스 - 윈도우 안에서 그래픽 유저 인터페이스 요소들을 배열시키는 작업을 한다.

2. 그래픽 유저 인터페이스 요소들을 처리하는 메소드

□그래픽 유저 인터페이스 요소를 애플릿에 삽입하려면, 그래픽 유저 인터페이스 요소의

생성자를 호출하여 객체를 만든 후, 애플릿에 삽입하기만 하면 된다.

메소드 원형	public Component add(Component comp)
기능	그래픽 유저 인터페이스 요소(Component)를 삽입하는 메소드
매개변수	comp : 삽입될 그래픽 유저 인터페이스 요소
클래스	Container

메소드 원형	public synchronized Component add(Component comp, int pos)
기능	주어진 위치에 그래픽 유저 인터페이스 요소를 삽입하는 메소드
매개변수	comp : 삽입될 그래픽 유저 인터페이스 요소 pos : 요소의 위치. -1일 경우 마지막에 추가
클래스	Container

메소드 원형	public synchronized Component add(String name, Component comp)
기능	그래픽 유저 인터페이스 요소(Component)를 삽입하는 메소드. 이 때에는 요소의 이름까지 정해주게 되는데, 이 이름은 나중에 요소들을 배열할 때 사용한다.
매개변수	comp : 삽입될 그래픽 유저 인터페이스 요소
클래스	Container

2) 그래픽 유저 인터페이스 요소 삭제

메소드 원형	public synchronized void remove(Component comp)
기능	그래픽 유저 인터페이스 요소(Component)를 삭제하는 메소드
매개변수	comp : 삭제될 그래픽 유저 인터페이스 요소
클래스	Container

메소드 원형	public synchronized void removeAll
기능	그래픽 유저 인터페이스 요소(Component)를 모두 삭제하는 메소드
매개변수	없음
클래스	Container

3. 그래픽 유저 인터페이스 이벤트를 처리하는 방법

□자바 애플릿을 사용하면서 발생하는 여러 이벤트들 중에서 그래픽 유저 인터페이스에서

발생하는 이벤트는 ACTION_EVENT 라고 부른다.

□action메소드는 그래픽 유저 인터페이스에서 이벤트가 발생하는 경우에 자동으로 호출된다.

메소드 원형	public boolean action(Event evt, Object what)
기능	그래픽 유저 인터페이스 이벤트를 처리하는 메소드
매개변수	evt : Event 클래스 변수. what : 이벤트를 발생시킨 요소
클래스	Component

[ Event 정보 ]

Event에 정의된 변수	의미
public Object target public long when public int id public int x public int y public int key public int modifiers public int clickCount public Object arg public Event evt	이벤트 대상 요소 시간 정보 이벤트의 종류 이벤트가 발생한 곳의 x좌표 이벤트가 발생한 곳의 y좌표 키보드 이벤트의 경우 눌려진 키 코드 Ctrl이나 Alt 같은 보조키 정보 클릭/더블 클릭 구분 (1 : 클릭, 2 : 더블클릭) 임의 매개변수 다음 이벤트

□target은 이벤트를 발생시킨 그래픽 유저 인터페이스 요소를 가리키는 것.

4. 그래픽 유저 인터페이스 요소

1) Button

□Button 클래스의 생성자는 두 가지이다.

첫 번째 - 레이블을 지정하지 않은 것

두 번째 - 레이블을 지정하는 것

□버튼 클래스를 지정하지 않은 경우에는 setLabel(String label)메소드를 이용하여

지정할 수 있다.

□현재 버튼에 지정된 레이블을 알아내는 메소드 - getLabel()

메소드 원형	public Button()
기능	버튼 생성자
매개변수	없음
클래스	Button

메소드 원형	public Button(String label)
기능	버튼 생성자
매개변수	label : 버튼 레이블
클래스	Button

[ 예제 ]

import java.applet.*;

import java.awt.*;

public class ButtonTest extends Applet {

// 버튼 변수 선언

Button but1, but2, but3, but4, but5;

public void init() {

// 메모리 할당

but1 = new Button("Click me 1");

but2 = new Button("Click me 2");

but3 = new Button("Click me 3");

but4 = new Button("Click me 4");

but5 = new Button("Click me 5");

// 세 번째 add 메소드를 이용하여 버튼을 삽입한다.

add("button1", but1);

add("button2", but2);

add("button3", but3);

add("button4", but4);

add("button5", but5);

}

public boolean action(Event evt, Object what) {

// 각 버튼에 해당하는 이벤트 처리하기

// showStatus는 브라우저 하단에 메시지를 출력하는 메소드

if(evt.target == but1) {

showStatus("Button 1 clicked.");

}

else if(evt.target == but2) {

showStatus("Button 2 clicked.");

}

else if(evt.target == but3) {

showStatus("Button 3 clicked.");

}

else if(evt.target == but4) {

showStatus("Button 4 clicked.");

}

else if(evt.target == but5) {

showStatus("Button 5 clicked.");

}

return true;

}

}

2) Checkbox

□여러 개의 선택 옵션 중 하나를 선택하고 싶을 때 사용하는 그래픽 유저 인터페이스

메소드 원형	public Checkbox()
기능	체크 박스 생성자 (체크 상태 : 디폴트로 false)
매개변수	없음
클래스	Checkbox

메소드 원형	public Checkbox(String label)
기능	체크 박스 생성자 (체크 상태 : 디폴트로 false)
매개변수	label : 레이블
클래스	Checkbox

메소드 원형	public Checkbox(String label, CheckboxGroup group, boolean state)
기능	체크 박스 생성자
매개변수	label : 레이블 group : 체크 박스가 속한 그룹 state : 체크 상태
클래스	Checkbox

□세번 째 매개변수 state - 체크 상자를 체크된 상태로 할 것인지 말 것인지를 입력하는 곳

( true - 체크된 상태, false - 체크되지 않은 상태 )

메소드 원형	public CheckboxGroup()
기능	체크 박스 그룹 생성자
매개변수	없음
클래스	CheckboxGroup

메소드 원형	public boolean getState()
기능	체크 박스의 체크 여부 확인
매개변수	없음
클래스	Checkbox

[ 예제 ]

import java.applet.*;

import java.awt.*;

public class CheckboxTest extends Applet {

// 체크 박스 변수 선언

Checkbox check1;

Checkbox check2;

Checkbox check3;

// 버튼 변수 선언

Button but;

public void init() {

// 메모리 할당

CheckboxGroup group = new CheckboxGroup();

check1 = new Checkbox("check box 1", group, true);

check2 = new Checkbox("check box 2", group, false);

check3 = new Checkbox("check box 3", group, false);

but = new Button("Click me");

// 애플릿에 삽입

add("check1", check1);

add("check2", check2);

add("check3", check3);

add("button", but);

}

public boolean action(Event evt, Object what) {

// 마우스로 체크박스를 선택했을 때 발생하는 이벤트 처리하기

if(evt.target == check1) {

showStatus("Check box 1 clicked.");

}

else if(evt.target == check2) {

showStatus("Check box 2 clicked.");

}

else if(evt.target == check3) {

showStatus("Check box 3 clicked.");

}

// 버튼 클릭

else if(evt.target == but) {

// 어떤 체크 박스가 체크되어 있는지 확인

if(check1.getState() == true) {

showStatus("check 1 is selected.");

}

if(check2.getState() == true) {

showStatus("check 2 is selected.");

}

if(check3.getState() == true) {

showStatus("check 3 is selected.");

}

}

return true;

}

}

3) Label

□이 레이블은 오직 읽을 수만 있기 때문에 키보드를 통해 문자열을 편집할 수는 없다.

□주로 자바 애플릿의 제목이나 안내문을 붙일 때 사용된다.

메소드 원형	public Label()
기능	레이블 생성자
매개변수	없음
클래스	Label

메소드 원형	public Label(String label)
기능	레이블 생성자
매개변수	label : 레이블
클래스	Label

메소드 원형	public Label(String label, int alignment)
기능	레이블 생성자
매개변수	label : 레이블 alignment : 레이블의 정렬 방식 (Label.LEFT, Label.CENTER, Label.RIGHT)
클래스	Label

예) Label label = new Label ("Welcome to java", Label.LEFT);

[ 예제 ]

import java.applet.*;

import java.awt.*;

public class LabelTest extends Applet {

public void init() {

setLayout(new GridLayout(3, 1));

add("label1", new Label("Java World : left align", Label.LEFT));

add("label2", new Label("Java World : center align", Label.CENTER));

add("label3", new Label("Java World : right align", Label.RIGHT));

}

}

4) List

□목록을 순서대로 나열하여 선택할 수 있도록 해주는 인터페이스 요소

메소드 원형	public List()
기능	리스트 상자 생성자
매개변수	없음
클래스	List

메소드 원형	public List(int rows, boolean multipleSelections)
기능	리스트 상자 생성자
매개변수	rows : 실제로 나타나는 리스트 상자의 줄 수 multipleSelections : 여러 개의 목록을 동시에 선택할 수 있는지 여부
클래스	List

메소드 원형	public synchronized void addItem(String item)
기능	리스트 상자에 목록을 추가하는 메소드 리스트 상자 끝에서부터 추가
매개변수	item : 추가할 목록
클래스	List

메소드 원형	public synchronized void addItem(String item, int index)
기능	리스트 상자에 목록을 추가하는 메소드 지정된 위치에 목록(index)을 추가
매개변수	item : 추가할 목록 index : 추가할 위치
클래스	List

메소드 원형	public synchronized void delItem(int position)
기능	리스트 상자에서 목록을 삭제하는 메소드
매개변수	position : 삭제할 목록 번호
클래스	List

메소드 원형	public synchronized void delItems(int start, int end)
기능	리스트 상자에서 목록을 삭제하는 메소드
매개변수	start : 삭제할 목록의 시작 번호 end : 삭제할 목록의 끝 번호
클래스	List

메소드 원형	public synchronized int getSelectedIndex()
기능	리스트 상자에서 선택된 목록의 번호를 리턴하는 메소드 -1이 리턴되면 아무 것도 선택되지 않은 것임
매개변수	없음
클래스	List

메소드 원형	public synchronized int[] getSelectedIndexes()
기능	리스트 상자에서 선택된 목록의 번호(배열)를 리턴하는 메소드
매개변수	없음
클래스	List

메소드 원형	public synchronized String getSelectedItem()
기능	리스트 상자에서 선택된 목록의 문자열을 리턴하는 메소드 만약 null이 리턴되면 아무 것도 선택되지 않은 것임
매개변수	없음
클래스	List

메소드 원형	public synchronized String[] getSelectedItems()
기능	리스트 상자에서 선택된 목록의 문자열(배열)을 리턴하는 메소드
매개변수	없음
클래스	List

메소드 원형	public synchronized void select(int index)
기능	리스트 상자의 특정 목록을 선택하는 메소드
매개변수	index : 선택할 목록 번호
클래스	List

메소드 원형	public synchronized void deselect(int index)
기능	리스트 상자의 특정 목록의 선택을 해제하는 메소드
매개변수	index : 선택을 해제할 메소드
클래스	List

[ 예제 ]

import java.applet.*;

import java.awt.*;

public class ListTest extends Applet {

List list1, list2;                       // 체크 상자 변수 선언

Button but1, but2;                    // 버튼 변수 선언

public void init() {                    // 메모리 할당

list1 = new List(10, false);

list1.addItem("item 1");

list1.addItem("item 2");

list1.addItem("item 3");

list1.addItem("item 4");

list1.addItem("item 5");

list1.select(1);

list2 = new List(10, false);

list2.addItem("item 6");

list2.addItem("item 7");

list2.addItem("item 8");

list2.addItem("item 9");

list2.addItem("item 10");

list2.select(1);

but1 = new Button("->");

but2 = new Button("<-");

add("listbox1", list1);             // 애플릿에 삽입

add("button1", but1);

add("button2", but2);

add("listbox2", list2);

}

public boolean action(Event evt, Object what) {

int select;

if(evt.target == but1) {      // 마우스로 버튼을 선택했을 때 발생하는 이벤트 처리하기

select = list1.getSelectedIndex();  // 리스트 상자 1에서 선택된 목록을 가져온다.

if(select != -1) {                 // 만약 선택된 것이 있다면

list2.addItem(list1.getSelectedItem());  // 리스트 상자 2에 선택된 목록 추가

list1.delItem(select);                   // 리스트 상자 1에서 선택된 목록 삭제

}

}

else if(evt.target == but2) {

select = list2.getSelectedIndex();  // 리스트 상자 2에서 선택된 목록을 가져온다.

if(select != -1) {                 // 만약 선택된 것이 있다면

list1.addItem(list2.getSelectedItem());   // 리스트 상자 1에 선택된 목록 추가

list2.delItem(select);                    // 리스트 상자 2에서 선택된 목록 삭제

}

}

return true;

}

}

5) Choice

□간단하게 목록을 선택할 수 있게 만들어 주는 팝업 메뉴를 의미한다.

메소드 원형	public Choice()
기능	리스트 상자 생성자
매개변수	없음
클래스	Choice

메소드 원형	public synchronized void addItem(String item)
기능	팝업 메뉴에 메뉴를 추가하는 메소드
매개변수	item : 추가할 메뉴
클래스	Choice

메소드 원형	public String getSelectedItem()
기능	팝업 메뉴에서 선택된 목록의 문자열을 리턴하는 메소드
매개변수	없음
클래스	Choice

메소드 원형	public int getSelectedIndex()
기능	팝업 메뉴에서 선택된 목록의 번호를 리턴하는 메소드
매개변수	없음
클래스	Choice

메소드 원형	public synchronized void select(int pos)
기능	팝업 메뉴에서 특정 메뉴가 선택되도록 만드는 메소드
매개변수	pos : 선택할 메뉴 목록 번호
클래스	Choice

[ 예제 ]

import java.applet.*;

import java.awt.*;

public class ChoiceTest extends Applet {

Choice choice;                  // 팝업 메뉴 변수 선언

public void init() {

choice = new Choice();     // 메모리 할당

choice.addItem("menu 1");

choice.addItem("menu 2");

choice.addItem("menu 3");

choice.addItem("menu 4");

choice.addItem("menu 5");

choice.select(1);

add("choice menu", choice);

}

public boolean action(Event evt, Object what) {

// 마우스로 Choice 메뉴를 선택했을 때 발생하는 이벤트 처리하기

if(evt.target == choice) {

showStatus(choice.getSelectedItem());  // 선택한 메뉴 목록을 브라우저 하단에

}

return true;

}

}

6) TextField

□한 줄짜리 텍스트 필드를 만드는데 사용되는 그래픽 유저 인터페이스

□여러 줄에 걸쳐 입력해야 한다면 TextArea를 사용해야 한다.

메소드 원형	public TextField()
기능	텍스트 필드 생성자
매개변수	없음
클래스	TextField

메소드 원형	public TextField(int cols)
기능	텍스트 필드 생성자
매개변수	cols : 텍스트 필드의 칸 수
클래스	TextField

메소드 원형	public TextField(String text)
기능	텍스트 필드 생성자
매개변수	text : 텍스트 필드에 미리 입력해 넣을 문자열
클래스	TextField

메소드 원형	public TextField(String text, int cols)
기능	텍스트 필드 생성자
매개변수	cols : 텍스트 필드의 칸 수 text : 텍스트 필드에 미리 입력해 넣을 문자열
클래스	TextField

□텍스트 필드에서 가장 중요한 것은 입력된 문자열을 가져오는 것이다.

메소드 원형	public String getText()
기능	입력된 문자열을 가져오는 메소드
매개변수	없음
클래스	TextComponent

[ 예제 ] 텍스트 필드를 통해 문자열을 입력하고 □키를 누르는 순간, 입력한 문자열이

리스트 상자에 추가된다.

import java.applet.*;

import java.awt.*;

public class TextFieldTest extends Applet {

TextField field;   // 텍스트 필드 변수 선언

List list;          // 리스트 상자 변수 선언

public void init() {

list = new List(10, false);     // 메모리 할당

field = new TextField(20);

add("list box", list);           // 애플릿에 추가

add("text field", field);

}

public boolean action(Event evt, Object what) {

// 텍스트 필드에서 모두 입력하고 □키를 눌렀을 때 발생하는 이벤트 처리하기

if(evt.target == field) {

list.addItem(field.getText());

}

return true;

}

}

7) TextArea

□여러 줄의 입력 영역을 만들어 놓은 그래픽 유저 인터페이스

메소드 원형	public TextArea()
기능	텍스트 영역 생성자
매개변수	없음
클래스	TextArea

메소드 원형	public TextArea(int rows, int cols)
기능	텍스트 영역 생성자
매개변수	rows : 텍스트 영역의 줄 수 cols : 텍스트 영역의 칸 수
클래스	TextArea

메소드 원형	public TextArea(String text)
기능	텍스트 영역 생성자
매개변수	text : 텍스트 영역에 미리 입력해 넣을 문자열
클래스	TextArea

메소드 원형	public TextArea(String text, int rows, int cols)
기능	텍스트 영역 생성자
매개변수	rows : 텍스트 영역의 줄 수 cols : 텍스트 영역의 칸 수 text : 텍스트 영역에 미리 입력해 넣을 문자열
클래스	TextArea

[ 예제 ]

import java.applet.*;

import java.awt.*;

public class TextAreaTest extends Applet {

TextArea area;    // 텍스트 필드 변수 선언

Button but;        // 버튼 변수 선언

public void init() {

area = new TextArea(20, 20);      // 메모리 할당

but = new Button("send Text");

add("text area", area);             // 애플릿에 추가

add("button", but);

}

public boolean action(Event evt, Object what) {

if(evt.target == but) {        // 버튼을 눌렀을 때 발생하는 이벤트 처리하기

showStatus(area.getText());

}

return true;

}

}

8) Scrollbar

□스크롤바를 만들기 위한 그래픽 유저 인터페이스

메소드 원형	public Scrollbar()
기능	스크롤바 생성자. 수직 스크롤바를 만들어 낸다.
매개변수	없음
클래스	Scrollbar

메소드 원형	public Scrollbar(int orientation)
기능	스크롤바 생성자. 지정된 방향의 스크롤바를 만들어 낸다.
매개변수	orientation : 스크롤바의 방향 (Scrollbar.HORIZONTAL or Scrollbar.VERTICAL)
클래스	Scrollbar

메소드 원형	public Scrollbar( int orientation, int value, int visible, int minimum, int maximum )
기능	스크롤바 생성자
매개변수	orientation : 스크롤바의 방향 value : 스크롤바의 현재 값 visible : 스크롤할 수 있는 영역 중 보여지는 부분의 길이 minimum : 스크롤바의 최소값 maximum : 스크롤바의 최대값
클래스	Scrollbar

메소드 원형	public int getValue()
기능	스크롤바의 현재 값을 알아내는 메소드
매개변수	없음
클래스	Scrollbar

9) Canvas

□이미지 파일을 읽어서 보여준다든가, 선이나 원과 같은 그래픽 요소를 그린다든가 하는

그래픽 작업에 필요한 영역을 제공해 준다.

메소드 원형	public Canvas()
기능	캔버스 생성자
매개변수	없음
클래스	Canvas

import java.awt.*;

import java.awt.event.*;

import java.util.*;

public class MyCanvas implements KeyListener, MouseListener{

Canvas c;

String s = " ";

public static void main(String args[]){

Frame f = new Frame("Canvas");

MyCanvas mc = new MyCanvas();

mc.c = new Canvas();

f.add("Center", mc.c);

f.setSize(150, 150);

mc.c.addMouseListener(mc);

mc.c.addKeyListener(mc);

f.setVisible(true);

}

public void keyTyped(KeyEvent ev){

System.out.println("KeyTyped");

s += ev.getKeyChar();

c.getGraphics().drawString(s, 0, 20);

}

public void mouseClicked(MouseEvent ev){

System.out.println("mouseClicked");

c.requestFocus();

}

public void keyPressed(KeyEvent ev){

System.out.println("KeyPressed");

}

public void keyReleased(KeyEvent ev){

System.out.println("KeyReleased");

}

public void mousePressed(MouseEvent ev){

System.out.println("mousePressed");

}

public void mouseReleased(MouseEvent ev){

System.out.println("mouseReleased");

}

public void mouseEntered(MouseEvent ev){

System.out.println("mouseEntered");

}

public void mouseExited(MouseEvent ev){

System.out.println("mouseExited");

}

}

10) Panel

□Panel 자체는 그래픽 유저 인터페이스 요소가 아니다.

□그래픽 유저 인터페이스 요소들을 체계적으로 배열시킬 수 있다.

□Panel 클래스의 생성자는 오직 하나밖에 없다.

메소드 원형	public Panel()
기능	Panel 생성자
매개변수	없음
클래스	Panel

import java.applet.*;

import java.awt.*;

public class PanelTest extends Applet {

public void init() {

Panel panel = new Panel();   // Panel 만들기

panel.add("click1", new Button("click 1"));  // Panel에 버튼 추가

panel.add("click2", new Button("click 2"));

panel.add("click3", new Button("click 3"));

Choice choice = new Choice();   // 옵션 메뉴 만들기

choice.addItem("menu 1");

choice.addItem("menu 2");

choice.addItem("menu 3");

choice.addItem("menu 4");

choice.addItem("menu 5");

choice.select(1);

panel.add("choice menu", choice);    // Panel에 옵션 메뉴 추가

add("panel", panel);   // Panel을 애플릿에 추가

}

}

5. 그래픽 유저 인터페이스 요소를 배치하는 방법

□자바 AWT에 있는 Container들은(Panel, Frame, Window, Dialog) 모두 레이아웃 매니저

(Layout Manager)라는 것을 포함하고 있다.

□레이아웃 매니저는 Container 안에 들어오는 모든 요소들을 배치하는 작업을 한다.

1) 레이아웃 매니저를 설정하는 방법

메소드 원형	public void setLayout(LayoutManager mgr)
기능	레이아웃 매니저를 설정하는 메소드
매개변수	mgr : 레이아웃 매니저
클래스	Container

2) FlowLayout

□FlowLayout 클래스는 Panel 클래스에서 상속받는 모든 클래스의 기본 레이아웃 매니저이다.

□이 레이아웃 매니저는 그래픽 유저 인터페이스 요소를 좌측에서 우측으로 순서대로 배치시킨다.

메소드 원형	public FlowLayout()
기능	FlowLayout 클래스 생성자 ( 디폴트로 가운데 정렬 )
매개변수	없음
클래스	FlowLayout

메소드 원형	public FlowLayout(int align)
기능	FlowLayout 클래스 생성자
매개변수	align : 정렬 방법 (FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.RIGHT)
클래스	FlowLayout

메소드 원형	public FlowLayout(int align , int hgap, int vgap)
기능	FlowLayout 클래스 생성자
매개변수	align : 정렬방법 (FlowLayout.LEFT, FlowLayout.CENTER, FlowLayout.RIGHT) hgap : 수평 간격 vgap : 수직 간격
클래스	FlowLayout

[ 예제 ]

import java.applet.*;

import java.awt.*;

public class FlowLayoutTest extends Applet {

public void init() {

// 레이아웃 매니저 설정

setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));

// 버튼 추가

add("button1", new Button("Click me 1"));

add("button2", new Button("Click me 2"));

add("button3", new Button("Click me 3"));

add("button4", new Button("Click me 4"));

add("button5", new Button("Click me 5"));

add("button6", new Button("Click me 6"));

add("button7", new Button("Click me 7"));

add("button8", new Button("Click me 8"));

add("button9", new Button("Click me 9"));

add("button10", new Button("Click me 10"));

add("button11", new Button("Click me 11"));

add("button12", new Button("Click me 12"));

}

public boolean action(Event evt, Object what) {

// 이벤트를 발생시킨 버튼의 레이블을 가져온다.

showStatus(((Button)evt.target).getLabel());

return true;

}

}

3) BorderLayout

□BorderLayout 클래스는 Frame이나 Dialog 같은 Window들을 위한 레이아웃 매니저이다.

□이 레이아웃 매니저는 그래픽 유저 인터페이스 요소의 배치를 위해 영역을 5가지로 나누게

된다. 그래픽 유저 인터페이스 요소가 추가되면 North, South, East, West, Center에 베치된다.

□5개가 넘는 요소가 들어오면 모두 Center 영역으로 들어가게 된다.

□주의할 점 - 그래픽 유저 인터페이스 요소를 add 메소드를 통해 삽입할 때 매개변수에 반드시

North, South, East, West, Center 중의 하나를 넣어야 한다. 그렇지 않으면 애플릿 영역에

나타나지 않는다.

메소드 원형	public BorderLayout()
기능	BorderLayout 클래스 생성자
매개변수	없음
클래스	BorderLayout

메소드 원형	public BorderLayout(int hgap, int vgap)
기능	BorderLayout 클래스 생성자
매개변수	hgap : 수평 간격 vgap : 수직 간격
클래스	BorderLayout

[ 예제 ]

import java.applet.*;

import java.awt.*;

public class BorderLayoutTest extends Applet {

public void init() {

// BorderLayout 레이아웃 매니저 설정

setLayout(new BorderLayout(10, 10));

// 버튼 추가

add("North",  new Button("North"));

add("South",  new Button("South"));

add("Center", new Button("Center"));

add("West",  new Button("West"));

add("East",   new Button("East"));

}

public boolean action(Event evt, Object what) {

// 이벤트를 발생시킨 버튼의 레이블을 가져온다.

showStatus(((Button)evt.target).getLabel());

return true;

}

}

4) CardLayout

□CardLayout 클래스는 여러 개의 그래픽 유저 인터페이스 Panel을 만들어 놓고 원하는

것만 보이도록 하는 레이아웃 매니저이다.

메소드 원형	public CardLayout()
기능	CardLayout 클래스 생성자
매개변수	없음
클래스	CardLayout

메소드 원형	public CardLayout(int hgap, int vgap)
기능	CardLayout 클래스 생성자
매개변수	hgap : 수평 간격 vgap : 수직 간격
클래스	CardLayout

□CardLayout에 속해있는 여러 Panel중에서 특정 Panel이 애플릿 영역에 나타나도록

만들려면 - show 메소드를 사용한다.

메소드 원형	public void show(Container parent, String name)
기능	Panel을 선택하는 메소드
매개변수	parent : 여러 Panel을 포함하고 있는 Container name : 특정 Panel의 이름
클래스	CardLayout

□현재 CardLayout을 레이아웃 매니저로 사용하고 있는 Panel을 parent 매개변수에 넣고,

이 Panel에 속해 있는 여러 Panel중 하나의 이름을 name 매개변수에 넣는다.

그러면 name 매개변수에 지정된 Panel이 화면에 나타난다.

[ 예제 ]

import java.applet.*;

import java.awt.*;

import java.util.*;

public class CardLayoutTest extends Applet {

Panel card;

Choice choice;

String panel1string = "Input with button";

String panel2string = "Input with text field";

public void init() {

// 옵션 메뉴를 위한 Panel

Panel choicepanel = new Panel();

choice = new Choice();

choice.addItem(panel1string);

choice.addItem(panel2string);

choicepanel.add("choice", choice);  // 옵션 메뉴를 Panel에 추가

add("choice panel", choicepanel);  // 이 Panel을 애플릿에 추가

card = new Panel();              // CardLayout을 위한 Panel

card.setLayout(new CardLayout());  // 레이아웃 매니저를 CardLayout으로 설정

// card 패널에 들어갈 첫 번째 Panel 만들기

Panel panel1 = new Panel();

panel1.add("button1", new Button("Click me 1"));

panel1.add("button2", new Button("Click me 2"));

panel1.add("button3", new Button("Click me 3"));

// card 패널에 들어갈 두 번째 Panel 만들기

Panel panel2 = new Panel();

panel2.add("text field", new TextField(15));

// 첫 번째 Panel과 두 번째 Panel을 card에 삽입

card.add(panel1string, panel1);

card.add(panel2string, panel2);

add("card", card);   // card를 애플릿에 추가

}

public boolean action(Event evt, Object what) {

if(evt.target == choice) {

((CardLayout)card.getLayout()).show(card, (String)what);

}

return true;

}

}

5) GridLayout

□GridLayout 클래스는 그래픽 유저 인터페이스 요소들을 표와 같은 방식으로 배치하는

레이아웃 매니저이다.

□GridLayout 레이아웃 매니저의 줄 수와 칸 수를 지정하게 되면, 여기에 추가되는 모든

그래픽 유저 인터페이스 요소들은 이 형식에 맞게 배치된다.

□그래픽 유저 인터페이스 요소 간의 간격을 임의로 주고 싶으면 두 번째 생성자를

사용해야 한다.

메소드 원형	public GirdLayout(int rows, int cols)
기능	GridLayout 클래스 생성자
매개변수	rows : 줄 수 (0인 경우에는 임의의 숫자로 정해진다.) cols : 칸 수 (0인 경우에는 임의의 숫자로 정해진다.)
클래스	GridLayout

메소드 원형	public GirdLayout(int rows, int cols, int hgap, int vgap)
기능	GridLayout 클래스 생성자
매개변수	rows : 줄 수 (0인 경우에는 임의의 숫자로 정해진다.) cols : 칸 수 (0인 경우에는 임의의 숫자로 정해진다.) hgap : 수평 간격 vgap : 수직 간격
클래스	GridLayout

[ 예제 ]

import java.applet.*;

import java.awt.*;

import java.util.*;

public class GridLayoutTest extends Applet {

public void init() {

// GridLayout 레이아웃 매니저 설정

// 6줄 2칸, 가로 간격 20, 세로 간격 20

setLayout(new GridLayout(6, 2, 20, 20));

// 버튼 추가

add("button1", new Button("Click me 1"));

add("button2", new Button("Click me 2"));

add("button3", new Button("Click me 3"));

add("button4", new Button("Click me 4"));

add("button5", new Button("Click me 5"));

add("button6", new Button("Click me 6"));

add("button7", new Button("Click me 7"));

add("button8", new Button("Click me 8"));

add("button9", new Button("Click me 9"));

add("button10", new Button("Click me 10"));

add("button11", new Button("Click me 11"));

add("button12", new Button("Click me 12"));

}

public boolean action(Event evt, Object what) {

// 이벤트를 발생시킨 버튼의 레이블을 가져온다.

showStatus(((Button)evt.target).getLabel());

return true;

}

}

[ 예제 ] ScrollBar

import java.applet.Applet;

import java.awt.*;

public class Scroll extends Applet{

private Scrollbar upDown, leftRight;

private MyCanvas theCanvas;

private Panel thePanel;

public void init() {

upDown = new Scrollbar(Scrollbar.VERTICAL, 100, 0,0, 200);

leftRight = new Scrollbar(Scrollbar.HORIZONTAL, 100, 0, 0, 200);

theCanvas = new MyCanvas();

theCanvas.resize(200, 200);

theCanvas.setBackground(Color.yellow);

thePanel = new Panel();

setLayout(new BorderLayout());

thePanel.setLayout(new BorderLayout());

add("west", upDown);

thePanel.add("south", leftRight);

thePanel.add("center", theCanvas);

add("center", thePanel);

}

public boolean handleEvent(Event e) {

if(e.target instanceof Scrollbar) {

if(e.target == upDown)

theCanvas.setHeight(upDown.getValue());

else

theCanvas.setWidth(leftRight.getValue());

showStatus("e.arg is " + String.valueOf(e.arg));

theCanvas.repaint();

return true;

}

return super.handleEvent(e);

}

}

class MyCanvas extends Canvas {

private int width, height;

public MyCanvas() {

setWidth(100);

setHeight(100);

}

public void setWidth(int w) {

width = w;

}

public void setHeight(int h) {

height = h;

}

public void paint(Graphics g) {

g.setColor(Color.black);

g.drawOval(0, 0, width, height);

}

}

6) Menu

□메뉴 구성에 필요한 클래스

□Menu - 지정된 문자열로 메뉴를 생성한다.

□MenuItem - 지정된 문자열로 메뉴항목을 생성한다.

□MenuBar - 메뉴바를 생성한다.

□Menu

File, Help 메뉴와 같이 메뉴의 주요 항목을 만든다.

예) Menu m = new Menu("File");

□MenuItem

Open, Save, Exit와 같이 메뉴의 세부 항목을 만든다.

예) MenuItem mOpen = new MenuItem("Open");

MenuItem mSave = new MenuItem("Save");

MenuItem mExit = new MenuItem("Exit");

□MenuBar

만들어진 메뉴항목을 배치할 곳(메뉴바)을 만든다.

예) MenuBar bar = new MenuBar();

bar.add(m);

[ 예제 ] Menu

import java.awt.*;

public class ScratchPad extends Frame {

private TextArea t;

private Font f;

public ScratchPad()

{

super("ScratchPad Application");

t = new TextArea();

add("Center", t);

f = new Font("TimesRoman", Font.PLAIN, 12);

setFont(f);

MenuBar bar = new MenuBar();

Menu fontMenu = new Menu("Font");

fontMenu.add("Times Roman");

fontMenu.add("Courier");

fontMenu.add("Helvetica");

bar.add(fontMenu);

setMenuBar(bar);

resize(300, 200);

show();

}

public boolean handleEvent(Event e)

{

if(e.id == Event.WINDOW_DESTROY) {

hide();

dispose();

System.exit(0);

return true;

}

return super.handleEvent(e);

}

public boolean action(Event e, Object o)

{

if(e.target instanceof MenuItem) {

if(e.arg.equals("Times Roman"))

f = new Font("TimesRoman", Font.PLAIN, 12);

else if(e.arg.equals("Courier"))

f = new Font("Courier", Font.PLAIN, 12);

else

f = new Font("Helvetica", Font.PLAIN, 12);

t.setFont(f);

}

return true;

}

public static void main(String args[])

{

ScratchPad e;

e = new ScratchPad();

}

}

[ 예제 ] SubMenu

import java.awt.*;

public class Scratch2 extends Frame {

private TextArea t;

private Font f;

private Color c;

private CheckboxMenuItem x;

public Scratch2()

{

super("ScratchPad Application 2");

t = new TextArea();

add("Center", t);

f = new Font("TimesRoman", Font.PLAIN, 12);

t.setFont(f);

t.setForeground(Color.black);

MenuBar bar = new MenuBar();

Menu viewMenu = new Menu("View");

Menu fontMenu = new Menu("Font");

Menu colorMenu = new Menu("Color");

colorMenu.add(new MenuItem("Black"));

colorMenu.add(new MenuItem("Blue"));

fontMenu.add(new MenuItem("Times Roman"));

fontMenu.add(new MenuItem("Courier"));

viewMenu.add(fontMenu);

viewMenu.add(new MenuItem("-"));

viewMenu.add(colorMenu);

viewMenu.add(new MenuItem("-"));

x = new CheckboxMenuItem("Read-only");

viewMenu.add(x);

x.setState(false);

bar.add(viewMenu);

setMenuBar(bar);

resize(300, 200);

show();

}

public boolean handleEvent(Event e)

{

if(e.id == Event.WINDOW_DESTROY) {

hide();

dispose();

System.exit(0);

return true;

}

return super.handleEvent(e);

}

public boolean action(Event e, Object o)

{

if(e.target instanceof MenuItem) {

if(e.arg.equals("Times Roman"))

f = new Font("TimesRoman", Font.PLAIN, 12);

else if(e.arg.equals("Courier"))

f = new Font("Courier", Font.PLAIN, 12);

else if(e.arg.equals("Black"))

c = Color.black;

else if(e.arg.equals("Blue"))

c = Color.blue;

else if(e.arg.equals(x.getLabel()))

t.setEditable(!x.getState());

t.setForeground(c);

t.setFont(f);

}

return true;

}

public static void main(String args[])

{

Scratch2 e;

e = new Scratch2();

}

}

[ 예제 ] modeless Dialog boxes

import java.awt.*;

public class DialogBoxes extends Frame {

private About a;

private MenuItem item1, item2;

public DialogBoxes()

{

super("Dialog boxes");

MenuBar bar = new MenuBar();

Menu helpMenu = new Menu("Help");

Menu fileMenu = new Menu("File");

item1 = new MenuItem("About...");

item2 = new MenuItem("Exit");

helpMenu.add(item1);

fileMenu.add(item2);

bar.setHelpMenu(helpMenu);

bar.add(helpMenu);

bar.add(fileMenu);

setMenuBar(bar);

resize(200, 100);

show();

}

public static void main(String args[])

{

DialogBoxes d;

d = new DialogBoxes();

}

public boolean action(Event e, Object o)

{

if(e.target instanceof MenuItem)

if(e.arg.equals(item1.getLabel())) {

a = new About(this);

setItemState(false);

}

else

removeFrame();

return true;

}

public boolean handleEvent(Event e)

{

if(e.id == Event.WINDOW_DESTROY) {

removeFrame();

return true;

}

return super.handleEvent(e);

}

public void setItemState(boolean state)

{

if(state == true)

item1.enable();

else

item1.disable();

}

public void removeFrame()

{

hide();

dispose();

System.exit(0);

}

}

class About extends Dialog {

private Button b;

private Label l;

private Panel p, p2;

private DialogBoxes parent;

public About(Frame f)

{

super(f, "About", false);

parent = (DialogBoxes) f;

b = new Button("OK");

p = new Panel();

p2 = new Panel();

l = new Label("Java How To Program");

p.add(l);

p2.add(b);

add("Center", p);

add("South", p2);

resize(200, 100);

show();

}

public boolean handleEvent(Event e)

{

if(e.id == Event.WINDOW_DESTROY) {

removeDialog();

return true;

}

return super.handleEvent(e);

}

public boolean action(Event e, Object o)

{

if(e.target == b)

removeDialog();

return true;

}

public void removeDialog()

{

hide();

dispose();

parent.setItemState(true);

}

}

[ 예제 ] "Open" and "Save" Dialog boxes

import java.awt.*;

public class DialogBoxes2 extends Frame {

private MyFiles m;

private MenuItem item1, item2;

public DialogBoxes2()

{

super("Dialog boxes 2");

MenuBar bar = new MenuBar();

Menu fileMenu = new Menu("File");

item1 = new MenuItem("Open...");

item2 = new MenuItem("Save As...");

fileMenu.add(item1);

fileMenu.add(item2);

bar.add(fileMenu);

setMenuBar(bar);

resize(200, 100);

show();

}

public static void main(String args[])

{

DialogBoxes2 d = new DialogBoxes2();

}

public boolean action(Event e, Object o)

{

if(e.target instanceof MenuItem)

if(e.arg.equals(item1.getLabel()))

m = new MyFiles(this, FileDialog.LOAD);

else if(e.arg.equals(item2.getLabel()))

m = new MyFiles(this, FileDialog.SAVE);

return true;

}

public boolean handleEvent(Event e)

{

if(e.id == Event.WINDOW_DESTROY) {

hide();

dispose();

System.exit(0);

return true;

}

return super.handleEvent(e);

}

}

class MyFiles extends FileDialog {

public MyFiles(Frame f, int type)

{

super(f, (type == FileDialog.LOAD ? "Open " : "Save ") + "Dialog", type);

resize(400, 250);

show();

}

}

Ⅹ. 자바 애플릿의 응용

1. 애니메이션

1) 애니메이션의 원리

□간단한 애니메이션 코드

while(true) {

① 현재 프레임 그리기

② 잠시 정지

③ 다음 프레임 읽기

}

※ 잠시 정지하는 이유?

□시스템이 모든 이미지들을 한 번에 보여주게 되면 이것을 모두 처리할 수 없기 때문에

한 이미지밖에 나타나지 않는다.

※ 각 이미지를 그리는 시간 간격

□간격이 너무 적은 경우에는 시스템이 이미지를 모두 처리할 수 없게 된다.

□간격이 너무 큰 경우에는 애니메이션이 깜박거리게 된다.

2) 스레드 사용

□자바 애플릿에서 이미지를 그리는 메소드는 paint이다.

public void paint(Graphics g) {

while(true) {

① 현재 프레임 그리기

② 잠시 정지

③ 다음 프레임 읽기

}

}

□이 경우 하나의 애플릿 속에서 프로세스를 계속 붙잡아 놓고 있기 때문에 다른 자바

애플릿들은 거의 실행되지 못한다.

□왜냐하면, 자바 애플릿의 경우 Applet 클래스에서 상속받고 있기 때문에 다른

클래스로부터 상속받을 수 없다.

□자바 애플릿은 Runnable 인터페이스를 사용해야 한다.

□스레드를 사용하여 애니메이션을 구현하는 경우, 스레드의 run 메소드에서 애니메이션

코드를 수행시켜야 한다.

□run 메소드는 스레드에 의해 호출되는 메시지이기 때문에 다른 애플릿이 있는 경우에도

아무런 문제가 발생하지 않는다.

public void run() {

while(true) {

repaint();          // paint 메소드 호출 - 현재 프레임 그리기

Thread.sleep(150); // 잠시 정지

toNextFrame();    // 다음 프레임으로 이동

}

}

3) 이미지 그리기 - update 메소드 이용

□paint - 처음 이미지가 만들어질 때나 이미지가 손상되어 복구시킬 때 자동으로

호출되는 메소드

□update  - 이미지를 갱신시킬 때 사용하는 메소드

□repaint - 내부에서 update 메소드를 호출하여 이미지를 다시 그릴 때 사용하는 메소드

이때 update는 내부에서 화면을 지우고 paint 메소드를 호출하여 메소드를

부르게 된다.

[ 예제 ]

import java.applet.*;

import java.awt.*;

public class Animation extends Applet implements Runnable {

Thread thread;

Image frames[];       // 이미지를 읽을 변수

int frame = 0;        // 현재 그리는 프레임 번호

public void init() {

thread = new Thread(this);

frames = new Image[10];   // 이미지 읽어들이기

for(int i = 1; i <= 10; i++) {

// duke 디렉토리에 있는 T1.gif, T2.gif, ... T10.gif 이미지 읽기

frames[i-1] = getImage(getCodeBase(), "duke/T"+i+".gif");

}

}

public void start() {

if(thread.isAlive()) {   // 스레드가 살아 있는지 체크

thread.resume();   // 스레드 다시 시작, 다른 페이지에 갔다가 다시 돌아온 경우

}

else {

thread.start();     // 스레드 처음 시작

}

}

public void stop() {

thread.suspend();      // 스레드 정지

}

public void destroy() {

thread.stop();          // 스레드 소멸

}

public void run() {

while(true) {

repaint();                // paint 메소드 호출

try {                    // 잠시 정지

thread.sleep(150);

} catch(InterruptedException e) {

}

frame++;

}

}

public void paint(Graphics g) {

update(g);

}

public void update(Graphics g) {

Dimension d = size();

g.setColor(getBackground());       // 기존 이미지 지우기

g.fillRect(0, 0, d.width, d.height);

// 이미지 그리기. frame%10 연산의 결과는 frame을 10으로 나눈 나머지

g.drawImage(frames[frame % 10], 0, 0, this);

}

}

4) 이미지 그리기 - update 메소드 이용

□복잡한 이미지를 애니메이션 해주는 대부분의 자바 애플릿에서는 더블 버퍼링(Double

Buffering)을 사용하고 있다.

□image_dimension - 이미지 영역의 크기를 관리하는 변수

□image_area - 이미지 영역 변수

□image_graphics - 이미지 영역에 이미지를 그려 넣기 위한 메소드들을 가지고 있는

Graphics 클래스 변수

※ 더블 버퍼링(Double Buffering)

먼저 스크린이 아닌 메모리에 잡아놓은 이미지 영역에 한 프레임을 그려 넣은 후,

이 이미지를 한꺼번에 화면으로 옮겨 놓는 것을 말한다.

import java.applet.*;

import java.awt.*;

public class DoubleAnimation extends Applet implements Runnable {

Thread thread;

Image frames[];                // 이미지를 읽을 변수

int frame = 0;                 // 현재 그리는 프레임 번호

Dimension image_dimension;   // 이미지 영역 크기

Image image_area;             // 이미지 영역

Graphics image_graphics;      // 이미지 영역을 위한 Graphics 클래스 변수

public void init() {

thread = new Thread(this);

frames = new Image[10];   // 이미지 읽어들이기

for(int i = 1; i <= 10; i++) {

// duke 디렉토리에 있는 T1.gif, T2.gif, ... T10.gif 이미지 읽기

frames[i-1] = getImage(getCodeBase(), "duke/T"+i+".gif");

}

}

public void start() {

if(thread.isAlive()) {    // 스레드가 살아 있는지 체크

thread.resume();    // 스레드 다시 시작, 다른 페이지에 갔다가 다시 돌아온 경우

}

else {

thread.start();   // 스레드 처음 시작

}

}

public void stop() {

thread.suspend();   // 스레드 정지

}

public void destroy() {

thread.stop();   // 스레드 소멸

}

public void run() {

while(true) {

repaint();   // paint 메소드 호출

try {   // 잠시 정지

thread.sleep(150);

} catch(InterruptedException e) {

}

frame++;

}

}

public void paint(Graphics g) {

update(g);

}

public void update(Graphics g) {

Dimension d = size();

// 이미지 영역 변수 초기화

if( (image_graphics == null) || (d.width != image_dimension.width) ||

(d.height != image_dimension.height) ) {

image_dimension = d;   // 이미지 크기 설정

image_area = createImage(d.width, d.height);   // 이미지 만들기

image_graphics = image_area.getGraphics();   // 이미지의 Graphics 객체 알아내기

}

image_graphics.setColor(getBackground());   // 기존 이미지 지우기

image_graphics.fillRect(0, 0, d.width, d.height);

// 이미지 영역에 듀크 그리기.

// frame%10 연산의 결과는 frame을 10으로 나눈 나머지

image_graphics.drawImage(frames[frame % 10], 0, 0, this);

g.drawImage(image_area, 0, 0, null);   // 이미지 영역을 화면으로 옮기기

}

}

2. 시계

□시계 애플릿을 만들 때 사용되는 클래스 - Date클래스 (java.util.Date)

[ 시간을 알아내는 메소드 ]
getMonth	월(月)
getDate	일(日)
getHours	시(時)
getMinutes	분(分)
getSeconds	초(秒)

[ 예제 ]

import java.applet.*;

import java.awt.*;

import java.util.Date;     // Date 클래스를 사용하기 위해

public class Clock extends Applet implements Runnable {

Thread thread;       // 스레드 변수

Font font;            // 새로운 글자체를 위해

public void init() {

thread = new Thread(this);

font = new Font("Helvetica", Font.BOLD, 24);

}

public void start() {

if(thread.isAlive()) {    // 스레드가 살아 있는지 체크

thread.resume();     // 스레드 다시 시작,  다른 페이지에 갔다가 다시 돌아온 경우

}

else {

thread.start();   // 스레드 처음 시작

}

}

public void stop() {

thread.suspend();   // 스레드 정지

}

public void destroy() {

thread.stop();   // 스레드 소멸

}

public void run() {

while(true) {

repaint();   // paint 메소드 호출

try {   // 잠시 정지

thread.sleep(1000);   // 시간이 갱신되는 간격 지정

} catch(InterruptedException e) {

}

}

}

public void paint(Graphics g) {

Date now = new Date();   // 현재 시간 알아내기

g.setFont(font);   // 글자체 바꾸기

// 시간 출력

g.drawString(now.getHours()+":"+now.getMinutes()+":"+now.getSeconds(), 15, 35);

}

}

3. 게시판

□게시판 자바 애플릿은 메시지가 오른쪽에서 왼쪽으로 스크롤된다.

□각 프레임마다 새로운 x좌표값을 구하는 부분

int x = 0;

public void setLocation() {

x = x - 5;

if(x < -textlength) {

x = size().width;  // 애플릿 가로 크기

}

}

□이 코드는 x좌표값이 초기에는 애플릿 너비만큼 가지고 있다가, 점점 5씩 줄어든다.

그러다가 문자열 제일 마지막 부분까지 출력이 이루어 지면, 다시 처음으로 돌아간다.

[ 예제 ]

import java.applet.*;

import java.awt.*;

import java.util.Date;   // Date 클래스를 사용하기 위해

public class TextScroll extends Applet implements Runnable {

Thread thread;    // 스레드 변수

Font font;         // 새로운 글자체를 위해

boolean stopscroll = false;    // 마우스 클릭에 의해 스크롤 on/off

String inputstring;            // 매개변수로 입력된 텍스트

int offset = 40;               // 문자열 위치 조정

int textlength, textheight;     // 문자열 너비와 높이

int x = 0;                     // 스크롤되는 텍스트의 x 좌표

public void init() {

thread = new Thread(this);

font = new Font("Helvetica", Font.BOLD, 24);

inputstring = getParameter("Text");

}

public void start() {

if(thread.isAlive()) {   // 스레드가 살아 있는지 체크

thread.resume();   // 스레드 다시 시작, 다른 페이지에 갔다가 다시 돌아온 경우

}

else {

thread.start();   // 스레드 처음 시작

}

}

public void stop() {

thread.suspend();   // 스레드 정지

}

public void destroy() {

thread.stop();   // 스레드 소멸

}

public void run() {

while(true) {

setLocation();   // 문자열 출력 위치 재조정

repaint();       // paint 메소드 호출

try {           // 잠시 정지

thread.sleep(100);

} catch(InterruptedException e) {

}

}

}

public void paint(Graphics g) {

g.setFont(font);   // 글자체 바꾸기

FontMetrics fm = g.getFontMetrics();   // 글자체 정보 알아내기

textlength = fm.stringWidth(inputstring);

textheight = fm.getHeight();

g.drawString(inputstring, x, (offset+textheight)/2);   // 문자열 출력

}

public void setLocation() {   // 문자열 출력 위치 재조정

x = x - 5;

if(x < -textlength) {

x = size().width;   // 애플릿 가로 크기

}

}

public boolean mouseDown(Event evt, int x, int y) {   // 마우스 클릭에 의해 스크롤 on/off

if(stopscroll) {   // 스크롤이 정지되어 있었다면

thread.resume();

stopscroll = false;

}

else {   // 스크롤이 동작 중에 있었다면

thread.suspend();

stopscroll = true;

}

return true;

}

}

□. 자바, 자바스크립트, 플러그인의 연결

1. 자바, 자바스크립트, 플러그인의 연결

□ 라이브커넥트(LiveConnect)

□라이브커넥트를 이용하면 자바스크립트와 자바애플릿을 연결할 수 있고, 자바스크립트와

플러그인을 연결할 수 있게 된다.

□라이브커넥트를 통해 구체적으로 할 수 있는 작업

□자바스크립트에서 자바의 변수, 메소드, 클래스, 패키지에 직접 접근할 수 있다.

□자바스크립트에서 자바 애플릿이나 플러그인을 직접 제어할 수 있다.

□자바에서 자바스크립트의 메소드의 특성에 직접 접근할 수 있다.

※라이브커넥트는 넷스케이프 내비게이터 3.0 이상에서 사용할 수 있다.

2. 자바스크립트에서 자바와 플러그인에 접근하기

□ 자바스크립트에서 자바 메소드 호출하기

□자바스크립트에서는 자바의 패키지와 클래스를 모두 Package라는 객체를 통하여

접근하게 된다.

[Package.]packageName.className.methodName

□자바의 System.out.println() 메소드를 자바스크립트에서 사용하려면

Packages.java.lang.System.out.println() 이라고 해야 한다.

□자바스크립트에서 자바의 메소드를 접근하려면

var System = java.lang.System

System.out.println("자바스크립트에서 자바 메소드를 사용한 예")

□자바의 생성자 함수를 이용하여 객체 하나를 새로 만들 수도 있다.

var mydate = new java.util.Date()

□ 자바스크립트에서 자바 애플릿 제어하기

□자바스크립트는 자바 애플릿에서 public으로 선언된 모든 변수, 메소드, 애플릿의 특성값

에 접근할 수 있다.

□HTML 문서에 있는 자바 애플릿에 접근하는 방법

<APPLET> 택의 NAME 속성을 사용하면 된다.

<APPLET CODE = TextScroll.class NAME=scrollApplet WIDTH=300 HEIGHT=50>

<PARAM NAME="Text" VALUE="Welcome to Java">

</APPLET>

□자바스크립트에서 자바 애플릿을 참조하려면

document.scrollApplet

import java.applet.*;

import java.awt.*;

import java.util.Date;   // Date 클래스를 사용하기 위해

public class TextScroll2 extends Applet implements Runnable {

Thread thread;        // 스레드 변수

Font font;            // 새로운 글자체를 위해

String inputstring;   // 매개변수로 입력된 텍스트

int offset = 40;      // 문자열 위치 조정

int textlength, textheight;       // 문자열 너비와 높이

int x = 0;       // 스크롤되는 텍스트의 x 좌표

public void init() {

thread = new Thread(this);

font = new Font("Helvetica", Font.BOLD, 24);

inputstring = getParameter("Text");

}

public void start() {

if(thread.isAlive()) {   // 스레드가 살아 있는지 체크

thread.resume();   // 스레드 다시 시작, 다른 페이지에 갔다가 다시 돌아온 경우

}

else {

thread.start();   // 스레드 처음 시작

}

}

public void stop() {

thread.suspend();   // 스레드 정지

}

public void destroy() {

thread.stop();   // 스레드 소멸

}

public void run() {

while(true) {

setLocation();   // 문자열 출력 위치 재조정

repaint();   // paint 메소드 호출

try {  // 잠시 정지

thread.sleep(100);

} catch(InterruptedException e) {

}

}

}

public void paint(Graphics g) {

g.setFont(font);   // 글자체 바꾸기

FontMetrics fm = g.getFontMetrics();   // 글자체 정보 알아내기

textlength = fm.stringWidth(inputstring);

textheight = fm.getHeight();

g.drawString(inputstring, x, (offset+textheight)/2);   // 문자열 출력

}

public void setLocation() {   // 문자열 출력 위치 재조정

x = x - 5;

if(x < -textlength) {

x = size().width;   // 애플릿 가로 크기

}

}

}

[ HTML ]

<HTML>

<HEAD>

<TITLE>The TextScroll Demo</TITLE>

</HEAD>

<BODY>

<APPLET CODE=TextScroll2.class NAME=scrollApplet WIDTH=300 HEIGHT=50>

<PARAM NAME="Text" VALUE="Welcome to Java">

</APPLET>

<FORM>

<INPUT TYPE = "button" VALUE="start" onClick="document.scrollApplet.start()">

<INPUT TYPE = "button" VALUE="stop" onClick="document.scrollApplet.stop()">

</FORM>

</BODY>

</HTML>

□ 자바스크립트에서 플러그인 접근하기

□HTML 문서 속에 있는 각 플러그인들은 document 객체에 있는 embeds 라는 특성을

통해 접근할 수 있다.

□AVI 플러그인이 HTML문서에 삽입되어 있을 경우

<EMBED SRC=avifile.avi WIDTH=320 HEIGHT=200>

3. 자바에서 자바스크립트에 접근하기

□자바 애플릿에서 자바스크립트의 메소드와 특성에 접근하기 위해서는 먼저 자바 프로그램

상단에 넷스케이프의 javascript라는 패키지를 포함시켜야 한다.

import netscape.javascript;

※netscape.javascript 패키지에는 자바스크립트에 접근하기 위한 JSObject 클래스와

JSException 예외 처리 객체가 정의되어 있다.

□HTML 문서를 만들 때 자바 애플릿이 자바스크립트의 메소드와 특성을 사용할 수 있도록

하려면 <APPLET> 택에 MAYSCRIPT라는 속성을 추가시켜야만 한다.

<APPLET CODE=Clock.class NAME=clockApplet WIDTH=300 HEIGHT=50 MAYSCRIPT>

</APPLET>

□자바에서 자바스크립트 객체와 특성에 접근하기

□먼저 자바스크립트의 윈도우 객체를 구해야 한다.

□이를 위해 JSObject 클래스는 getWindow()라는 메소드를 제공하고 있다.

□자바스크립트의 윈도우 객체를 알아내는 방법

public void init() {

JSObject win = JSObject.getWindow(this);

}

□자바스크립트의 객체와 특성에 접근하는 방법

JSObject 클래스에는 getMember()라는 메소드가 정의되어 있다.

□document.myForm이라는 입력 양식에 접근하려면

public void init() {

JSObject win = JSObject.getWindow(this);

JSObject doc = (JSObject)win.getMember("document");

JSObject my_form = (JSObject)doc.getMember("myForm");

}

□이 입력 양식 안에 있는 test라는 체크상자가 체크되어 있는지를 살펴보려면

public void init() {

win = JSObject.getWindow(this);

JSObject doc = (JSObject)win.getMember("document");

JSObject my_form = (JSObject)doc.getMember("myForm");

JSObject check = (JSObject)my_form.getMember("test");

Boolean  isChecked = (Boolean)check.getMember("checked");

}

□자바에서 자바스크립트 메소드 호출하기

□자바에서 자바스크립트의 메소드를 호출하려면

JSObject 클래스에 정의된 call()과 eval() 메소드를 사용한다.

JSObject.getWindow().call("methodName", arguments)

JSObject.getWindow().eval("expression")

□public void init() {

JSObject win = JSObject.getWindow(this);

}

public boolean mouseDown(Event evt, int x, int y) {

win.call("alert(\"Hello world !\");");

return true;

}

□public void init() {

JSObject win = JSObject.getWindow(this);

}

public boolean mouseDown(Event evt, int x, int y) {

win.eval("alert(\"Hello world !\");");

return true;

}

▣ 자바 네트워크 프로그래밍

□URL(Uniform Resource Locator)

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

프로토콜에는 다음과 같은 것이 있다.

file       : 하드 디스크에 있는 파일

ftp         : FTP 서버에 연결

http        : 웹서버에 연결

gopher   : gopher 서버에 연결

news    : usenet 뉴스 그룹에 연결

telnet          : 텔넷 서비스를 이용

wais          : wais 서버에 연결

□URLButton.java

import java.awt.*;

import java.net.*;

import java.applet.Applet;

public class URLButton extends Applet {

URL url = null;

String title = null;

public void init() {

String urlString = null;

setLayout(new GridLayout(1,1));

title = getParameter("title");

if(title == null)

title = "URLButton";

urlString = getParameter("url");

if(urlString == null)

urlString = "http://";

try{

url = new URL(urlString);

}catch(MalformedURLException e) {

System.out.println("Invalid URL : " + urlString);

}

Button site = new Button(title);

add(site);

resize(100, 60);

}

public boolean action(Event e, Object arg) {

if(e.target instanceof Button) {

getAppletContext().showDocument(url);

}

return false;

}

}

□URLButton.html

<html>

<body bgcolor="#ffffff">

<applet code = URLButton.class width=100 height=50>

<param name=title value="WebZine">

<param name=url value="http://203.253.23.3/special.shtml">

</applet>

<applet code = URLButton.class width=100 height=50>

<param name=title value="BBS">

<param name=url value="http://203.253.24.55/~bbs/">

</applet>

<applet code = URLButton.class width=100 height=50>

<param name=title value="WebNews">

<param name=url value="http://203.253.23.3/">

</applet>

<applet code = URLButton.class width=100 height=50>

<param name=title value="내외컴퓨터">

<param name=url value="http://www.nwcom.co.kr">

</applet>

</html>

□실행 예

□MalformedURLException   지정된 URL이 유효하지 않음을 나타낸다.

□getAppletContext

□애플릿이 나타날 브라우저를 표현한다.

□애플릿에 대한 AppletContext를 구한다.

□showDocument

public void showDocument( URL url );

public void showDocument( URL url, String target );

□브라우저에 새로운 문서를 연다.

□parameter

□url          브라우저가 오픈할 문서를 가리킴

값	의미
"_self" "_parent" "_top" "_blank"	애플릿이 삽입된 것과 동일한 프레임 애플릿이 삽입된 프레임의 부모 프레임 애플릿이 나타날 최상위 수준의 윈도우 새로운 최상위 수준의 이름 없는 프레임

□target    나타낼 새로운 문서

□소켓

일반적으로 C 언어를 이용해서 네트워크 프로그램을 작성하는 경우, 프로그램 절차는

다음 그림과 같다.

□서버 프로그램은 소켓을 생성하고, bind()를 이용해서 소켓과 어드레스 및 포트를 결합시킨다.

□listen() 함수를 호출하고, bind()함수를 호출해서 클라이언트로부터 요청이 올 때까지

블록되어서 기다린다.

□bind() 함수는 클라이언트로부터 요청이 오면 클라이언트와 통신할 수 있는 소켓을

만들어서 리턴한다.

□리턴된 소켓을 통해서 서버와 클라이언트는 read()/write() 함수를 이용해서 통신할 수 있다.

□클라이언트에서는 소켓을 생성하고, connect() 함수를 통해서 서버에 연결을 시도한다.

□connect()를 호출하면, 서버에서는 accept() 함수가 실행된다. 서버와 연결되면 소켓을

통해 read/write를 할 수 있다

Server                                    Client

□서버 소켓

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

□서버프로그램을 만들 때는 소켓을 만들고, bind()하고 listen()하는 일들이 항상 반복된다.

□자바에서는 이러한 반복 작업을 제거하기 위해서 서버 소켓(ServerSocket)이라는

클래스를 만들었다.

□프로그래머는 서버 소켓을 만들어서 accept() 메소드를 호출한다.

□accept() 메소드는 클라이언트로부터 connection이 요청될 때까지 블록되었다가, 요청이

들어오면 클라이언트와 통신할 수 있는 소켓을 생성해서 리턴해준다.

□서버는 리턴된 소켓을 이용해서 클라이언트와 통신할 수 있다.

□클라이언트에서도 마찬가지로 반복되는 작업을 제거하기 위해, connect()라는 함수를

호출할 필요가 없도록 소켓(Socket)이라는 클래스를 만들었다.

□따라서, 클라이언트에서는 소켓을 만들고, 소켓을 이용해서 만든 I/O 스트림을 이용해서

서버와 통신할 수 있다.

서버                                 클라이언트

▣ 네트워크와 소켓

□클라이언트-서버 어플리케이션

□연결 중심 프로토콜

□클라이언트와 서버 사이에 전용의 링크가 설정된다.

□두 프로세스 사이에서 전달되는 메시지는 정확한 순서대로 전달되는 것을 보장 받을 수 있다.

□대부분의 네트워킹 어플리케이션은 신뢰할 수 있는 통신 프로토콜이 요구되므로

연결 중심적이다.

□예)TCP/IP의 TCP(Transfer Control Protocol)

□비연결성 프로토콜

□클라이언트와 서버사이에 전용선이 설정되지 않는다.

□클라이언트와 서버는 메시지를 데이터그램 패킷(Datagram Packet)형태로 보내며,

각각에는 목적지의 주소가 들어있다.

□네트워크에서는 패킷이 들어있는 목적지의 주소를 해독한 후 이 패킷을 목적지로 보낸다.

□각 패킷에는 핵심이 되는 메시지 외에도 송신자와 수신자에 대한 정보를 가지고 있다.

□패킷의 전달을 보장받을 수 없다.

□메시지의 전달 순서가 중요하지 않은 곳에서 사용될 수 있다.

□예) 타임 서버 어플리케이션

TCP/IP의 UDP

□인터넷 주소(Internet Address)

□인터넷 ID - 인터넷에서의 네트워크를 지정한 것

□Subnet ID - 지역 네트워크(서브넷)를 표현한것

□Host ID - 서브넷에서 호스트에 대한 식별자

Internet ID	Subnet ID	Host ID
203.248	255	2

□왜 소켓이 필요한가?

□어플리케이션과 네트워크 사이의 인터페이스를 위해 소켓이 필요하다.

□클라이언트-서버 어플리케이션에서 대부분의 통신은 점-대-점(Point-to-Point),

즉 통신의 끝점에 어플리케이션(클라이언트 또는 서버)이 존재하는 형태이다.

□소켓은 단일 시스템 혹은 서로  다른 시스템에 존재하는 프로세스간 통신을 위해 끝점

역할을 한다.

□어플리케이션은 상대방에게 메시지를 보냄으로써 통신을 한다.

□이 메시지는 네트워크에서 연속된 패킷으로 전달된다.

□어플리케이션은 필요할 때 운영체제에게 소켓을 생성해달라는 요청을 한다.

□시스템은 어플리케이션이 새로이 생성된 소켓을 참조하기 위해 사용할 수 있는

정수(Small Integer) 형태의 소켓 식별자를 리턴한다.

□클래스와 인터페이스 설명

클래스/인터페이스	설명
InetAddress ServerSocket Socket DatagramSocket DatagramPacket SocketImpl SocketImplFactory	인터넷 주소 표현 서버 소켓. 소켓 작업을 위한 실제 구현에는 SocketImpl 클래스를 사용한다. 클라이언트 소켓. 소켓 작업을 위한 실제 구현에는 SocketImpl 클래스를 사용한다. 비연결성 프로토콜을 구현한 데이터그램 소켓. 전달되는 데이터와 목적지 호스트에 대한 상세 정보를 포함하고 있는 데이터그램 패킷 실제 구현을 위해서는 꼭 서브클래스화되어야 한다. ServerSocket과 Socket 클래스에 대한 실제 소켓 구현. 이 인터페이스에 정의되어 있는 실제 SocketImpl 인스턴스를 생성하기 위한 인터페이스

▣ Client/Server - Stream Socket 사용

□Server - 클라이언트로부터의 접속을 받아들이고, 클라이언트로 데이터(String)를 보내고,

접속을 종료한다.

□Client - 서버로부터 보내진 정보를 읽고, 그 정보를 화면에 출력한다.

□ServerSocket

public ServerSocket(int port) throws IOException

public ServerSocket(int port, int lisn_time) throws IOException

□Parameter

□port        서버가 결합될 로컬 포트 번호

□lisn_time        서버가 포트에서 접속을 기다릴 시간

□ Server

import java.io.*;

import java.net.*;

import java.awt.*;

public class Server extends Frame{

TextArea display;

public Server()

{

super("Server");

display = new TextArea(20, 5);

add("Center", display);

resize(300, 150);

show();

}

public void runServer()

{

ServerSocket server;

Socket connection;

OutputStream output;

try {

server = new ServerSocket(5000, 100);

connection = server.accept();  // 클라이언트의 접속을 받아들인다.

display.setText("Connection received...\n");

display.appendText("Sending data...\n");

output = connection.getOutputStream(); // 클라이언트로 데이터를 보낸다.

String s = new String("Connection successful\n");

for(int i = 0; i < s.length(); i++)

output.write( (int) s.charAt(i) );

display.appendText("Transmission complete. Closing socket.\n");

connection.close();     // 접속을 종료한다.

} catch(IOException e){

e.printStackTrace();

}

}

public boolean handleEvent(Event e)

{

if(e.id == Event.WINDOW_DESTROY){

hide();

dispose();

System.exit(0);

}

return super.handleEvent(e);

}

public static void main(String args[])

{

Server s = new Server();

s.runServer();

}

}

□Socket

public Socket(String host, int port) throws IOException;

public Socket(String host, int port, boolean sock_type) throws IOException;

public Socket(InetAddress inet, int port) throws IOException;

public Socket(InetAddress inet, int port, boolean sock_type) throws IOException;

□Parameter

□host          접속할 호스트 머신 이름

□port            서버가 결합될 로컬 포트 번호

□sock_type  데이터그램 소켓인지 스트림 소켓인지를 나타내는 값

□inet        접속할 호스트 머신의 InetAddress

□getLocalHost()  로컬 호스트의 InetAddress를 구함

□ Client

import java.io.*;

import java.net.*;

import java.awt.*;

public class Client extends Frame{

TextArea display;

public Client()

{

super("Client");

display = new TextArea(20, 20);

add("Center", display);

resize(300, 150);

show();

}

public void runClient()

{

Socket client;

InputStream input;

try{

client = new Socket(InetAddress.getLocalHost(),5000);

display.appendText("Created Socket\n");

input = client.getInputStream();  // 서버로부터 데이터를 받는다.

display.appendText("Created input Stream\n");

display.appendText("The text from the server is:\n\t");

char c;

// 서버로부터 받은 데이터를 개행이 될 때까지 읽어들인후, 문자로 형변환 한다.

while((c = (char) input.read()) != '\n')

display.appendText(String.valueOf(c));  // 문자를 문자열로 출력한다.

display.appendText("\n");

client.close();   // 클라이언트를 종료한다.

} catch(IOException e){

e.printStackTrace();

}

}

public boolean handleEvent(Event e)

{

if(e.id == Event.WINDOW_DESTROY){

hide();

dispose();

System.exit(0);

}

return super.handleEvent(e);

}

public static void main(String args[])

{

Client c = new Client();

c.runClient();

}

}

▣ Client/Server - DatagramSocket/DatagramPacket

□DatagramSocket

public DatagramSocket() throws SocketException;

public DatagramSocket(int port) throws SocketException;

□비연결성 프로토콜을 사용해 구현된 클라이언트-서버 어플리케이션에서 소켓을 형성한다.

□클라이언트는 데이터그램 패킷을 생성할 때, 포트 번호를 지정함으로써 서버에 패킷을 보낸다.

□이 클래스는 패킷을 처리하기 위한 send와 receive메소드를 가지고 있다.

□Parameter

□port       데이터그램 소켓이 결합된 로컬 포트 번호

□DatagramPacket

public DatagramPacket(byte[] buffer, int length);

public DatagramPacket(byte[] buffer, int length, InetAddress dest, int port);

□비연결성 프로토콜을 사용해 구현된 클라이언트-서버 어플리케이션에서 패킷을 형성한다.

□패킷은 DatagramSocket 클래스의 send 메소드를 사용하여 target에 전달된다.

□DatagramSocket 클래스의 receive 메소드를 사용하여 패킷을 받아들인다.

□Parameter

□buffer            데이터를 포함하는 바이트 배열

□length        데이터 버퍼의 길이

□inetAddress       데이터그램을 받아들이는 IP 주소

□port          데이터그램을 받아들이는 포트 번호

□ Server

import java.io.*;

import java.net.*;

import java.awt.*;

public class Server extends Frame{

TextArea display;

DatagramPacket sendPacket, receivePacket;

DatagramSocket sendSocket, receiveSocket;

public Server()

{

super("Server");

display = new TextArea(20, 10);

add("Center", display);

resize(300, 150);

show();

try{

sendSocket = new DatagramSocket();

receiveSocket = new DatagramSocket(5000);

} catch(SocketException se){

se.printStackTrace();

System.exit(1);

}

}

public void waitForPackets()

{

while(true){

try{

byte array[] = new byte[100];     // 패킷 설정

receivePacket = new DatagramPacket(array, array.length);

receiveSocket.receive(receivePacket);          // 패킷을 기다린다.

display.appendText("\nPacket received:" +     // 패킷 프로세스

"\nFrom host: " + receivePacket.getAddress() +

"\nHost port: " + receivePacket.getPort() +

"\nLength: " + receivePacket.getLength() +

"\nContaining:\n\t");

byte data[] = receivePacket.getData();

String received = new String(data, 0);

display.appendText(received);

// 클라이언트에서 받은 패킷의 에코(echo) 정보를 다시 클라이언트로 돌려보낸다.

display.appendText("\n\nEcho data to client...");

sendPacket = new DatagramPacket(data, data.length,

receivePacket.getAddress(), 5001);

sendSocket.send(sendPacket);

display.appendText("Packet sent\n");

} catch(IOException e){

display.appendText(e.toString() + "\n");

e.printStackTrace();

}

}

}

public boolean handleEvent(Event e)

{

if(e.id == Event.WINDOW_DESTROY){

hide();

dispose();

System.exit(0);

}

return super.handleEvent(e);

}

public static void main(String args[])

{

Server s = new Server();

s.waitForPackets();

}

}

□ Client

import java.io.*;

import java.net.*;

import java.awt.*;

public class Client extends Frame{

TextField enter;

TextArea display;

Panel enterPanel;

Label enterLabel;

DatagramPacket sendPacket, receivePacket;

DatagramSocket sendSocket, receiveSocket;

public Client()

{

super("Client");

enterPanel = new Panel();

enterLabel = new Label("Enter message:");

enter = new TextField(20);

enterPanel.add(enterLabel);

enterPanel.add(enter);

add("North", enterPanel);

display = new TextArea(20, 10);

add("Center", display);

resize(400, 300);

show();

try{

sendSocket = new DatagramSocket();

receiveSocket = new DatagramSocket(5001);

} catch(SocketException se){

se.printStackTrace();

System.exit(1);

}

}

public void waitForPackets()

{

while(true){

try{

byte array[] = new byte[100];   // 패킷 설정

receivePacket = new DatagramPacket(array, array.length);

receiveSocket.receive(receivePacket);               // 패킷을 기다린다.

display.appendText("\nPacket received:" +          // 패킷 프로세스

"\nFrom host: " + receivePacket.getAddress() +

"\nHost port: " + receivePacket.getPort() +

"\nLength: " + receivePacket.getLength() +

"\nContaining:\n\t");

byte data[] = receivePacket.getData();

String received = new String(data, 0);

display.appendText(received);

} catch(IOException e){

display.appendText(e.toString() + "\n");

e.printStackTrace();

}

}

}

public boolean handleEvent(Event e)

{

if(e.id == Event.WINDOW_DESTROY){

hide();

dispose();

System.exit(0);

}

return super.handleEvent(e);

}

public boolean action(Event evt, Object o)

{

try{

display.appendText("\nSending packet containing: " + o.toString() + "\n");

String s = o.toString();

byte data[] = new byte[100];

s.getBytes(0, s.length(), data, 0);

sendPacket = new DatagramPacket(data, s.length(),

InetAddress.getLocalHost(), 5000);

sendSocket.send(sendPacket);

display.appendText("Packet sent\n");

} catch(IOException e){

display.appendText(e.toString() + "\n");

e.printStackTrace();

}

return true;

}

public static void main(String args[])

{

Client c = new Client();

c.waitForPackets();

}

}

▣ 원격 호스트를 수행하는 네트웍 어플리케이션

□원리

□알고 있는 포트를 인터넷 소켓으로 열려면 텔넷 포트처럼 원격 호스트의 수행을 알려야

한다.

□호스트 이름을 갖고 텍스트 필드를 사용해야 한다.

□소켓을 열어야 한다.

□방법

□java.net 패키지는 인터넷 소켓을 다루는 클래스를 포함하며, 이 클래스를 Socket이라

부른다.

□생성자는 호스트 이름과 포트 번호를 할당하기 위해 소켓을 정의한다.

□호스트 이름은 string 형식이고, 포트 번호는 int 형태로 소켓을 열어 인스턴스를 선언한

다음 소켓 생성자를 사용해 만든다.

import java.awt.*;

import java.io.*;

import java.net.*;

/* 어플리케이션 클래스 */

public class Ping extends Frame implements Runnable{

Socket socket;           /* 원격 호스트가 살아있는지 결정하는 Socket의 인스턴스 */

TextField addrField;  /* 호스트 이름이 들어갈 텍스트 필드 */

Button stopButton;       /* 정지 버튼 */

TextArea content;          /* 원격 호스트의 상태를 출력하는 텍스트 영역 */

Thread thread;       /* 소켓의 활동으로부터 사용자의 활동을 분리하는 데 사용하는 스레드 */

int insertPos;              /* 텍스트 영역에서의 삽입 위치 */

/* 사용자 인터페이스를 생성하는 생성자 */

public Ping()

{

int i;

setTitle("Ping");

setLayout(new BorderLayout());

addrField = new TextField("", 20);

stopButton = new Button("Stop");

content = new TextArea("", 24, 80);

content.setEditable(false);

insertPos = 0;

Panel p = new Panel();

p.setLayout(new FlowLayout());

p.add(addrField);

p.add(stopButton);

add("North", p);

add("Center", content);

thread = new Thread(this);

resize(400, 300);

show();

}

/* 액션 이벤트를 다룬다.

* 키가 눌려지는 상태에 따라 소켓 스레드를 열고

* 정지 버튼이 눌려지면 소켓 스레드가 정지하는 상태를 반환

* @param evt - 이벤트 객체

* @param obj - 이벤트가 받는 객체

*/

public boolean action(Event evt, Object obj)

{

if(evt.target == addrField) {

thread.stop();

thread = new Thread(this);

thread.start();

return true;

}

if(evt.target == stopButton) {

thread.stop();

}

return false;

}

/* 소켓을 여는 스레드

* 텔넷 포트(23) 열기를 시도한다.

*/

public void run()

{

String name;

name = addrField.getText();

try{

try{

socket = new Socket(name, 23);

} catch(UnknownHostException e) {

insertString(name + " : unknown host\n");

return;

}

}catch(IOException e2){

insertString("Unable to open socket\n");

return;

}

insertString(name + " is alive\n");

try{

socket.close();

}catch(IOException e2) {

insertString("IOException closing socket\n");

return;

}

}

/* 텍스트 영역 끝에 텍스트를 더하는 데 필요한 메소드

* @param s - 더할 텍스트

*/

void insertString(String s)

{

content.insertText(s, insertPos);

insertPos += s.length();

}

/* 어플리케이션의 시작점

* @param args - 명령행 인자

*/

public static void main(String args[])

{

new Ping();

}

}

□insertText(String, int)

public void insertText(String ins_text, int index);

public abstract void insertText(String txt, int pos);

□Parameter

□ins_text       지정된 인덱스에 삽입될 텍스트

□txt            TextArea 객체에 삽입될 텍스트

□index/pos      새로운 텍스트가 삽입될 위치

▣ HTTP로 데이터 받기

□원리

□텍스트 필드 안에 URL이 들어가고, 편집할 수 없는 텍스트 영역 안에 URL로부터 받아온

문서를 나타내어야 한다.

□방법

□URL 연결을 URL 클래스 안에 있는 openConnection() 메소드에 의해 만들어진다.

□URLConnection과 연결된 입력 스트림은 GetInputStream() 메소드에 의해 검색된다.

( 데이터는 DataInputStream 클래스 안에 있는 메소드를 사용해서 데이터 입력 스트림을

읽어들인다.)

□분리된 스레드는 사용자 입력에 의해 하나의 스트림으로 활동하게 되므로 데이터를

비동기적으로 읽을 수 있다.

□사용자가 Stop 버튼을 누르면 스트림 활동이 종결된다.

import java.awt.*;

import java.io.*;

import java.net.*;

/* 어플리케이션 클래스 */

public class ViewSource extends Frame implements Runnable{

String s;

URL u;

URLConnection uc;         /* 연결될 URL */

TextField location;     /* URL이 입력될 TextField */

TextArea content;      /* 문장의 소스를 보여주는 텍스트 영역 */

Thread thread;         /* 문서를 읽기 위해 사용되는 분리된 스레드 */

int insertPos = 0;             /* 내용 영역의 삽입 위치 */

/* 사용자 인터페이스를 생성하는 생성자 */

public ViewSource()

{

int i;

setTitle("View Source");

setLayout(new BorderLayout());

location = new TextField("", 20);

content = new TextArea("", 24, 80);

content.setEditable(false);

Panel p = new Panel();

p.setLayout(new FlowLayout());

p.add(location);

p.add(new Button("Stop"));

add("North", p);

add("Center", content);

thread = new Thread(this);

resize(400, 300);

show();

}

/* 키가 눌려지는 것과 정지 버튼

* @param e - 이벤트 객체

*/

public boolean handleEvent(Event e)

{

if((e.target instanceof TextField) && (e.id == Event.ACTION_EVENT)){

thread.stop();

content.replaceText("", 0, insertPos);

thread = new Thread(this);

thread.start();

return true;

}

if((e.target instanceof Button) && (e.id == Event.ACTION_EVENT)){

thread.stop();

return true;

}

return false;

}

/* URL로부터 데이터를 읽고 내용 영역에 표시하는 메소드 */

public void run()

{

try{

u = new URL(location.getText());

}catch(MalformedURLException e) {

}

try{

uc = u.openConnection();

}catch(IOException e){

}

DataInputStream in = null;

try{

in = new DataInputStream(new BufferedInputStream(uc.getInputStream()));

}catch(IOException e){

}

String line;

insertPos = 0;

try{

while((line = in.readLine()) != null)

{

line += "\n";

content.insertText(line, insertPos);

insertPos += line.length();

}

}catch(IOException e){

System.out.println("Error in reading file");

}

}

/* 어플리케이션이 시작되는 곳

* @param args - 명령행 인자

*/

public static void main(String args[])

{

new ViewSource();

}

}

□replaceText(String, int, int)

public void replaceText(String new_text, int start, int end);

□parameter

□new_text   지정된 위치에 텍스트를 교체할 새로운 텍스트

□start        새로운 텍스트를 교체할 곳의 시작 위치

□end               새로운 텍스트를 교체할 곳의 마지막 위치

□openConnection()           URL 객체에 의해 참조되는 객체로의 연결을 연다.

□getInputStream()

□클라이언트 소켓에 대한 InputStream을 리턴

□클라이언트는 이 스트림을 사용하여 서버로부터 데이터를 받는다.