상세 컨텐츠

본문 제목

애플릿 강좌

프로그래밍/JAVA

by 라제폰 2009. 1. 30. 17:56

본문

 

1. JAVA의 첫걸음

  • Java는 1995년에 처음 개발된 Internet Programming Language이다.
    Sun Micro Systems Co. 개발된 언어 a
    http://java.sun.com/
  • Java는 처음(1991)에는 C 언어를 모델로 개발 시작
    개발 그룹 코드명 a Green (제임스 코슬링) 후에 JavaSoft사로 Sun의 자회사로 독립
    (
    http://www.javasoft.com )
  • 가전제품의 자동화 구현 측면( 인공지능, 퍼지 등 )에서 어떠한 CPU칩에서나 작동할 수 있고 ,또한 Network로 연결하여 통제할 수 있는 프로그램 언어를 만든다는 취지로 시작했으며,그 명칭은Ock라고 불렀음.. Ock는 결국 실패를 했지만 플랫폼 독립적인 기능이 인터넷의 기능과 조화를 이룬다는 점을 밝혀져 Java라는 이름으로 개칭되면서 Internet 프로그램으로서 자리를 잡게 된다.
  • NetWork환경 구현에 약하다는 C언어의 약점을 극복하기 위해 새로운 개념의 프로그램 개발 ( Internet환경도 NetWork 환경임을 알면 자바가 왜 인터넷 프로그래밍 언어로 자리를 빨리 잡게 되었는지 알 수 있다. )
  • Java는 1995년 JDK1.0.x버전을 발표하며 본격적인 자바 개발환경을 지원.
  • Java는 1997년에 새로운 모습을 갖추게 된다. ( JDK 1.1.x 버전의 발표 ) 보다 완전한 프로그랭 언어의 모습을 갖춤
    JDK 1.1x 속에 내장된 자바 해석기가 기존의 해석기보다 2배의 속도 자랑
  • Java 이름의 유래
    별다른 의미를 가지는 용어는 아니다.
    1. 자바라는 이름이 정보의 정글 속의 보배처럼 느껴지지 안는가!!
    2. 커피 이름 '자바'에서 유래 (잠들지 않는 인터넷과 의미가 상통)

Java 종류와 공통점과 차이점

 

종 류

JAVA

Java Script

*Script Language

Compile(X)

WebBrowser

*탐재

*해석

*실행

WebBrowser기능향상

WebBrowser Control

Java Applet

Appletviewer

전용 테스팅

*Compile(O)

*같은 Class 사용

멀티미디어적이고 동적인 홈페이지 제작

Java Application

Java 해석기로 실행

독립실행프로그램

독립적인 플랫폼독립적인 프로그램 개발

 

  • Java의 특징 ( 장점 / 매력 )

1. Java는 객체지향형 프로그래밍 ( OOP )
a 다른 프로그램 언어와 달리 만들어질 때부터 OOP 프로그램으로 개발

2. Java는 플랫폼 독립적이다.--기존의 프로그램 언어와 달리 운영체제에 관계없이 동작한다.
a Java Code가 Compile되면 ByteCode로 변화
a 각 시스템에 탐재된 자바해석기 ( Java 가상기계 ( JVM ) )에 의해 동작

3. Java는 이식성이 우수하다.

4. Java는 동적 / 분산적이다.--동적
a 프로그램이 실행하고 있는 중에 동적으로 Class를 탐재, 실현시킬 수 있다. 분산적
a 다양한 고급 네트웍킹을 지원.
a Java의 Internet Programming언어의 입지를 굳힌다.
a 필요한 부분을 Internet Program 실행 중에 네트위크 상으로 다운로드 받아 실행

5. 단순성
a 프로그램은 배우기가 쉽다. ( 만들 때부터 쉽도록 제작 ) java는 C 언어와 달리 Pointer가 없다.자동으로 사용하지 않는 메모리 제거
a Garbage Collection Memory 관리가 쉬워짐.
a 사용하지 않는 객체를 가비지로 간주하여 시스템의 유지기에 가비지를 모아서 자동으로 삭제함. ( Garbage Collector )

6. 견고성 - java는 신뢰성이 높은 , 즉 견고한 소프트웨어를 작성하도록 제작
일부분의 다른 언어의 버그를 자동으로 해결예외 상황 처리에 대한 보강이 잘 되어 있다.

7. 보안성
a 자신의 사용 메모리 이외의 메모리에 접근하지 못한다. (메모리에 대한 직접적 접근을 방지 )
a 자바해석기가 신뢰성이 확보되지 않은 코드를 탐재할 때 항상 바이트 코드를 검사함
a 모래상자 모델( Sand Box Model ) a 신용이 확인되지 않은 코드는 자바환경전체에 아무런 해약이 미치지 못하는 '모래상자'에 의치 시킨다.
a Local System에 대한 전면적인 접근을 금지.
a 디지털 시그너쳐 ( 전자사인 ) 을 사용.

8. 고성능 a 네이티브 ( native ) 코드 사용

9. 멀티 스레드 a java는 멀티 스레드 프로그래밍 언어( 다중작업 언어 )
a java.lang.Thread Class : Thread의 시작 / 정지 / 우선권 지정
a Animation 프로그램제작 코드는 거의 Thread를 사용


2. Java 프로그래밍 환경 구축                       

  • 다운로드 받기

1. http://java.sun.com/products/로 접속하여 jdk를 다운로드 한다.

            
▶  화일다운로드 살펴보기

2. 설치프로그램으로 JDK가 설치된다. -- C디렉토리 아래 JDK가 설치됨
3. Autoexec.bat파일을 편집 -- Path Line에 C:\JDK1.2.1\bin을 삽입한다.
4. Editor선택 -- 설치 (UltraEdit-32 ).

  • JDK설치된 디렉토리 분석

1. 7BIN디렉토리 --프로그램제작에 필요한 실행 파일들이 모여있음.

java.exe

자바 컴파일러

appletviewer.exe

applet프로그램 테스트기

java.exe

자바 인터프리터(해석기  application 프로그램 동작기)

javadoc.exe

자바 문서 생성기 a자바 소스 코드에서 문서를 HTML 만들어 낸다


2. 'LIB디렉토리--Class들을 모아두는 Library 디렉토리
'classes.zip, tclasses.zip : 자바는 일반프로그램들과는 달리 클래스들을 압축하여 그 용량을 줄이고 있다. 자바 예약어 중에 import를 사용하여 필요한 클래스만을 축출하여 사용하는 특성을 가지고 있다.

3. DEMO디렉토리 -- 애플릿 프로그램의 예제들을 모아두어 애플릿을 짜는 사람들에게 도움을 주는 디렉토리.


Java에서 사용하는 예약어들                        

** Java Compiler 예약을하고사용하는 단어이기 때문에 사용자 정의로 선언해서는 되는 단어들이다.
**
Java 아직도 개발이 완전히 끝난 프로그램 언어가 아닌 관계로 미리 정의되어 있는 ' '들이 눈에 띈다.


Key Word


의 미

‘abstract

추상적인 Method 나 Class를 정의한다.

‘boolean

boolean형(1비트)

‘break

루프나 switch명령문의 프로세싱을 료한다 (분리한다. )

‘byte

8bit ( 1byte ) 정수형 자료형

‘case

Swich 명령문 내에서 선택 사항을 지시한다.

‘catch

예외 상황을 트랩한다.

‘class

클래스형의 정의한다.

‘const

미래의 사용을 위해 예약되어 있다.( 현재 Java에서는 사용되지 않음 )

‘continue

다음 반복을 사용하여 루프의 실행을 계속한다.

‘default

다른 경우가 일치하지 않을 때 switch명령문 내의 디폴트 선택 사항을 지시한다.

‘do

do / while루프를 시작한다.

‘double

8byte 실수형 자료형

‘else

if 명령문의 대안 절을 지정한다.

‘extends

코드가 정의하고 있는 클래스의 모 클래스를 정의한다
즉, 확장(상속)받을 때 사용하는 예약어

‘final

변수가 상수이며, 클래스가 서브 클래스가 될 수 없으며, 메소드가 오버라이드될 수 없음을 지정한다.

‘finally

Java가 항상 실행하는 try 블록의 일부를 지정한다.

‘float

4byte 실수형 자료형

‘for

for ( 연속적인 ) 루프를 시작한다.

‘future

미래의 사용을 위해 예약되어 있다.( 현재 Java에서는 사용되지 않음 )

‘generic

미래의 사용을 위해 예약되어 있다.( 현재 Java에서는 사용되지 않음 )

‘goto

미래의 사용을 위해 예약되어 있다.( 현재 Java에서는 사용되지 않음 )

‘if

조건 명령문을 지정한다.

‘implements

클래스가 명령된 인터페이스나 인터페이스들을 구현한다 ( 인터페이스의 메소드를 정의한다.)
특수한 클래스( interface )를 사용하여 복수 상속을 받기 위한 사용하는 예약어. ( Java는 기본적으로 단일 상속을 원칙으로 함 )

‘import

프로그램이 사용하는 패키지( 클래스 라이브러리 )를 식별한다.

‘inner

미래의 사용을 위해 예약되어 있다.( 현재 Java에서는 사용되지 않음 )

‘instanceof

지정된 객체가 클래스와 인스턴스일 경우 true를 리턴한다. 연산자 취급

‘int

4byte의 정수형 자료형

' interface

클래스가 구현할 수 있는 Method로 추상적인 유형을 정의한다.

long

8byte 정수형 자료형.

native

MethodC 내의 어디에선가 또는 플랫폼에 의존하는 다른 언어에서 구현되었음을 지정한다.

new

객체나 배열을 할당한다.

null

임의 객체를 참조하지 않는 변수( C에서처럼 0과 동일한 것으로 간주하지 않음 )를 지정한다.

operator

미래의 사용을 위해 예약되어 있다.( 현재 Java에서는 사용되지 않음 )

outer

미래의 사용을 위해 예약되어 있다.( 현재 Java에서는 사용되지 않음 )

package

클래스 컬렉션( 라이브러리 )

private

클래스의 멤버만이 객체에 Access할 수 있음을 지시하는 수정자

protected

클래스, 서브 클래스, 그 외에 패키지 내에서만이 객체에 Access할 수 있음을 지시하는 수정자

public

모든 클래스의 Method가 객체에 Access할 수 있음을 지시하는 수정자

rest

미래의 사용을 위해 예약되어 있다.( 현재 Java에서는 사용되지 않음 )

return

함수로부터 제어를 호출기로 리턴한다.

short

2byte 정수형 자료형

static

클래스의 객체가 아닌 클래스에게 객체의 고유성을 지시해 주는 수정자

super

슈퍼 클래스 객체나 구성자를 참조한다.

switch

하나 이상의 case명령문과 함께 사용되어 추가 명령문을 작성한다.

synchronized

클래스나 코드의 한 섹션을 잠궈 Thread에 의한 동시적인 수정을 예방한다.

this

현재의 객체의 인스턴스를 참소한다.

throw

프로그램에게 예외 상황이 일어났다는 신호를 지시해 준다.

throws

Method가 던질 수 있는( throw ) 예외 상황을 나열한다.

transient

미래의 사용을 위해 예약되어 있다.( 현재 Java에서는 사용되지 않음 )

try

예외 상황을 트랩하는 코드 블록을 지정한다.

var

미래의 사용을 위해 예약되어 있다.( 현재 Java에서는 사용되지 않음 )

void

메소드가 값을 리턴하지 않음을 지정한다.

volatile

변수가 비동기적으로 변화므로 컴파일러가 변수 사용의 최적화를 시도해선 안됨을 지정한다.

while

while루프의 시작을 지정한다.


4. APPLET TAG에 대하여                        

* HTML의 Applet 명령은 HTML문서에 JAVA 애플릿을 탑재하는 역할을 수행한다.

* APPLET 태그는 또한 HTML문서와 JAVA APPLET과의 DATA교환을 가능케 한다.

완전한 문법>

옵션의 이름

옵션의 기능 설명

Applet tag 들어가는 옵션들

codebase = codebaseURL

선택적인 옵션으로서 애플릿의 베이스 URL 명시한다. 설정되지 않으면 HTML문서의 URL 명시한다.

code = applet file

필수 옵션으로서 Applet 컴파일된 Applet class파일을 지정한다.

width = 픽셀

height = 높이 픽셀

필수 옵션, 애플릿 표시 영역에 대한 초기 , 높이 픽셀 값을 정한다. 애플릿이 생성하는 창이나 다이알로그는 치지 않는다.

alt = 다른 텍스트

선택적 옵션, browser APPLET TAG 인식하지만 어떤 이유에서든지 applet 실행되지 않을 , 표시하는 문자열.

name = applet instance 이름

선택적 옵션, 같은 페이지에 있는 애플릿들이 서로 교신하기 위행 사용하는 애플릿 인스턴스의 이름을 정한다.

align = 정렬방식

선택적 옵션. Applet 정렬방식을 설정한다. IMG TAG에서의 정렬방식과 동일하다.

vspace = 픽셀

hspace = 픽셀

선택적 옵션 applet의 위 아래, 양 옆의 공간을 정한다

name = applet 속성1

value =

애플릿 마다의 속성을 정할 때. 사용한다.

애플릿은 이 값을 getParmeter() method로 읽어들인다.

 

 


5. Java 코딩 맛보기


**Java 코딩 편집기 선택
   
 ASCII편집기(UltraEdit, 메모장, 도스 편집기, 위드페드, 일반 위드 등등)라면 무엇이든 가능

**예제 1>applet 맛보기

1. 아래 코딩을 저장 시 반드시 파일의 이름을 최상위 클래스의 이름과 동일해야 한다.( HelloWorld.java)

     

2. javac는 파일이름의 클래스 코드를 찾아 컴파일함.

** javac ( 자바 컴파일러 )에 의해 HelloWorld.class로 만듦 --HTML문서에 탐재
**Java는 대/소문자를 철저히 구분하는 언어이다.
**Java의 import keyword는 package(클래스 라이브러리 군)의 경로명을 연결하는 예약어
**Java의 기본 Package 들 ( JDK1.0.2기준 )

java.lang

java program 필수적인 Class

기본 package import하지 않아도 컴파일러가 자동으로 import시킴

java.io

java 입출력에 관계하는 Class

java.applet

Java applet program 관계하는 Class

java.awt

window형태에 관계하는 또는 멀티미디어에 관계하는 Class

java.net

Java Networking 관련된 Class

java.util

java프로그램에서 유용하게 쓰이는 기타의 Class

java.awt.image

java image processing 관련된 Class

java.awt.peer

기계 종속적인 윈도 시스템을 기계 독립적인 윈도 시스템과 연결해주는 Class


**Command(주석표시)
-----Compiler가 주석 표시된 부분은 처리하지 않음
-----// : 행 주석 a 한행을 주석 표시
-----/*……….*/ : 여러 라인 주석 표시 --사이에 있는 모든 내용을 주석으로 처리
-----/** …… */ : 특수 주석 표시 -- 기능은 위의 것과 동일
특수 기능--javadoc.exe에 의해 도움말 HTML문서를 자동으로 작성

3. Java Applet은 반드시 HTML문서 위에 실어야 하므로 HTML 문서를 작성해야 한다.

예> HelloWorld.html

참조)) applet 태그 설명 부분 참조


4. 테스트는 'appletviewer HelloWorld.html' 또는 Web Browser로 한다.


**예제2>application 맛보기

1. Edit 프로그램에서 아래와 같이 작성한후 ExApp.java로 저장한다.

 

2. 작성된코드를 컴파일 시킨다.
    javac ExApp.java

3. ExApp.class가 생기면 자바 인터프리터를 이용해 자바 어플리케이션을 동작시킨다.
    java ExApp

 

** Java Application에는 반드시 main() method가 있어야 한다. Application은 독립적으로 수행되는 Java Program을 만들기 때문에 '프로그램의 시작과 흐름 그리고 끝을 관리하는 Method가 반드시 필요한 것이다.

** Java는 메모리 상에 문자열의 끝으로 표시되는 '\0'표시가 사용하지 않기 때문에 문자열을 만나면 내부적으로 String 자료형을 만들어 처리한다.

** System.out.println() Method는 C언어의 printf()함수와 동일하게 콘솔창에 명령을 출력한다.


6. 변수 & 상수 & 자료형        

  • Program은 동작하기 위해서는 Memory에 동작할 수 있는 공간을 확보해야 한다. 바로 이러한 공간을 변수, 상수라고 부르며 이것은 모든 Programming Language가 공통으로 사용하는 것이다.
  • 변수 a Memory상의 공간으로서 프로그램이 동작하는 동안 값이 수시로 변경될 수 있는 공간.
    상수 a Memory상의 공간으로서 프로그램이 동작하는 동안 값이 절대로 바뀌지 않는 공간.
  • 표현 형식
    1.A ~ Z or a ~ z
    2.0 ~ 9
    3. _(밑줄)
    ** 첫자는 숫자로 쓰지 않음
  • 변수 선언 문법 구조
    DataType + VariableName
  • 흔히, 변수는 상수를 담을 수 있는 공간을 표현된다. 또한 상수는 Compiler만 이해하는 숫자형 Data 자료
    를 상수화 한다는 것은 프로그래머에게 쉽게 알 수 있도록 만들어 주는 역할도 수행한다.
    예)) Color Class는 숫자로 색을 표현하는데 0 - black, 255 - white 등
  • JAVA가 사용하는 자료형                        

기본 자료형

데이터 형설 명크 기
byte정 수1byte
stort정 수2byte
int정 수4byte
long정 수8byte
float실수(단정도)4byte
double실수(배정도)8byte
char문자(유니코드)2byte
booleantrue 또는 false1bit


레퍼런스 자료형(참조 자료형)
Class
배열(Array)
interface
C언어에서 사용되는 '구조체' 나 '공용체'는 사용되지 않는다.


7. 연산자
---연산, 계산을 하는 심벌이다.

  • 연산자 종류
    이름연 산 자
    산술 연산자+ - * / %
    부호 연산자+ -
    증감 연산자++ - -
    비교 연산자< <= > >= == !=
    논리 연산자 && || !
    대입 연산자= += -= *= /= %= &= |= ^= <<= >>= >>>=
    조건 연산자? :
    비트 연산자>> >>> << & | ~
    밖의 연산자(type) new [ ] . (param) instanceof
  • 연산자 우선 순위 a연산자가 동시에 사용될 연산 순서
  • [ ] . (PARAM) expr++ expr--
    • 높음

    • 낮음

    ++expr --expr +expr -expr ~ !
    new (type)
    * / %
    + -
    << >>
    < > <= >== instanceof
    == !=
    &
    ^
    |
    &&
    ||
    ?:
    = += -= *= /= %= ^= &= |= <<= >>= >>>=
    • 논리 연산자 연산 방식
    피연산자 1연산자피연산자 2결과값
    true&&truetrue
    true&&falsefalse
    false&&truefalse
    false&&falsefalse
    피연산자 1연산자피연산자 2결과값
    true||truetrue
    true||falsetrue
    false||truetrue
    false||falsefalse
    피연산자연산자결과값
    true!false
    false!true
    • 비트 연산자
    연산자 피연산자 개수
    >>오른쪽으로 비트단위로 이동2
    >>>오른쪽으로 비트단위로 이동 ( Unsigned )2
    <<왼쪽으로트단위로 이동2
    &비트 AND2
    |비트 OR2
    ^비트 XOR2
    ~비트 NOT1

     

    • 예제표
    왼쪽 피연산자의 이진수 표기결과값
    (이진수)
    결과값
    (십진수)
    10<<10000 10100001 010020
    10>>10000 10100000 01015
    10>>>10000 10100000 01015
    -10<<11111 01101110 1100-20
    -10>>11111 01101111 1011-5
    -10>>>11111 01100111 10112147483643

     

    예제 Shift연산자 Application (Shift.java)
    -----------------------------------------------------------------------------------------------
    class Shift
    {
             public static void main(String arg[])
             {
                      int x, Result;
                      x = 10;
                      System.out.println('x: ' + x + ' , (Binary : 0000 0000 0000 0000 0000 0000 0000 1010)\n');
                      Result = x >> 1;
                      System.out.println('x >> 1 : ' + Result +' , (Binary : 0000 0000 0000 0000 0000 0000 0000 0101)');
                      x = 10;
                      Result = x >>> 1;
                      System.out.println('x >>>1 : ' + Result +' , (Binary : 0000 0000 0000 0000 0000 0000 0000 0101)');
                      x = 10;
                      Result = x << 1;
                      System.out.println('x <<1 : ' + Result +' , (Binary : 0000 0000 0000 0000 0000 0000 0001 0100)\n');
                      x = -10;
                      System.out.println('x :1 : ' + x +' , (Binary :1111 1111 1111 1111 1111 1111 1111 0110)\n');
                      Result = x >> 1;
                      System.out.println('x >> 1 : ' + Result +' , (Binary : 1111 1111 1111 1111 1111 1111 1111 1011)');
                      x = -10;
                      Result = x >>> 1;
                      System.out.println('x >>> 1 : ' + Result +' , (Binary : 0111 1111 1111 1111 1111 1111 1111 1011)');
                      x = -10;
                      Result = x << 1;
                      System.out.println('x << 1 : ' + Result +' , (Binary : 1111 1111 1111 1111 1111 1111 1111 1100)');
             }
    }
    ------------------------------------------------------------------------------------------------

    피연산자 1연산자피연산자 2결과값
    1&11
    1&00
    0&10
    0&00
    피연산자 1연산자피연산자 2결과값
    1|11
    1|01
    0|11
    0|00
    피연산자 1연산자피연산자 2결과값
    1^10
    1^01
    0^11
    0^00
    피연산자연산자결과값
    1~ 0
    0~ 1

     

    • 예제
    13 & 1213 | 1213 ^ 12
    1101

    1100

    ----------

    1100

    1101

    1100

    -----------

    1101

    1101

    1100

    -----------

    0001


    8. 제어문         
    ---프로그램의 흐름을 제어하는 문법
    ---조건문, 반복문 등이 있다.

    • 조건문 ( if문, 조건 연산자, switch문 )
    종 류 문법 구조
    if if ( 연산식 또는 조건식 )
    {
    수행하고자 하는 문장; ………… }
    if ( 연산식 또는 조건식 )
    {
    수행하고자 하는 문장; ………… }
    else
    {
    수행하고자 하는 문장; ………… }
    if ( 연산식1 또는 조건식 )
    {
    수행하고자 하는 문장; ………… }
    else if( 연산식2 )
    {
    수행하고자 하는 문장; ………… }
    else
    {
    수행하고자 하는 문장; ………… }
    조건 연산자의 이용조건식 ?참일 경우의 결과값 : 거짓일 경우의 결과값
    switch switch (테스트할 연산식 )
    {
    case
    첫번째 : 수행하고자 하는 문장들 ; break;
    case
    번째 :수행하고자 하는 문장들; break;
    ………….;
    default:
    수행하고자 하는 문장들;break;
    }
    • 날짜수를 구하는 프로그램 ( Month.java )
      if …else if 문 사용.

    달의 날수를 구하는 예제
    --------------------------------------------------------------------------------------
    class Month
    {
             public static void main(String arg[])
             {
                      int month, num_of_day;
                      month = 5;
                      if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
                      {
                               num_of_day = 31;
                      }
                      else if ( (month == 4) || (month == 6) || (month == 9) || (month == 11))
                      {
                               num_of_day = 30;
                      }
                      else if ( month == 2 )
                      {
                               num_of_day = 28;
                      }
                      else
                      num_of_day = -1;
                      System.out.println('Month : ' + month + ' , Day : ' + num_of_day);
             }
    }
    --------------------------------------------------------------------------------------
    날짜를 구하는 프로그램
    --------------------------------------------------------------------------------------
    class Month2
    {
            public static void main(String arg[])
            {
                    int month, num_of_day;
                    month = 5;
                    switch (month)
                    {
                            case 1:
                            case 3:
                            case 5:
                            case 7:
                            case 8:
                            case 10:
                            case 12: num_of_day = 31; break;
                            case 4:
                            case 6:
                            case 9:
                            case 11: num_of_day = 30; break;
                            case 2: num_of_day = 28; break;
                            default : num_of_day = -1;
                    }
                    System.out.println('Month : ' + month + ' , Day : ' + num_of_day);
            }
    }
    --------------------------------------------------------------------------------------
    국어점수 등급 출력 프로그램(Score.java)

    --------------------------------------------------------------------------------------
    class Score
    {
           public static void main(String arg[])
           {
                  int kok_jum;
                  char grade;
                  kok_jum = 88;
                  switch(kok_jum/10)
                  {
                         case 10: case 9: grade = 'A'; break;
                         case 8: grade = 'B'; break;
                         case 7: grade = 'C'; break;
                         case 6: grade = 'D'; break;
                         case 5: case 4: case 3:case 2: case 1:case 0: grade = 'F'; break;
                         default : grade = 'X'; break;
                  }
           System.out.println('KOK : ' + kok_jum + ' , Grade : ' + grade);
           }
    }

    --------------------------------------------------------------------------------------

     

    • 반복문(for 문, while 문 do …. while 문 등)
      --프로그램의 흐름을 반복하게 함


      문법 구조
      for for( 초기화; 조건식; 증감식 )
      {
      반복하고자 하는 문장들;
      }
      while while ( 조건식 )
      {
      반복하고자 하는 문장들;
      }
      do while do {
      반복하고자 하는 문장들;
      }
      while (
      조건식 )
    • while 문과 do … while 문의 차이점
      두 종류 모두 조건식에 맞을 동안 명령을 반복하지만 while문은 조건에 만족하지 않을 경우 한번도 실행하지 않을 수도 있지만 do…while문의 경우에는 무조건 한번은 구현하는 차이점을 가지고 있다.



    9.Point/Dimention/Graphics에 대하여

    • Point Class

    이 Class.는 2차원 점의 X좌표와 Y좌표를 홀드한다.
    java.awt Package에 포함되어있음.

    public class Point extends Object implements Serializable

    생성자
    public Point ( );
    public Point ( Point p );
    public Point ( int x, int y );

    멤버 변수
    public int x;
    public int y;

    멤버 Method
    public Point getLocation ( );
    public void move ( ); //좌표를 정함
    public void translate ( int x, int y ); //지정된 값을 좌표에 추가한다.
    public void setLocation ( Point p );
    public void setLocation ( int x, int y );

    • Dimension Class에 대하여

      이 Class는 폭과 높이를 기술하는 두개의 public instance 변수를 갖는다.
      width필드와 height필드는 직접 조작 될 수 있다.
      java.awt Package에 포함되어 있음.

      public class Dimension extends Object implements Serializable

      생성자
      public Dimension ( );
      public Dimension ( Dimension d );
      public Dimension ( int width, int height );

      멤버 변수
      public int height;
      public int width;

      멤버 Method
      public Dimension getSize ( );
      public void setSize ( Dimension d );
      public void setSize ( int width, int height );
    • Graphics Class에 대하여

      그림을 그리는데 사용되는 모든 것이 정의 되어있는 Class.
      java.awt package에 포함되어 있음
      public class Graphics extends Object a Object Class에서 상속

      1. 생성자
      prodected Graphics ( );

      2. 주요 Method
      public abstract void drawRect ( int x, int y, int width, int height );
      public abstract void drawRoundRect ( int x, int y, int width, int heigtht, int arcWidth, int arcHeight )
      public abstract void drawOval ( int x, int y, int width, int height );
      public abstract void drawArc ( int x, int y, int width, int height, int startAngle, int endAngle );
      public abstract void drawPolygon ( int[] xPoints, int[] yPoints, int nPoints );
      public void drawPolygon ( Polygon p );
      public abstract void drawPolyline ( int[] xPoints, int[] yPoints, int nPoints );
      public abstract void drawLine ( int x1, int y1, int x2, int y2 );
      public abstract void drawString ( String str, int x, int y );

      public abstract void fillRect ( int x, int y, int width, int height );
      public abstract void fillRoundRect ( int x, int y, int width, int heigtht, int arcWidth, int arcHeight )
      public abstract void fillOval ( int x, int y, int width, int height );
      public abstract void fillArc ( int x, int y, int width, int height, int startAngle, int endAngle );
      public abstract void fillPolygon ( int[] xPoints, int[] yPoints, int nPoints );
      public void fillPolygon ( Polygon p );




    10.Font/Color class에 대하여

    • Font Class에 대하여

      프로그램에서 우리가 글꼴을 사용하는데 필요한 정보를 정의하고 있는 Class.
      프로그램속에서 글꼴을 만들어 사용하기위해서 Font Class에는 글꼴양식과 스타일이
      정의되어 있다. ( final예약어로 상수화 a 직접적으로 Class의 속의 것을 사용한다. )
      java.awt package에 포함되어 있음.

      1. 생성자
      public Font ( String name, int style, int size );

      2. Class안에 미리 정의 되어있는 글꼴양식과 스타일( final로 정의 )

      ** 글꼴 양식
      Courier
      Helvetica
      Dialog
      TimesRoman
      Symbol

      java는 플랫폼 독립적인 프로그램을 염두에 두어야 한다. java가 돌아가는 여러가지 System에는 그 나름대로 여러 가지 Font를 지원하고 있다. 이러한 사항에서java의 글꼴은 각 System에서 자동으로 그 System에 맞도록 '가상 머신'에 의해 변화된다.
      예)) Helvetica a MS_Windows95에서 'Arial'로…

      ** 글꼴 스타일
      Public static final int BOLD;
      Public static final int ITALIC;
      Public static final int PLAIN;

      3. 스타일 사용방식
      스타일은 중복해서 사용할 수 있다.
      방식은
      Font.BOLD + Font.ITALIC

      4. 글꼴을 프로그램에 설정하는 방식
      Graphics Class의 method인
      setFont ( 글꼴 변수 );

      Font Class 이용한 예제 ( Font_test.java )

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

    public class Font_test extends Applet
    {
    Font f1 = new Font('Helvetica', Font.PLAIN, 18);
    Font f2 = new Font('Helvetica', Font.BOLD, 10);
    Font f3 = new Font('Helvetica', Font.ITALIC, 12);
    Font f4 = new Font('Courier', Font.PLAIN, 12);
    Font f5 = new Font('TimesRoman', Font.BOLD + Font.ITALIC, 14);
    Font f6 = new Font('Dialog', Font.ITALIC, 14);

    public void paint(Graphics g)
    {
    g.setFont(f1);
    g.drawString('18pt Plain Helvetica', 5, 20);

    g.setFont(f2);
    g.drawString('10pt Bold Helvetica', 5, 43);

    g.setFont(f3);
    g.drawString('12pt Italic Helvetica', 5, 58);

    g.setFont(f4);
    g.drawString('12pt Plain Courier', 5, 75);

    g.setFont(f5);
    g.drawString('14pt Bold & Italic TimesRoman', 5, 92);

    g.setFont(f6);
    g.drawString('14pt Italic Dialog', 5, 111);
    }
    }

     

    • Color Class에 대하여

    1. java.awt package 속에 정의되어 있으며 색상에 관리하는 필요한 정보를 정의하고 있는 Class이다..

    2. 생성자
    public Color(int r, int g, int b);
    public Color(int rgb);
    public Color(float r, float g, float b);
    ** 프로그램에서 색은 삼원색을 혼합하여 사용( red, green, blue)

    3. 미리 정의되어 있는 색깔 ( 상수( final ) 선언되어있어 Class의 속에 있는 것을 그대로 사용)

    사용 가능한 색상
    'black 'blue 'cyan 'darkGray 'gray
    green 'lightGray 'magenta 'orange 'pink
    'red 'white 'yellow
    ** 사용 방식 Color.색상 이름

    4.프로그램에서 색상의 설정
    Graphics Class의 멤버 method를 사용
    ***setColor( 색상변수 )



    예제> HelloColor.java
    :애플릿 상에서 색상을 가진 그래픽을 표현해 보고자 한다. 문자열을 출력하고 색상을 지정한 원과 선을 그린다.

    download HelloColor.zip

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

    public class HelloColor extends Applet
    {
        public void paint (Graphics g)
        {
        g.drawString('Hellow world!', 32, 50);
        
    //문자열을 지정한 위치 (32, 50) 에 위치시켜 출력한다.
        g.setColor(Color.red);
        
    //앞으로 정의할 색상 즉 여기서는 빨강색으로 그리라는 의미이다.
        g.drawOval(25,5,75,75);
        
    //원을 그리는 작업으로 좌표값(25,5)에서 높이 75 폭 75의 원을 그리라는 의미이다.
        g.drawLine(36,68,88,16);
        
    //화면상에 좌표값(36,68)에서 시작해 좌표값(88,16)에 선을 그리게 된다...
        }
    }



    학습 point 1.
    그래픽 더블 버퍼링
    첫 번째 라인의 import java.awt.*; 은 C나 C++의 include문와 유사한 동작을 한다 즉 java.awt.Graphics라는 클래스를 프로그램에서 사용하겠다는 의미이다.
    .
    기본적으로 자바 언어로 만든 그래픽 응용프로그램은 이미지 처리시 더블 버퍼링을 사용해야 한다. 그래픽컨텍스드는 시스템이 어떻게 그래프를 그릴 것인가 알려주는 테이타구조라 할수 있으며 대표적인 것으로는 paint() Method이다.
        public void paint (Graphics g){............
    여기서 g는그래픽 컨텍스트로서 g안에 있는 화면사의 이미지를 변화시킨다. 즉 이 클래스는 paint(...)메쏘드에서 매개변수 Graphics 객체인 g를 넘겨줌으로써, 메쏘드내에서 drawRect(....)과 drawString(....)을 사용가능하게 한다. 그럼 메쏘드 앞에 쓰여진 g. 는 무엇인가? 이것은 Graphics객체로 g라는 것을 만들어 매개 변수로 사용함 일컫는 것으로, paint(..)메쏘드는 위와같이 Graphics 객체를 매개 변수로 필요로 합니다. 따라서 Graphic 객체 g의 메쏘드로 drawRect(...) 과 drawString(...)을 사용함을 의미하는 것입니다
    paint(...) 메쏘드는 애플렛이 오버라이드할 수 있는 두가지의 화면출력 메쏘드들중 하나이다.

    ◎ paint(...) : 기본적인 화면출력 메쏘드이고, 대부분의 메쏘드들은 브로우져 페이지에 애플렛을 표현하기 위해서 이 메쏘드를 사용한다.
    다른 하나는,
    ◎ update(...) : 그리기 작업을 갱신내기 개선하기위해 paint(...) 다음에 사용할 수 있는 메쏘드이다.

    paint(...) 와 update(...) 메쏘드는 Applet 클래스로부터 상속을 받습니다. 그리고 Applet 클래스는 이 메쏘드들을 Component 클래스로부터 상속받는다.즉, paint(...), update(...) 는 Component 클래스내에 있다.두 메쏘드는 Graphics 객체를 매개변수로 받아 화면출력을 하게끔 합니다. 그리고 화면출력의 모양은 paint(...) 메쏘드내에 쓰면 된다.
    학습 point 2.
    자바 언어에서 그래픽그리기

    어떤 애플릿이 화면상에서 어떠한 것을 그리고자 한다면 그 Graphics class는 자바언어의 패키지인 java.awt에 속한 것이다. 이를위해 반드시 그 클래스를 인포트 해야만 오류가 없이 컴파일이 수행된다.

    줄그리기......
        g.drawLine(36,68,88,16); ....

    사각형그리기....
        g.drawRect(10,10,30,30);...사각형의 외곽선만 그리는 경우... 좌표값(10,10)에서 높이 30 폭30 의 사각형을 그린다.
        g.fillRect(10,10,30,30);...사각형을 외곽선을 그린후 안쪽을 채우는 경우
    네각이 둥근 사각형그리기...

        
    g.drawRoundRect(10,10,30,30,15,15);...사각형의 외곽선을 그린 후 각각의 각도를 15도씩 둥근모습을 가진 사각형을 그린다.
        g.fillRoundRect(10,10,30,30,15,15);..둥근.사각형을 외곽선을 그린후 안쪽을 채우는 경우
                                        
    3차원의 사각형 그리기
        g.draw3DRect(10,10,30,30, true);.. 돌출형.사각형
        g.fill3DRect(10,10,30,30, true);...
        g.draw3DRect(10,10,30,30, false);...함몰형 사각형
        g.fill3DRect(10,10,30,30, false);...

    원형그리기....
        g.drawOval(10,10,30,30);...좌표값(10,10)에서 폭30 높이 30인 원을 그린다.
        g.fillOval(10,10,50,30);..좌표값(10,10)에서 폭50 높이 30인 타원을 그린다.
    호 그리기
        g.drawArc(10,10,30,30,0,110);...좌표값(10,10)에서 폭30 높이 30인 시작각도가 0이고, 110도 지점까지 호를 그린다.
        g.fillArc(10,10,30,30,0,-110);

                              


    예제> colorLines.java
    애플릿이 실행되면 색상을 달리하는 여러개의 줄을 그려본다.
    .

    download colorLines.zip

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

    public class colorLines extends Applet
    {
        public void paint (Graphics g)
       {
            int count;
            
    //count로 정수형 변수를 선언한수 3으로 나눈 나머지의 값에 따라 색깔을 부여 하였다.
            for(count=0; count<=12; count++)
            {
                 switch(count%3)
                 {
                     case 0: g.setColor(Color.blue);break;
                     case 1: g.setColor(Color.red);break;
                     case 2: g.setColor(Color.green);break;
                }
                g.drawLine(10, count*10, 80, count*10);
            }
       }
    }



    학습 point...
    Color class
    색상을 관리하는데 필요한 정보를 정의하고 있는 class이다.

    public Color(int r, int g, int b);
    public Color(int rgb);
    public Color(floatr, float g, float b);


    Color클래스에서 미리정의된 색은 final로 정의 되어 있다
    Color.white, Color.black,
    Color.red, Color.green, Color.blue, Color.lightGray, Color.cyan, Color.magenta,Color.yellow, Color.darkGray, Color.orange,Color.gray, Color.pink

    이외에 색은 RGB의 조합으로 새롭게 만들어 사용하는데 이경우에는 반드시 Color객체를 생성하여야 한다

    보기]
    public void paint(Graphics g){
            //새로운 색을 지정하기 위해서는 color객체를 생성한다
           g.setColor(new Color(0, 10, 140));
                  // 혹은 g.setColor(Color.red); 미리정의된 색을 사용하는 경우
           g.drawString('ABCDEFGHIJKLNMOPQRSTUVWXYZ',50, 33);
           showStatus('Current RGB: '+g.getColor().toString());
    }

    - getRed(): return a value between 0 and 255 representing the red content
    - getGreen()
    - getBlue()
    - getColor(): return Color object representing the current color for the graphics context
    - setColor(Color c)
                              


    예제3> D_applet2.java
    폰트의 크기를 변경시켜 표현해본다.
    .

    download D_applet2.zip

    import java.awt.*;
    import java.applet.*;
          
    public class D_applet2 extends Applet
    {
          String data='HelloJava';
          Font f;
          public void init()
          {
                resize(300,300);
                this.setBackground(Color.blue);
                f=new Font('TimesRoman', Font.BOLD+Font.ITALIC,45);
          }
          public void paint(Graphics g)
          {
                g.setColor(Color.red);
                g.fillOval(0,0,300,300);
                g.setColor(Color.yellow);
                g.setFont(f);
                g.drawString(data,50,130);
          }
    }



    학습 point...
    글자와 서체
    public Font(String name,int style, int size);

    String name--글꼴양식
          - TimesRoman, Courier, Helvetica, Dialog, Symbol

    int style--미리정의된 font style로 final로 상수화 되어 있다.
          Font.PLAN, Font.BOLD, Font.ITALIC
                이들간의 합성도 가능: e.g. Font.BOLD + Font.ITALIC

    Ex] Font f = new Font('TimesRoman', Font.BOLD, 24);

    시스템에서 사용가능한 font의 리스트를 알아내는 방법
          - Toolkit class에서 제공하는 String[] getFontList()를 이용한다
    예]
    public void paint(Graphics g)
    {
          String fonts[] = Toolkit.getDefaultToolkit().getFontList();
                for(int j = 0; j < fonts.length; j++)
                      g.drawString(fonts[j], 10, j*10 + 120);
    }
                            


    예제> gugu2.java
    level class를 활용 구구단을 출력해 본다.
    .

    import java.awt.*;
    import java.applet.*;
        
    public class gugu2 extends Applet
    {
          Label gu_label;

          public void init()
          {
                resize(600,300);
                gu_label = new Label('GuGuDan', CENTER);
                gu_label.setFont(new Font('TimesRoman',Font.BOLD,30));
                add(gu_label);
          }
          public void paint(Graphics g)
          {
                for(int i=2;i<=9;i++)
                {
                      for(int j=1;j<=9;j++)
                      {
                            g.drawString(i+' * ' + j + '=' + i * j, i*50, 50+j*20);
                        
        //y축의 간격은 20, x축의 간격을 50으로 한다.
                      }
                }
          }
    }



    학습 point.. Lavel class
    ** String Class와는 기능적면에서 다르다.
    ** 독립적인 Class로 제목적인 의미로 사용하는 객체.
    생성자
    public Label ( );
    public Label ( String text );
    public Label ( String text, int alignment );
    • alignment 상수로 정의
      a public static final int CENTER;
      a public static final int LEFT;
      a public static final int RIGHT;
    • Method
      a public synchoronized void setAlignment ( int alignment );
      a public synchoronized void setText ( String text );

    • 예제>>
      import java.applet.*;
      import java.awt.*;

      public class l_class extents Applet
      {
              Label l_b = new Label ('Label object');
              Public void init( )
              {
                      add(l_b);
              }
      }
                             


    예제3> Parameter.java
    자바 애플릿을 만든 사람은 정확한 운영을 위한 매개변수를 알고 있지만, 다른사람들은 정확히 알지 못할 수 있으므로 매개변수에 대한 정보를 전달하는 것이 필요하다.
    이것을 통해 자바애플릿을 위한 HTML화일에 문자 정보로 출력 될 수 있게 정의할수 있다.

    download Parameter.zip

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

    public class Parameter extends Applet
    {
        String toDisplay;
        int speed;

        public void init()
        {
            resize(100,100);
            String pv=getParameter('speed');
            if(pv==null)
            { speed=10; }
            else
            { speed=Integer.parseInt(pv); }
            toDisplay='Speed given:'+speed;
            }

        public void paint(Graphics g)
        {
            g.drawString(toDisplay,25,25);
        }

    }



    'speed' value='50'>



    예제> bar_chart.java
    .

    import java.awt.*;
    import java.applet.*;
        
    public class bar_chart extends Applet
    {
         static int data_set[] = {0, 0, 0, 0};
         
    // HTML문서에서 받아 들일 data의 초기값 지정
         final static String data_label[] = {'국어', '산수' ,'바른 생활', '자연' };

         int Graph_offset = 20;
         int Graph_Height = 150;
         int Y_Tick_Height = Graph_Height / 5;
         int Graph_Width = 240;
         int X_Tick_Width = Graph_Width / data_set.length;

         public void init()
         {
              resize(400, 300);
              setBackground(Color.white);
              String str;
              str = getParameter('0');
    //애플릿 클래스에 정의 리턴값으로 String
              data_set[0] = Integer.valueOf(str, 10).intValue();
    //valueOf
              
    //intValue
              str = getParameter('1');
              data_set[1] = Integer.parseInt(str);
    //parseInt
              str = getParameter('2');
              data_set[2] = Integer.parseInt(str);
              str = getParameter('3');
              data_set[3] = Integer.parseInt(str);
        }

         public void paint (Graphics g)
         {
              g.setColor(Color.black);

        
          //X축을 그린다.
              g.drawLine(Graph_offset + Graph_Width, Graph_offset,
              Graph_offset + Graph_Width, Graph_offset + Graph_Height);

              //X-
    점 레이블을 그린다.
              for(int i = 0; i <= 5; i++)
              {
                   g.drawString(String.valueOf(i*20), Graph_offset + Graph_Width + 10,
                   Graph_offset + Graph_Height - (i * Y_Tick_Height));

                   //
    모는 선을 그린다.
                   g.drawLine(Graph_offset,
                        Graph_offset + Graph_Height - (i * Y_Tick_Height),
                        Graph_offset + Graph_Width + 5,
                        Graph_offset + Graph_Height - (i * Y_Tick_Height));
              }

              //X
    축을 그린다.
              g.drawLine(Graph_offset, Graph_offset + Graph_Height,
              Graph_offset + Graph_Width, Graph_offset + Graph_Height);

              //X-
    점 레이블을 그린다.
              for(int i = 0; i < data_set.length; i++)
              {
                   g.drawString(data_label[i],
                        Graph_offset + X_Tick_Width * i + X_Tick_Width / 4,
                        Graph_offset + Graph_Height + 20);

                   //X-
    점 선을 그린다.
                   g.drawLine(Graph_offset + X_Tick_Width * i + X_Tick_Width / 2,
                   Graph_offset + Graph_Height,
                   Graph_offset + X_Tick_Width * i + X_Tick_Width /2,
                   Graph_offset + Graph_Height + 5);
              }

         
         //데이터(막대선)을 그린다.
              g.setColor(Color.red);
              for(int i = 0; i           {
                   int bar_height = data_set[i] * Graph_Height / 100;
                   g.fillRect(Graph_offset + X_Tick_Width * i + X_Tick_Width / 4,
                   Graph_offset + Graph_Height - bar_height,
                   X_Tick_Width / 2, bar_height);
              }
        }
    }


    태그는 자바 코드를 이해하는 웹 브라우저에서만 해석되는 태그로 그 속성으로는 name과 value를 갖는다. name은 애플릿에서 호출할 때의 Target의 이름으로 쓰이는 것이고 그 Target에 의해 돌려지는 값으로 value가 설정된다.


    오류 초동학교 5학년 5반 5월 성적표 챠트










    예제> bar_chart.java
    .

    import java.awt.*;
    import java.applet.*;
        
    public class bar_chart extends Applet
    {
         static int data_set[] = {0, 0, 0, 0};
         
    // HTML문서에서 받아 들일 data의 초기값 지정
         final static String data_label[] = {'국어', '산수' ,'바른 생활', '자연' };

         int Graph_offset = 20;
         int Graph_Height = 150;
         int Y_Tick_Height = Graph_Height / 5;
         int Graph_Width = 240;
         int X_Tick_Width = Graph_Width / data_set.length;

         public void init()
         {
              resize(400, 300);
              setBackground(Color.white);
              String str;
              str = getParameter('0');
    //애플릿 클래스에 정의 리턴값으로 String
              data_set[0] = Integer.valueOf(str, 10).intValue();
    //valueOf
              
    //intValue
              str = getParameter('1');
              data_set[1] = Integer.parseInt(str);
    //parseInt
              str = getParameter('2');
              data_set[2] = Integer.parseInt(str);
              str = getParameter('3');
              data_set[3] = Integer.parseInt(str);
        }

         public void paint (Graphics g)
         {
              g.setColor(Color.black);

        
          //X축을 그린다.
              g.drawLine(Graph_offset + Graph_Width, Graph_offset,
              Graph_offset + Graph_Width, Graph_offset + Graph_Height);

              //X-
    점 레이블을 그린다.
              for(int i = 0; i <= 5; i++)
              {
                   g.drawString(String.valueOf(i*20), Graph_offset + Graph_Width + 10,
                   Graph_offset + Graph_Height - (i * Y_Tick_Height));

                   //
    모는 선을 그린다.
                   g.drawLine(Graph_offset,
                        Graph_offset + Graph_Height - (i * Y_Tick_Height),
                        Graph_offset + Graph_Width + 5,
                        Graph_offset + Graph_Height - (i * Y_Tick_Height));
              }

              //X
    축을 그린다.
              g.drawLine(Graph_offset, Graph_offset + Graph_Height,
              Graph_offset + Graph_Width, Graph_offset + Graph_Height);

              //X-
    점 레이블을 그린다.
              for(int i = 0; i < data_set.length; i++)
              {
                   g.drawString(data_label[i],
                        Graph_offset + X_Tick_Width * i + X_Tick_Width / 4,
                        Graph_offset + Graph_Height + 20);

                   //X-
    점 선을 그린다.
                   g.drawLine(Graph_offset + X_Tick_Width * i + X_Tick_Width / 2,
                   Graph_offset + Graph_Height,
                   Graph_offset + X_Tick_Width * i + X_Tick_Width /2,
                   Graph_offset + Graph_Height + 5);
              }

         
         //데이터(막대선)을 그린다.
              g.setColor(Color.red);
              for(int i = 0; i           {
                   int bar_height = data_set[i] * Graph_Height / 100;
                   g.fillRect(Graph_offset + X_Tick_Width * i + X_Tick_Width / 4,
                   Graph_offset + Graph_Height - bar_height,
                   X_Tick_Width / 2, bar_height);
              }
        }
    }


    태그는 자바 코드를 이해하는 웹 브라우저에서만 해석되는 태그로 그 속성으로는 name과 value를 갖는다. name은 애플릿에서 호출할 때의 Target의 이름으로 쓰이는 것이고 그 Target에 의해 돌려지는 값으로 value가 설정된다.


    오류 초동학교 5학년 5반 5월 성적표 챠트









    11.Retangle Class 에 대하여

    • 생성자

      public Rectangle( );
      public Rectangle( Rectangle r );
      public Rectangle( int x, int y, int width, int height );
      public Rectangle( int width, int height );
      public Rectangle( Point p, Dimention d );
      public Rectangle( Point p );
      public Rectangle( Dimenttion d );

    • 멤버 변수

      public int x;
      public int y;
      public int width;
      public int height;

    • 멤버Method

      public Rectangle getBound ( );
      public Point getLocation ( );
      public Dimension getSize ( );
      public void move ( int x, int y );
      public void reshape ( int x, int y, int width, int heigth );
      public void resize( int width, int height );
      public void setBound ( Rectangle r );
      public void setBound ( int x, int y, int width, int height );
      public void setLocation ( int x, int y );
      public void setLocation ( Ponit p );
      public void setSize ( Dimension d );
      public void setSize ( int width, int height );
      public void translate ( int x, int y );
      Public boolean inside ( int x, int y );
      --> 정해진 사각형( Rectangle의 범위) 속을 클릭했는지를 판단한다. 사각형의 속을 선택했다면 true의 값을 그렇지 않다면 false의 값을 반환한다.

      1. 사용할 사각형의 정보를 기록할 Rectangle 객체 선언

      Rectangle a_rect = new Rectangle(10, 10, 80, 40);
      Rectangle b_rect = new Rectangle(100, 10, 80,40);

      2. 메쏘드 사용

      public boolean mouseDown(Event e, int x, int y)
      {
      if (a_rect.inside(x,y))
      // rectangle A clicked
      수행문…..
      if (b_rect.inside(x,y))
      // rectangle B clicked
      수행문….
      return true;
      }


     

    Please Mail to me:
    hoya1@shinbiro.com


    12.JDK1.0.2에서의 Event 객체
    **특정 이벤트 처리가 없는 Event Method에 관한 java1.0.x --Event Modelling
    **특정 이벤트 처리 메소드가 없을 경우 일괄적인 이벤트 처리 하지만 특정한 이벤트 처리 메소드를 사용하는 것이 Compiler에 유리하다.

    • java의 이벤트 -> 발생하면 이벤트 객체 생성 -> 해당이벤트를 받아 처리

    * Java는 Event 중심의 프로그램이다.
    사건발생 -> Java ( Event 객체 생성 ) -> 사건에 대한 정보 저장 -> 정보참조프로그램 동작
    ** MouseClick 등

    • Event 프로그램의 구조

    -> 이벤트가 발생할 때까지 루프하며 기다린다.
    자바는 어떤 이벤트가 일어나면 이벤트를 구별하도록 돕는 메쏘드가 있다.
    이들을 컨비니언트 메쏘드라고 한다.
    (세트로 선언되어 있음 -> Component Class에 … : Applet Class의 Supet Class)

    Component Class에 정의 되어 있는 이벤트관련 Method
    public boolean mouseDown ( Event evt, int x, int y );
    public boolean mouseUp ( Event evt, int x, int y );
    public boolean mouseMove ( Event evt, int x, int y );
    public boolean mouseDrag ( Event evt, int x, int y );
    public boolean mouseEnter ( Event evt, int x, int y );
    public boolean mouseEdit ( Event evt, int x, int y );
    public boolean action (Event evt, Object arg )
    {
           // Parameter
           evt -> 이벤트를 발생시킨 이벤트 객체.
           Arg -> bit단위로 객체를 비교할 대상 객체

           if ( evt instanceof 객체명 ) //Event를 발생시킨 인스턴스 구별
           {
                  if ( arg.equals(' ') //객체를 bit단위로 비교하는 메소드
                  {
                  구현문…….
                  }
           }
    }


    JDK1.0.2 이벤트 처리 메소드
    이벤트 고유의 메소드'action'
    'keyDown', 'keyUp'
    'mouseDown', 'mouseUp'
    'mouseMove', 'mouseUp'
    'mouseEnter', 'mouseExit'
    'getFocus', 'lostFocus'
    모든 이벤트를 처리하는 메소드'handleEvent'
    Component Class는 두가지 이벤트 처리 메소드를 제공함
           -> 특정 이벤트 또는 이벤트 차입만을 처리하는 몇 가지 메소드.
           -> 모든 것을 처리하는 메소드
                  ** 가능한 고유의 이벤트 처리 매소드 사용

                  **Event.WINDOW_DESTROY와 같은 이벤트는 handleEvent로만 받을 수 있다.

    Event 객체의 공개 필드 - JDK1.0.2
    target 이벤트가 목표하는 객체, 예를 들어 마우스 클릭을 받은 텍스트 필드
    id 이벤트 타입을 지정한 정수, 예를 들어 Event_ACTION_EVENT
    when 이벤트 시간 도장, 밀리초 단위 ( 1 / 1000 )
    x,y이벤트를 받는 컴포넌트의 좌표계 내에서의 이벤트 위치
    key 이벤트를 발생시키는 키
    modifiers 쉬프트 또는 컨트롤과 같은 변경 모드 키 상태
    arg 일반적 목적을 위한 Obict 추가 매개 변수


    Cpomponet Window 이벤트 정보
    이벤트 종류 대상 클래스 이벤트 ID와 유효 필드
    키보드Component KEY_PRESS : when, key, modifiers
    KEY_RELEASE : when, key, modifiers
    KEY_ACTION : when, key, modifiers
    KEY_ACTION_RELEASE : when, key, modifiers
    마우스Component MOUSE_DOWN : when, x, y, modifiers, clickCount
    MOUSE_UP : when, x,y, modifiers
    MOUSE_DRAG : when, x, y, modifiers
    MOUSE_ENTER : when, x, y
    MOUSE_ EXIT : when, x, y
    윈도우 Window WINDOW_DESTROY
    WINDOW_ICONIFY
    WINDOW_DEICONIFY
    Dialog WINDOW_MOVED : x, y
    FrameWINDOW_MOVED : x, y
    초점ComponentGOT_FOCUS
    LOST_FOCUS

     

    • 행동, 유사 행동 ( action - like ) 이벤트

      사용자 객체의 클래스에 따라 크게 달라진다. 예를 들어 버튼을 누르면 버튼의 문자열 라벨을 전달한다. 행동, 유사 행동 이벤트는 다양한 정보를 이벤트는 다양한 정보를 위해 arg필드를 사용한다.

      행동, 유사 행동 이벤트는 네이티브 툴킷 ( 피어 객체 - 시스템 종속적인 작업을 수행하기위해 만들어지는 객체 )이 이벤트를 받은 후에야 AWT 컴포넌트에 전달된다. 이는 AWT 컴포넌트가 이벤트를 보기 전에 이미 피어 객체에 의해 기본 이벤트 처리가 이뤄졌을 수 있다는 것을 의미한다. 예를 들어 버튼을 누를 때가 그렇다.

     

    예제 프로그램 코팅 ( 제목 : 원초적 낙서장 )
    -----------------------------------------------------------------------
    import java.applet.*;
    import java.awt.*;

    public class Scribble1 extends Applet
    {
              private int last_x, last_y; //시작좌표를 기억할 정수형 변수 선언

              public boolean mouseDown ( Event evt, int x, int y )
              {
                        last_x = x;
                        last_y =y;
                        return true;
              }

              public boolean mouseDrag (Event evt, int x, int y )
              {
                        Graphics g = getGraphics( );
                        g.drawLine ( last_x, last_y, x, y);
                        last_x = x;
                        last_y = y;
                        return true;
              }
    }

     


    Please Mail to me:
    hoya1@shinbiro.com


    13. Image Class 에 대하여
                        java.awt Package에 정의되어 있는 Class
                        java에서 사용하는 이미지를 관리하는 클래스.

    • java는 Internet Programming Language이므로 Internet에 사용하는 Image Format을 사용한다.
                  *.jpg ( True Color, 손실압축 )
                  *.gif ( 256 Color, 1색 투명, 움직이는 gif )

    • java에는 Image Processing을 위해 준비된 Package존재 ::: java.awt.image Package


    • 이미지 사용하기 ( 순서 )
      1. 사용하려는 Image의 변수를 선언한다.
                   Image img;
      2. 그리기 위한 Image를 구해온다.
                  img = getImage(URL url);
                  img = getImage(URL url, String name);

       이미지를 로드해 이미지 클래스를 자동르로 만드는 기능을 제공한다.. 이것을 위해 URL을 지정하거나 이미지 파일이 있는 경로를 주어야 한다. 자바언어에서 getImage( )에 URL인수를 주는 두가지 method를 제공하고 있다.

      getCodeBase( ) :실행을 할수 있는 애플이 위치한 디렉토리를 나타낸다.
      getDocumentBase(): 실행할수 있는 자바 애플릿을 위한 HTML화일이 위치한 디렉토리를 나타낸다.

      ** 웹상에서 Image 구하기
      Image img = getImage(new URL(http://www.myserver.com/sample.gif));
      3. 이미지를 그린다.
              drawImage ( Image img, int x, int y, ImageObserver observer );
              drawImage ( Image img, int x, int y, int width, int height, ImageObserver observer );
                                --> 이미지를 그릴 때 크기를 조절하여 그릴 수 있게한다(stretch)

       

    • ImageObserver 이해하기

      프로그램이 drawImage Method를 호출하여 이미지를 그릴 때 Java는 먼저 이미지가 사용 가능하지(이미지가 로드되어 디스플레이할 수 있도록 되어 있는지) 알아보아야 한다. 이미지가 사용 불가능할 경우, drawImage method는 이미지를 그리지 않은 채 리턴하지만 ImageObserver에게 그 진행 상황을 보고한다. Java는 다음 명영문과 같이 observer의 imageUpdate Method를 사용하여 ImageObserver에게 통지 메시지를 송신한다.
                
    boolean imageUpdate ( ImageUpdate img, int infoflags, int x, int y, int width, int height );
              // Parameter
                  img -> Java가 통지를 송신하는 이미지를 지정
                  infoflages-> 비트 마스크 변수 -
             //repaint Method를 호출하여 화면의 영역을 다시 그린다. 심지어 이미지의 일부만 사용 가능할 경우에도 그렇다.
                함수를 재정의하면 프로그램은 이미지기 로드 되어 디스플레이 준비가 되었을 때를 탐지할 수 있다.
    • ImageUpdate 메시지가 지정하는 플래그 값( infoflages)
    비트 필드의 미
    ABORT 이미지 생성이 중단된다.
    ALLBITS 이미지가 완성된다.
    ERROR오류가 일어 났다
    FRAMEBIT 새 이미지 프레임이 완성되었다.
    HEIGHT높이 정보가 사용 가능하다.
    PROPERTIES이미지 프로퍼티가 사용 가능 하다.
    SOMEBITS이미지의 일부가 사용 가능 하다.
    WIDTH 너비 정보가 사용 가능 하다.
     
    예제> image_applet.java
    기본적인 이미지 예제

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

    public class image_applet extends Applet
    {
         Image img;
         public void init()
         {
              img=getImage(getCodeBase(),'java1.gif');
         }
         public void paint(Graphics g)
         {
              g.drawImage(img,0,0,this);
         }
    }


    Please Mail to me:
    hoya1@shinbiro.com



    예제>gif_anime.java-
    애니메이션 첫번째 이야기

    ** Runnable Interface
    ** Thread Class
    ** 예외사항 처리에 대하여
    .

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

    public class colorLines extends Applet
    {
          int img_index = 0;
          Thread anime = null;
          String img_names[] = {'java1.gif', 'java2.gif', 'java3.gif', 'java4.gif', 'java5.gif', 'java6.gif'};
          Image java_img[] = new Image[6];
          public void init()
          {
                for (int i = 0; i < 6; i++)
                      java_img[i] = getImage (getCodeBase(), img_names[i]);
          }
          public void start()
          {
                if (anime == null)
                {
                      anime = new Thread(this);
                      anime.start();
                }
          }
          public void paint (Graphics g)
          {
                g.drawImage (java_img[img_index], 0, 0, this);
          }
          public void run()
          {
                while (anime != null)
                {
                      img_index++;
                      if (img_index > 5)
                      img_index = 0;
                      repaint();
                      try {
                            Thread.sleep (200);
                           }
                     catch (InterruptedException e) {};
                }
          }
          public void stop ( )
          {
                if ( anime != null )
                {
                      anime.stop ();
                      anime = null;
                }
          }
    }


     


    예제>gif_anime2.java--
    애니메이션 두 번째 이야기
    Update Method를 재정의하여 깜박임을 줄이기
    repaint()에 관하여….
    .

    gif_anime1.java      AND      gif_anime2.java
    **애니메이션을 구현하기 위해서 repaint() Method를 호출할 때 앞에서는 repaint() Methodpaint() Method를 강제로 호출한다고 했지만 실제로는 아래와 같은 과정을 밟는다.
                      
                     repaint --> update()
    호출 --> paint() 호출

    기본적으로
    update Method는 배경색상으로 드로잉 영역을 지운다( 그린다 )
    애니메이션 구현에서는 update() Method의 기본적의 기능 때문에 예제 1과 같이 깜박임 현상이 발생하므로 이러한 기능을 억제하도록 재정의 해주어야 한다.

    repaint
    의 스레드 구현 방식
    1. repaint는 비동기적이다. 따라서 그리기가 끝날 때까지 기다리는 것이 아니라 그 즉시 반환되어 온다.
    2.
    컴포넌트 하나에 아직 해결되지 않은 repaint 요청이 그리기 큐(queue)에 쌓여 있다면 AWT는 그것들을 하나의 요청으로 합친다. 따라서 여러분들이 repaint요청을 보낸 만큼 실제로 paintupdate가 호출된다고 가정해선 안된다.

    //이 코드를 예제 1에 추가시키면 예제 12의 차이를 볼수 있다.
    public void update(Graphics g)
    {
                   paint(g);
    //페인트 메쏘드를 집적 호출하는 코딩
    }



    예제> gif_anime3.java
    ->세 번째 이야기
    MediaTracker Class를 이용한 애니메이션.
    이미지를 사전에 로드하여 깨끗한 애니메이션 창출.
    .

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

    public class gif_anime3 extends Applet implements Runnable
    {
          int img_index = 0;
          Thread anime = null;
          String img_names[] = {'java1.gif', 'java2.gif', 'java3.gif','java4.gif', 'java5.gif', 'java6.gif'};
          Image java_img[] = new Image[6];

          public void init ()
          {
                MediaTracker mt = new MediaTracker(this);
                for (int i=0; i<6; i++)
                {
                      java_img[i] = getImage (getCodeBase(), img_names[i]);
                      mt.addImage (java_img[i], i);
                }
                try    { mt.waitForAll(); }
                catch (InterruptedException e) {};
          }

          public void start()
          {
                if (anime == null)
                {
                      anime = new Thread(this);
                      anime.start();
                }
          }
          public void paint (Graphics g)
          {
                g.drawImage (java_img[img_index], 0, 0, this);
          }
          public void run()
          {
                while (anime != null)
                {
                      img_index++;
                      if (img_index > 5)
                             img_index = 0;
                      repaint();
                      try {
                            Thread.sleep (200);
                           }
                     catch (InterruptedException e) {};
                }
          }
          public void stop ( )
          {
                if ( anime != null )
                {
                      anime.stop ();
                      anime = null;
                }
          }
    }
    학습 point...
        예외 처리(Exception Handling)
    예외 처리는 C++와 문법이 거의 같다. 즉, try, catch, throw 구문을 사용한다.
    다음은 전형적인 예외 처리 구문이다.
    try {    Thread.sleep(200);}catch ( 
    InterruptedException e ) {    System.out.println('Sleep interrupted!!!');
    }

    try 블록은 예외가 발생할 수 있는 실행문들을 포괄하는 블록이며 catch는 try 블록에서 예외가 발생한 경우 이를 처리하는 블록이다. 또, throw는 예외를 발생시키는 예약어이다.
    이 구문에서 예외를 발생시킬 가능성이 있는 메소드는 java.lang.Thread 클래스의 sleep()으로 다음과 같이 선언되어 있다.

    public static void sleep(long millis) throws InterruptedException

    메소드 안에서 throw가 쓰일 경우 C++에서와 마찬가지로 throw의 대상은 클래스 인스턴스이다. 예를 들면 다음과 같다.

    class RangeException extends Exception {    // RangeException 예외 클래스 선언문 몸체} class Sample {    try {        getRange(i);    } 
    catch(RangeException e) {        System.out.println('범위 밖의 값입니다.');    }     
    getRange (int i) {        if (i>10) {            throw new RangeException();   
         }        ...    }}

    C++와 달리, 자바에서는 예외 처리와 관련한 또하나의 예약어 finally가 있다.
    catch(Exception e){} 블록과 달리 finally {} 블록의 내용은 try {} 블록의 실행 결과에 무관하게 항상 실행된다. 예를 들면 다음과 같다.

    try {        if (music != null) {                
    music.loop();        }        ... 생략(실행할 
    내용들)...} finally {        if (music != null) {
                    music.stop();        }}

    위 예에서는 music이라는 이름의 오디오 파일을 반복해서 연주하면서 다른 실행문들을 수행하다가, 그 실행문들의 수행이 끝나거나 혹은 수행 중에 어떤 예외나 break, continue 문 등을 만나서 try 블록을 탈출하더라도 finally 블록을 무조건 수행하게 되어 오디오 파일 연주를 반드시 중단시키게 된다. 이 finally 블록은 주로 파일이나 네트웍 소켓 등과 같이 일단 연 다음, 어떠한 예외 상황이 발생하더라도 반드시 닫아야만 하는 리소스를 관리하는 데 흔하게 사용된다.

    학습 point...
    쓰레드 클래스와 입출력 클래스
    java.lang.Thread 클래스
    자바에서 잘 정의된 시스템 독립적인 추상 윈도우 시스템 외에 또하나 주목할 부분은 쓰레드를 지원한다는 점이다.
    쓰레드는 프로세스 내에서 하나의 연속적인 제어 흐름이다. 이것은 프로그램 내에서 실행될 때 각각의 쓰레드는 하나의 시작점 과 하나의 흐름을 가지고, 런타임의 모든 시점에서 하나의 실행 지점을 가지고 또 하나의 끝점을 가진다는 의미이다. 쓰레드 객 체는 멀티쓰레드 프로그래밍의 기반으로 멀티쓰레드 프로그래밍은 하나의 프로그램이 서로 다른 일을 수행하는 여러 개의 쓰레드 를 동시에 수행할 수 있게 해 준다.

    실행 쓰레드를 새로 하나 만들려면 java.lang.Thread 클래스에서 하위 클래스를 파생하여 run() 도구를 오버라이드하면 된다. 오 버라이드된 run() 도구에는 새로 만들어진 쓰레드가 수행할 코드가 들어가게 된다. 다음 start() 도구를 호출하면 쓰레드 인스턴 스가 생성된다. start() 도구는 쓰레드를 생성하고 run() 도구를 실행하는 역할을 한다.
    쓰레드를 생성하는 하나의 방법은 Runnable 인터페이스를 이용하는 방법이다. Runnable 인터페이스를 포함한 모든 객체는 이 방법으로 하나의 쓰레드로 실행할 수 있다.
    예제 에서 보면 다음과 같다.

    public class gif_anime3 extends Applet implements Runnable
    {
         Thread anime = null;
          public void start()
          {
                if (anime == null)
    //null이 아니면
                {
                      anime = new Thread(this);
    //쓰레드를 생성
                      anime.start();
                }
          }
          public void run()
          {
                while (anime != null)
    //null이 아니면 쓰레드를 실행
                {
                      img_index++;
                      if (img_index > 5)
                            img_index = 0;
                      repaint();
                      try {
                            Thread.sleep (200);
                           }
                     catch (InterruptedException e) {};
                }
          }
    ........
    }

    자바 가상 기계(자바의 커널로 볼 수 있지만 기계 독립적으로 추상화된 부분)는 데몬 쓰레드가 아닌 모든 쓰레드가 종료할 때까 지 실행된다. 쓰레드는 run() 도구를 모두 수행하고 반환될 때나 stop() 도구가 호출될 때 종료한다.
    새로운 쓰레드가 생성될 때 생성되는 쓰레드는 부모 쓰레드(즉 자신을 생성한 쓰레드)로부터 우선권(priority)과 데몬 플래그를 상속받는다.

    학습 point...
    MediaTracker
    public MediaTracker ( Component comp );
    • MediaTracker의 사용법
      1. MediaTraker 객체를 작성(생성)한다
      2. .이미지를 MediaTracker에 추가:트래킹 그룹을 형성
      void addImage ( Image image, int id );
      void addImage ( Image image, int id, int w, int h);

    • Paramter
      image -> 트랙하고 싶은 이미지 로딩을 지정.
      Id -> 프로그램이 나중에 이미지에 대한 정보를 검색하는데 사용 할 수 있는 ID로 지정
      W / H -> 이미지를 랜더링하고 싶은 영역의 폭과 넓이를 지정한다.

    • 그래픽 작업의 동기화(Synchroniwation)를 위한 MediaTracker Method
      void waitForAll( ); 모든 이미지를 로드할 때까지 컨트롤을 호출기에 리턴하지 않음
      void waitForID ( int id );
      -> 트래거에 지정된 id를 가진 이미지가 로드 될 때까지 컨트롤을 호출기에 리턴하지 않음.
      ->예외처리가 정의되어 있는 Method a Compiler가 예외처리를 요구한다


    14. Canvas/Panel/Button Class 에 대하여

    • Canvas Class 에 대하여

    이 Class는 자체적으로 디폴트 드로잉이나 이벤트를 처리를 하지않는 Component이다.
    이 Class의 서브 Class를 만들어 어떠한 종류의 드로잉이나 이미지도 디스플레이 할 수 있으며 어떠한 종류의 사용자 입력 이벤트를 처리할 수 있다. Canvas는 자신의 Super Class의 이벤트 처리 Method를 상속한다. JDK1.1.x에서는 Canvas를 서브 Class로 만드는 대신 Component를 직접 서브 Class화하여 '경량급(ligntweight)컴포넌트'를 만들 수 있다.

    public class Canvas extends Component

    생성자
    -> public Canvas ( );

    멤버 Method
    public void paint ( Graphics g );

    Canvas class 예제>
    ---------------------------------------------------------------------------------
    import java.awt.*;
    import java.applet.*;

    public class myTool extends Applet
    {
         myCanvas cvs;
         ..................................     
         public void init()
         {
              cvs=new MyCanvas();
              cvs=reshape(0,0,100,100);
              leftPanel.add('Center', cvs); //
    왼족 패널 옆의 중앙에 캔버스를 놓음
              ...........................
         }
         class myCanvas  extends Canvas
         {
              public void paint(Graphics g)
              {
                    g.drawRect(0,0,99,99);
                    g.drawString('Canvas', 15,40);
             } 
    }
    ---------------------------------------------------------------------------------

     

    • Panel Class 에 대하여

    이 Class는 컨테이너 속에 들어 있는 Container이다. Frame이나 Dialog와는 달리 Panel은 자체의 독립적인 창을 만들지 않는 컨테이너이다.
    기본적으로 LayoutManager는 FlowLayout이다. Applet의 super Class.

    public class panel extends Container

    생성자
    public Panel ( );
    public Panel ( LayoutManager layout ); //jdk1.1.x에 새로이 정의

    • Button Class 에 대하여

      ** 윈도우 프로그램에서 사용되는 버튼에 대한 정보를 정의하고 있는 클래스
      ** 생성만 하면 기본적인 기능을 사용할 수 있다.


      Public class Button extends Component //Component 객체.

      생성자
      public Button ( ); //비어있는 버튼 생성
      public Button ( String label ); //이름이 있는 버튼 생성

      Method
      setLabel ( String label ) ; //button label를 설정

      Component Method로서 Button의 외양을 변화하는 Method
      setForeground ( Color c );
      setBackground ( Color c );

    Please Mail to me:
    hoya1@shinbiro.com



    예제> Buttons.java
    버튼의 사용을 이해한다.
    .

    download Buttons.zip

    import java.awt.*;
    import java.applet.*;
          
    public class Buttons extends Applet
    {
          Button b1, b2, b3;
          public void init()
          {
                resize(400,100);
                b1 = new Button('B1');
                b2 = new Button('B2');
                b3 = new Button('B3');
                this.add(b1);
                this.add(b2);
                this.add(b3);
          }
    public boolean action(Event ev, Object arg)
    {
          if (ev.target.equals(b1))
          {  
                showStatus('User pressed B1 button!');
                        
     // Requests that the argument string be displayed in the 'status window'.
          }
          if (ev.target.equals(b2))
          {
                showStatus('User pressed B2 button!');
          } 
          if (ev.target.equals(b3))
          {
                showStatus('User pressed B3 button!');
                return true;
          }
    }



    학습 point...
    action event
    boolean action(Event evt, Object arg)

    이벤트들은 Event class에 저장되며 이들 이벤트들은 Component class에서 정의된 메소드들의 의해 처리된다
    'action event'라고 하며 이는 Component class에서 정의된 action()메소드를 호출함

    boolean action(Event evt, Object arg)
         event: Event class 변수로서 이벤트를 발생시킨 component에 대한 정보와 발생돤 이벤트가 저장됨
         object: 이벤트에 대한 component-specific한 정보가 저장(button의 경우 label이 저장됨)
              즉, button이 눌려졌을 때 특정한 일을 수행하도록 하기위해서는 action()메소드를 override하여 사용한다
              (Applet은 최하위 클래스이고 사용자가 개발한 applet은 Applet class보다 더하위클래스임을 기억)

    학습 point...
    Button Class
    - Button(): construct an unlabeled button
    - Button(String s): construct a labeled button
            각 button의 레이블은 유일해야 한다 이는 event handling과 관계가 있기때문
            (버튼을 클릭하면 button event가 발생하는데 button label은 어떤 버튼이 눌려졌는가를 아는데 사용됨)


    예제> Scribble1.java
    .

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

    class grimpan extends Canvas
    //캔버스 클래스에서 우리가 사용할 클래스를 파생 받아 재정의하여 사용
                                                 //Canvas Class는 그림을 그리는 판 역할을 한다.
    {
         Color col;
         Point sijak;
         int dogu;

         public grimpan()
    //Canvas Class의 생성자 Method - 초기화
         {
              resize(298, 346);
              setBackground(Color.white);
              sijak = new Point(0,0);
              col = new Color(0);
         }
         public void paint(Graphics g) //Canvas Class
    의 기본 Method
         {
              g.drawRect(0,0,298,346);
              g.drawRect(1,1,297,345);
              g.drawRect(2,2,296,344);
         }
         public boolean mouseDown(Event evt, int x, int y)
         {
              sijak.x = x; sijak.y = y;
              return true;
         }
         public boolean mouseDrag(Event evt, int x, int y)
         {
              Graphics g = getGraphics();
              g.setColor(col);
              if( dogu==1 )
              {
                   g.drawLine(sijak.x, sijak.y, x, y);
                   sijak.x = x; sijak.y = y;
                   return true;
              }
              return false;
         }
         public boolean mouseUp(Event evt, int x, int y)
         {
              Graphics g = getGraphics();
              g.setColor(col);
              int w,h;
              w = x -sijak.x; h = y - sijak.y;
              if(w < 0)
                 {  w = -w; sijak.x=x; }
              if(h < 0)
                 {  h = -h; sijak.y=y; }
      
              if(dogu == 2)
              {
                   g.drawRect(sijak.x, sijak.y, w, h);
                   return true;
              }
              if(dogu == 3)
              {
                   g.drawOval(sijak.x, sijak.y, w, h);
                   return true;
              }
              return false;
         }
    }

    public class Scribble1 extends Applet
    //Class( 최상위 Class )
    {
         Rectangle red, green, blue;
         Rectangle line, rect, ellipse;
         grimpan gp = new grimpan();

         public void init()
         {
              setLayout(null);
    //Container 객체들의 기본적으로 Layout을 가지고 있다.//Layout 설정을 해제함
              resize(302,460);
              red = new Rectangle(2,2,98,50);
              green = new Rectangle(102,2,98,50);
              blue = new Rectangle(202,2,98,50);

              line = new Rectangle(2, 400, 98, 50);
              rect = new Rectangle(102, 400, 98, 50);
              ellipse = new Rectangle(202, 400, 98, 50);

              add(gp);
    //그림판의 추가 add( Component comp);
              gp.move(2, 54);
    //그림판의 위치설정
         }
         public void paint(Graphics g)
         {
              g.setColor(Color.red);
              g.fillRect(red.x, red.y, red.width, red.height);
              g.setColor(Color.green);
              g.fillRect(green.x, green.y, green.width, green.height);
              g.setColor(Color.blue);
              g.fillRect(blue.x, blue.y, blue.width, blue.height);
              g.setColor(Color.black);
              g.drawString('RED',5,20);
              g.drawString('GREEN',105,20);
              g.drawString('BLUE',205,20);
              g.drawRect(line.x, line.y, line.width, line.height);
              g.drawRect(rect.x, rect.y, rect.width, rect.height);
              g.drawRect(ellipse.x, ellipse.y, ellipse.width, ellipse.height);
              g.drawString('Line',5,420);
              g.drawString('Rect',105,420);
              g.drawString('Ellipse',205,420);
         }
         public boolean mouseDown(Event evt, int x, int y)
         {
              if(red.inside(x,y))
              {
                   gp.col = Color.red;
                   return true;
              }
              if(green.inside(x,y))
              {
                   gp.col = Color.green;
                   return true;
              }
              if(blue.inside(x,y))
              {
                   gp.col = Color.blue;
                   return true;
              }
              if(line.inside(x,y))
              {
                   gp.dogu = 1;
                   return true;
              }
              if(green.inside(x,y))
              {
                   gp.dogu = 2;
                   return true;
              }
              if(blue.inside(x,y))
              {
                   gp.dogu = 3;
                   return true;
              }
              return false;
         }
    }
          

     

    학습 point...
    rectangle class
    1. 생성자 :public Rectangle( int x, int y, int width, int height );
    //위 예제에서 먼저
        red = new Rectangle(2,2,98,50);      green = new Rectangle(102,2,98,50);     blue = new Rectangle(202,2,98,50);      line = new Rectangle(2, 400, 98, 50);    rect = new Rectangle(102, 400, 98, 50);     ellipse = new Rectangle(202, 400, 98, 50); 로 다섯개의 Retangle을 선언하였다.


    2.  사각형 채우기 
    g.setColor(Color.red);   g.fillRect(red.x, red.y, red.width, red.height);    g.drawString('RED',5,20);...................
    각각 다섯개의 사각형에 색깔을 채우고 그린후....글자 표현...........

    3.Public boolean inside ( int x, int y );
    --> 정해진 사각형( Rectangle의 범위) 속을 클릭했는지를 판단한다. 사각형의 속을 선택했다면 true의 값을 그렇지 않다면 false의 값을 반환한다.
            if(red.inside(x,y))
              {
                   gp.col = Color.red;
                   return true;
              }............................
    정해진 사각형 red 속을 클릭하면.. grimpan class의 col에 빨간색을 부여한다.


    15. LayoutManager 에 대하여

    모든 Container계열의 Class들은 기본적인 구성요소 정열 방식인 Layout을 갖는다.
    java.awt.LayoutManager
    Panel계열의 Class는 기본적으로 FlowLayout을 Window계열의 Class는 기본적으로 BorderLayout을 각각 가진다.


    Layout의 종류

    1. FlowLayout
    2. GridLayout
    3. BorderLayout
    4. CardLayout
    5. GridBagLayout
    6. GridBagConstraints

    • FlowLayout Class에 대하여

      가장 기본적인 LayoutManager이다. Panel들의 기본값이라고 보면 정확하다. 이것은 수평적으로 그래픽 요소들을 배치하고 가 요소의 간격을 스페이스 간격으로 구분한다. Flow Layout이 버튼을 어떻게 위치시키는지는
      예제 8. Buttons을 보면 된다.
      하위 윈도우들을 왼쪽에서 오른쪽으로 한 줄로 정렬한다. Container 윈도우가 add() 도구를 사용하면 왼쪽에서부터 차례로 하위 윈도우를 추가시킨다. static int 상수로 LEFT, RIGHT, CENTER가 있어 정렬 방식을 지정할 수 있다. Panel 클래스(Panel의 자식 클래스인 Applet 클래스를 포함하여)는 레이아웃 관리자를 별도로 지정하지 않을 경우 기본값으로 FlowLayout을 레이아웃 관리자로 지정한다.

      public class FlowLayout extends Object implements LayoutManager, Serializable

      생성자
      FlowLayout ( );
      FlowLayout ( int align );
      FlowLayout ( int align, int hgap, int vgap ); //hgap과 vgap은 구성요소 사이의 간격

      멤버 변수
      public static final int CENTER;
      public static final int LEFT;
      public static final int RIGHT;

      구성요소의 추가
      Container Class 속의 Component add ( Component comp );


    • GridLayout Class에 대하여

      Applet의 구성요소 정렬을 격자창과 같이 이루는 정렬 Class로 cell단위로 구성요소를 이동시킬수 있다.
      컴퍼넌트를 일정한 행과 열의 그리드(격자)로 구분하여 해당 그리드 안에 하위 윈도우를 하나씩 배치한다.인자가 없는 생성자는 1행, 1열의 그리드로 간주한다.

      public class GridLayout extends Object implements LayoutManager, Serializable

      생성자
      public GridLayout ( );
      public GridLayout ( int rows, int cols ); //rows는 행의 개수, cols는 열의 개수.
      public GridLayout ( int rows, int cols, int hgap, int vgap );//rows는 행의 개수, cols는 열의 개수, hgap 수직차이. vgap 수평차이.


    • BorderLayout Class에 대하여

      Applet을 방위와 같은 지역으로 나누어 졍렬하는 Class로서 다석개의 영역인 'North', 'West', 'East', 'South', 'Center' 등으로 5부분으로 나누어 정렬한다. 즉 패널을 중앙부분과 동서남북으로 나누어 배치한다. 이를 이용해 원하는 장소에 직접 버튼을 그릴 수 있다.

      public class BorderLayout extends Object implements LayoutManager, Serializable

      생성자
      public BorderLayout ( );
      public BorderLayout ( int hgap, int vgap );

      멤버 변수
      public static final String CENTER;
      public static final String EAST;
      public static final String NORTH;
      public static final String SOUTH;
      public static final String WEST;

    • 구성요소 추가Method 정리 // Component Class속에 정의되어 있음.

      Component add ( Component comp ); // 'FlowLayout' or 'GridLayout'에서 사용
              add ( String name, Component comp ); // 'BorderLayout' or 'CardLayout'에서 사용.
              add ( Component comp, int index );
                      ex)) add ('North', new Button ('One'));

      Layout Setting Method //Container Class에 정의되어 있음.
              setLayout ( LayoutManager mgr );
              setLayout ( null ); // Layout을 해제함.
       
      예제> Boder.java
      BorderLayout 예제

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

    public class Border extends Applet
    {
           Button b1, b2, b3, b4, b5;
           public void init()
           {
                  setLayout(new BorderLayout());//Layout을 BorderLayout으로 지정
                  b1=new Button('Center');//'Center'라는 이름의 버튼 지정
                  b2=new Button('East');
                  b3=new Button('West');
                  b4=new Button('South');
                  b5=new Button('North');
                  add('Center', b1);//b1버튼을 가운데 위치
                  add('East', b2);
                  add('West', b3);
                  add('South', b4);
                  add('North', b5);
           }
    }


    Please Mail to me:
    hoya1@shinbiro.com



    예제> Scribble_b.java
    **색상 선택 및 도구 선택을 버튼으로 이용해 세련된 모양을 갖춤.
    **유사 행동에 대한 이벤트처리 ( action Method ) 이용
    **draw Method의 한계를 프로그램 로직으로 극복
    .

    import java.awt.*;
    import java.applet.*;
              
    public class Scribble_b extends Applet
    {
          Color col;
          int dogu;
          Point sijak;
          Panel c_panel,d_panel;

          public void init()
          {
                this.resize(500,460);
                this.setBackground(Color.white);
                col = new Color(0);
                sijak = new Point(0,0);
                dogu = 1;

                c_panel = new Panel();
                c_panel.setLayout(new GridLayout(4,2));
                c_panel.add(new Button('Red'));
                c_panel.add(new Button('Blue'));
                c_panel.add(new Button('Green'));
                c_panel.add(new Button('Gray'));
                c_panel.add(new Button('Cyan'));
                c_panel.add(new Button('Magenta'));
                c_panel.add(new Button('Yellow'));
                c_panel.add(new Button('Black'));

                d_panel = new Panel();
                d_panel.setLayout(new GridLayout(1,3));
                d_panel.add(new Button('Line'));
                d_panel.add(new Button('Rectangle'));
                d_panel.add(new Button('Ellipse'));

                this.setLayout(new BorderLayout());
                this.add('North', new Button('Scribble'));
                this.add('West',c_panel);
                this.add('South', d_panel);
          }
          public boolean mouseDown(Event evt, int x, int y)
          {
                sijak.x = x;
                sijak.y = y;
                return true;
          }
          public boolean mouseDrag(Event evt, int x, int y)
          {
                Graphics g = getGraphics();
                g.setColor(col);
                if(dogu == 1)
                {
                      g.drawLine(sijak.x, sijak.y, x, y);
                      sijak.x = x;
                      sijak.y = y;
                      return true;
                }
                return false;
          }
          public boolean mouseUp(Event evt, int x, int y)
          {
                Graphics g = getGraphics();
                g.setColor(col);
                int w, h;
                w = x - sijak.x;
                h = y - sijak.y;
                if(w < 0) //
    폭 값의 양수 값 얻음.
                      { w = -w; sijak.x=x; }
                if(h < 0)
                      { h = -h; sijak.y=y; }
                if(dogu == 2)
                {
                      g.drawRect(sijak.x, sijak.y, w, h);
                      return true;
                }
                if(dogu == 3)
                {
                      g.drawOval(sijak.x, sijak.y, w, h);
                      return true;
                }
                return false;
          }
          public boolean action(Event evt, Object arg)
          {
                if(evt.target instanceof Button)
                {
                      if(arg.equals('Red'))
                            col = Color.red;
                      if(arg.equals('Blue'))
                            col = Color.blue;
                      if(arg.equals('Green'))
                            col = Color.green;
                      if(arg.equals('Gray'))
                            col = Color.gray;
                      if(arg.equals('Cyan'))
                             col = Color.cyan;
                      if(arg.equals('Magenta'))
                            col = Color.magenta;
                      if(arg.equals('Yellow'))
                            col = Color.yellow;
                      if(arg.equals('Black'))
                            col = Color.black;
                      if(arg.equals('Line'))
                            dogu = 1;
                      if(arg.equals('Rectangle'))
                            dogu = 2;
                      if(arg.equals('Ellipse'))
                            dogu = 3;
                            return true;
                }
                return false;
          }
    }
          

     

    학습 point...
    Button Event

          public boolean action(Event evt, Object arg)
          {
                if(evt.target instanceof Button)
                {
                      if(arg.equals('Red'))
                            col = Color.red;
                    ......................................
                            return true;
                }
                return false;
          }
          


    16. Card Layout에 대하여

    public CardLayout extends Object implements LayoutManager
    - Windows 프로그램의 '탭 설정 Window'의 기능을 구현하는 Layout이다.
    - 복수의 페이지를 설정, 각각의 페이지에 별도의 디스플레이를 구현한다.

    탭 대화상자(tabbed dialogs)나 동적인 대화상자를 가능하게 하는 레이아웃 관리자 클래스이다. 여러 장의 카드가 있으나 보이는 카드는 하나만 있다는 개념에서 나온 이름이다. add 메소드를 실행할 때 각 카드를 식별할 수 있는 문자열을 지정해야 하고, 나중에 show 메소드에 이 문자열을 인자로 줘서 해당 카드가 보이게 할 수 있다. first(), last(), next(), previous() 등의 도구를 사용하여 카드 간에 순차적으로 이동할 수도 있다. 사용 방법은 다음 예제를 참고한다. 예제에서는 간단히 하기 위해 카드로 버튼을 사용하고 있으나 실제로는 여러 컴퍼넌트를 포함하는 패널이나 그래픽 요소를 담은 캔버스와 같은 것이 주로 사용될 것이다.

    생성자 CardLayout ( );
    CardLayout ( int hgap, int vgap );
    Parameter hgap, vgap : 삽입되는 구성 요소간의 수평/수직 공간 ( 픽셀 단위 ) 을 지정한다.
    Method
    CardLayout에 구성요소를 삽입하기 위해서는 Container에 정의되어 있는 add Method를 사용.
    Component add ( String name, Component comp );
    Parametername : CardLayout의 페이지의 레이블 ( 이름 ) comp : 추가시킬 구성요소 객체

    Ex)) add ( Page 1, new Button ( 'One' )); // CardLayout의 Page 1이라는 레이블이 붙은 페이지에 단추를 추가한다.

    CardLayout에서 새 페이지로 전환하기 원할 때에는 show Method를 사용한다.
    void show (Container parent, String name );
    Parameterparent : CardLayout이 설정된 모 Container를 지정한다. name : CardLayout의 구성 페이지 이름

    CardLayout에서의 페이지 플리핑
    CardLayout이 설정되어 있는 Container 객체에 많은 페이지가 설정되어 있을 때 각 페이지로의 이동을 용이하게 하는 Method들.
    Parmeter에서 이야기하는 parent는 CardLayout이 설정되어 있는 Container 객체를 가르킨다.

    위치상 가장 앞에 등록된 페이지 즉, 가장 앞 페이지로 이동하는데 사용하는 first Method
    void first ( Component parent );

    *위치상 바로 앞 페이지로 이동할 때 사용하는 previous Method
    void previous(Component parent);

    *위치상 바로 뒤 페이지로 이동할 때 사용하는 next Method
    void next ( Component parent );

    *위치상 가장 뒷 페이지로 이동할 때 사용하는 last Method
    void last ( Component parent );
    Parameterparent : CardLayout이 설정된 모 Container를 지정한다.

     

     

     
    예제>card_test.java
    Card Layout 예제

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

    public class Border extends Applet
    {
           CardLayout card_layout = new CardLayout();
           Panel control_panel = new Panel();
           Panel page1_panel = new Panel();
           Panel card_panel = new Panel();

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

                  control_panel.add(new Button('Page1'));
                  control_panel.add(new Button('Page2'));
                  control_panel.add(new Button('Page3'));
                  add('North', control_panel);

                  card_panel.setLayout(card_layout);
                 
    page1_panel.add(new Label('First Page',Label.CENTER));
                  page1_panel.add(new Label('Java World is Programming'));

                  card_panel.add('1th',
    page1_panel);
                  card_panel.add('2th', new Label('This is Secound Page', Label.CENTER));
                  card_panel.add('3th', new Label('Last Page ByeBye', Label.CENTER));
                 
                  add('Center', card_panel);
           }

           public boolean action(Event evt, Object arg)
           {
           if(evt.target instanceof Button)
           {
                  if(arg.equals('Page1'))
                  {
                         card_layout.show(card_panel, '1th');
                         return true;
                  }
                  if(arg.equals('Page2'))
                  {
                         card_layout.show(card_panel, '2th');
                         return true;
                  }
                  if(arg.equals('Page3'))
                  {
                         card_layout.show(card_panel, '3th');
                         return true;
                  }
           }
           return false;
           }
    }


    Please Mail to me:
    hoya1@shinbiro.com


    17. LayoutManager 사용하지 않고 구성요소를 지정하기

    • Container객체에 Layout 사용하지 않을 경우에는 기본적으로 잡혀있는 Layout 해제해야만 한다.
      setLayout ( null ); //layout 해제
    • Applet 같은 Panel계열의 Container객체들은 기본적으로 FlowLayout,
      Frame 같은 Window계열의 Container객체들은 기본적으로 BorderLayout 가진다.

    void reshape ( int x, int y, int width, int height );
    Component Class 정의되어 있다

    Parameter

    x추가되는 구성요소 왼쪽 상단의 좌표를 나타냄.
    y
    width추가되는 구성요소 폭과 높이의 수치를 나타냄
    height

     

  • reshape Method 대신해서 구성요소의 위치를 지정할 있는 Method

    void move ( int x, int y ); //구성요소의 위치( 좌표값 ) 결정하는 Method.
                 JDK1.0.x
    a JDK1.1.x version경우
                              setLocation ( int x, int y );
                              setLocation ( Point p );

    void resize ( int width, int height ); //구성요소의 크기를 결정하는 Method
    void resize ( Dimention d );
                 JDK1.0.x
    a JDK1.1.x version경우
                              setSize ( int width, int height );
                              setSize ( Demention d );

  •  

     
    예제>no-layout.java
    button1을 누르면 button5가 button2를 button4가 사라지게 하고, 다시 button3을 누르면 사라졌던 button4와 button5를 나타나게 하는 applet. 여기서는 기본 Layout을 해제하고 스스로 위치를 정하는 것을 연습하는 프로그램.

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

    public class no_layout extends Applet
    {
           Button button1 = new Button('Button 1');
           Button button2 = new Button('Button 2');
           Button button3 = new Button('Button 3');
           Button button4 = new Button('Button 4');
           Button button5 = new Button('Button 5');

           public void init()
           {
                  setSize(300,150);
                  setBackground(Color.gray);
                  setLayout(null);
                  add(button1);
                  add(button2);
                  add(button3);
                  add(button4);
                  add(button5);

                  button1.reshape(0,0,100,50);
                  button3.reshape(100,50,100,50);
                  button2.reshape(200,0,100,50);
                  button4.reshape(0,100,100,50);
                  button5.reshape(200,100,100,50);
           }
           public boolean action(Event evt, Object arg)
           {
                  if(evt.target == button1)
                  {
                         if(button5 != null)
                         {
                                remove(button5);
                                button5 = null;
                                return true;
                         }
                  }
                  if(evt.target == button2)
                  {
                         if(button4 != null)
                         {
                                remove(button4);
                                button4 = null;
                                return true;
                         }
                  }
                  if(evt.target == button3)
                  {
                         if(button5 == null)
                         {
                                button5 = new Button('Button 5');
                                add(button5);
                                button5.reshape(200, 100, 100, 50);
                         }
                         if(button4 == null)
                         {
                                button4 = new Button('Button 4');
                                add(button4);
                                button4.reshape(0,100,100,50);
                         }
                         return true;
                  }
           return false;
           }
    }


    Please Mail to me:
    hoya1@shinbiro.com


    18. TextField Class 에 대하여

    • 텍스트 입력을 받기 위해 사용되는 구성요소.( Component에서 상속된 TextComponent에서… )
    • java.awt Package에 포함되어 있는 Class
      public class TextField extends TextComponent

    • 생성자
      public TextField ( );
      public TextField ( String text );
      public TextField ( int Columns );
      public TextField ( String text, int Columns );
    • 매개변수
      String text 텍스트필드속에 들어갈 문자열
      int Columns 텍스트필드의 크기를 결정.
    • 멤버 Method
      char getEchoChar ( );
      void setEchoChar ( char c );
      void setEchoCharactor ( char c );
      //비밀 번호 사용시
      String getText ( );
      //입력된 TextField속의 값을 구함.
     
    예제>gugu.java
    입력된 수를 받아들여 그 수의 구구단을 출력하는 예제

    import java.awt.*;
    import java.applet.*;
           
    public class gugu extends Applet
    {
           Label su = new Label('Dan: ');
           TextField input_dan = new TextField('input number',12);
           Button DanOut = new Button('DAN');
           int dan;
           public void init()
           {
                  add(su);
                  add(input_dan);
                  add(DanOut);
           }
           public void paint(Graphics g)
           {
                  if(dan != 0)
                  {
                         for(int i=1;i<=9;i++)
                         {
                                g.drawString(dan + '*' + i + '=' + dan*i,70,45+20*i);
                         }
                  }
          }
           public boolean action(Event evt, Object arg)
           {
                  if(evt.target == DanOut)
                  {
                         String str;
                         str = input_dan.getText();
                         dan = Integer.parseInt(str);
                         repaint();
                         return true;
                  }
           return false;
           }
    }


    Please Mail to me:
    hoya1@shinbiro.com



    예제> eye.java

    import java.awt.*;
    import java.applet.*;
              
    class eye extends Applet
    {
              int eye_x,eye_y;
              int R=25,r=10;
    //큰원의 반지름을 25 작은 원의 반지름을 10으로 한다.
              boolean gam; //
    감는 경우는 TRUE 눈동자 굴릴 경우 FALSE 한다.
              Rectangle gamjak;

              public void init()
              {
                        resize(300,250);
                        setBackground(Color.blue);
    //바탕색을 파랑색으로...
                        eye_x=115; eye_y=115;
    //왼쪽 눈동자의 시작 좌표.
                        gam=true;
    //초기에는 감는 눈을 그린다.

                        gamjak = new Rectangle(100,100,100,50);//
    전체 두눈의 사각형 범위
              }

              public void paint(Graphics g)
              {
                        if (gam)
                        {
                                   
    //감는 눈을 그린다.
                                  g.setColor(Color.gray);
                                  g.fillOval(100,100,R*2,R*2);
                                  g.fillOval(150,100,R*2,R*2);
                                  g.setColor(Color.black);
                                  g.drawOval(100,100,R*2,R*2);
                                  g.drawOval(150,100,R*2,R*2);
                                  g.drawLine(100, 100+R, 100+R*4, 100+R);
                        }
                        else
                        {
                                 
     //색을 흰색 테두리를 검은 색으로 하는 큰원 두개 그리기....
                                  g.setColor(Color.white);
                                  g.fillOval(100,100,R*2,R*2);
                                  g.fillOval(150,100,R*2,R*2);
                                  g.setColor(Color.black);
                                  g.drawOval(100,100,R*2,R*2);
                                  g.drawOval(150,100,R*2,R*2);

                                  
    //눈동자 두개 그리기.
                                  g.setColor(Color.black);
                                  g.fillOval(eye_x,eye_y,r*2,r*2);
                                  g.fillOval(eye_x+R*2,eye_y,r*2,r*2);
                        }
              }
              public void update(Graphics g)
              {
                        paint(g);
              }

              public boolean mouseMove(Event evt, int x, int y)
              {
                        if(gamjak.inside(x, y ))
                        {
                                  gam = true;
    //눈동자 내에서는 언제나 눈을 감고 있게 한다.
                                  repaint();
                                  return true;
                        }
                        else
                        {
                                  gam=false;
                                  
                               
       //삼각 함수를 이용 마우스의 위치에 따라 눈동자가 움직이게 한다.
                                  int m_x=x-125; int m_y=y-125;
                                  int a=(int)((R-r)*m_x/Math.sqrt((m_x)*(m_x)+(m_y)*(m_y)));
                                  int b=(int)((R-r)*m_y/Math.sqrt((m_x)*(m_x)+(m_y)*(m_y)));

                                  eye_x=a+125-10;
                                  eye_y=b+125-10;

                                  repaint();
                                  return true;
                        }
              }
    }


    예제> buttonlink.java

    자바의 네트위킹에서 웝상에 연결한다..

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

    public class buttonlink extends Applet
    {
          Bookmark bmlist[]=new Bookmark[3];

          public void init()
          {
                bmlist[0]=new Bookmark('Daeho's homePage','http://www.shinbiro.com/~hoya1/main.html');
                bmlist[1]=new Bookmark('LG-EDS SYSTEM','http://www.lgeds.lg.co.kr');
                bmlist[2]=new Bookmark('JAVASOFT','http://wwwjavasoft.com');
                setLayout(new GridLayout(bmlist.length,1,10,10));
                for (int i=0; i             {
                      add(new Button(bmlist[i].name));
                }
          }

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

          void LinkTo(String name)
          {
                URL theURL=null;
                for (int i=0; i             {
                      if(name.equals(bmlist[i].name))
                      theURL=bmlist[i].url;
                      if(theURL != null)
                            getAppletContext().showDocument(theURL);
                }
          }

          class Bookmark
          {
                String name;
                URL url;
                Bookmark(String name, String theURL)
                {
                      this.name=name;
                      try
                      {
                            this.url=new URL(theURL);
                      }
                      catch(MalformedURLException e)
                      {
                            System.out.println('Bad URL'+theURL);
                      }
                }
          }
    }

     

    학습 point...
        애플릿을네트워크를 통한 웹과의 연결
    새로운 웹 페이지에 연결하기 위해서는 URL클래스의 인스턴스를 만들어야 한다.. 이러한 URL클래스를 만드는 방법은 아래 4가지가 있다.

    URL(String, String, int, String)
         
    여기에는 사용하는 프로토콜, 접속할 호스트 이름, 사용할 포트 번호, 파일 이름이난 경로명을 정의 하게 되어있다.
    URL(String, String, String)
         
    여기에는 사용하는 프로토콜, 접속할 호스트 이름, 파일 이름이난 경로명을 정의 하게 되어있다.
    URL(URL, String)
         
    이것은 기본 경로 혹은 상대 경로를 주어서 URL을 만드는 것이다. 기본 경로를 위해 현재의 HTML파일의 URL을 위한 getDocumentBase( ) 를 사용할 수 있고, 자바 클래스의 URL을 위해 getCodeBase( )를 사용할 수 있다.
    URL(String)
         
    이것은 URL 문자열을 통해 URL객체를 만든다.

    학습 point...
        예외 처리(Exception Handling)
    예외 처리는 C++와 문법이 거의 같다. 즉, try, catch, throw 구문을 사용한다.
    다음은 전형적인 예외 처리 구문이다.
    try {    
    Thread.currentThread().sleep(1000);}catch ( InterruptedException e ) {    
    System.out.println('Sleep interrupted!!!');}

    try 블록은 예외가 발생할 수 있는 실행문들을 포괄하는 블록이며 catch는 try 블록에서 예외가 발생한 경우 이를 처리하는 블록이다. 또, throw는 예외를 발생시키는 예약어이다.
    이 구문에서 예외를 발생시킬 가능성이 있는 메소드는 java.lang.Thread 클래스의 sleep()으로 다음과 같이 선언되어 있다.

    public static void sleep(long millis) throws InterruptedException

    메소드 안에서 throw가 쓰일 경우 C++에서와 마찬가지로 throw의 대상은 클래스 인스턴스이다. 예를 들면 다음과 같다.

    class RangeException extends 
    Exception {    // RangeException 예외 클래스 선언문 
    몸체} class Sample {    try {        
    getRange(i);    } catch(RangeException e) {        System.out.println('범위 밖의 
    값입니다.');    }     getRange (int i) {        if (i>10) {            throw 
    new RangeException();        }        ...    }}

    C++와 달리, 자바에서는 예외 처리와 관련한 또하나의 예약어 finally가 있다.
    catch(Exception e){} 블록과 달리 finally {} 블록의 내용은 try {} 블록의 실행 결과에 무관하게 항상 실행된다. 예를 들면 다음과 같다.

    try {        if (music != null) {
                    music.loop();        }        
    ... 생략(실행할 내용들)...} finally {        if (music 
    != null) {                music.stop();        }}

    위 예에서는 music이라는 이름의 오디오 파일을 반복해서 연주하면서 다른 실행문들을 수행하다가, 그 실행문들의 수행이 끝나거나 혹은 수행 중에 어떤 예외나 break, continue 문 등을 만나서 try 블록을 탈출하더라도 finally 블록을 무조건 수행하게 되어 오디오 파일 연주를 반드시 중단시키게 된다. 이 finally 블록은 주로 파일이나 네트웍 소켓 등과 같이 일단 연 다음, 어떠한 예외 상황이 발생하더라도 반드시 닫아야만 하는 리소스를 관리하는 데 흔하게 사용된다.

    덧글
    [0]
     |
    엮인글
    [0]
     |
    공감
    [0]
    친구에게 알리기
      이동 | 수정 | 삭제


    관련글 더보기