Java Tutorial :
VRML(Virtual Reality Modeling Language)은 실리콘 그래픽스에서
개발한 3차원 모델링 언어로 웹의 단점인 2차원적인 접근 방식의 문제점을
해결하기 위해 개발한 언어이다. VRML은 그 기능에 대한 우수성이 예전부터
높게 평가되고 있었으나 기존 HTML과의 호환의 문제점으로 인해
많은 장애를 가지고 있었다. 현재 지금은 Netscape에서 VRML을 지원하기 위해
몇가지 제품의 플러그-인을
제공하고 있으며, 자바 언어에서도 올 여름에 나올 JDK 1.1 API쪽에
VRML을 표현하기 위해 클래스 라이브러리가 확장될 예정이어서 결국
VRML과 자바는 동일 선상에 놓여질 것으로 기대되고 있다.
위에서 열거한 두가지 기술의 공통점은 결국 기존 웹이 가지는 단편적이고 평면적인 문제점들을 해결하기 위한 대안으로서 제안된 것임을 알 수 있다. 자바는 선 마이크로시스템즈에서 개발한 차세대 객체지향 언어로 출발점에서는 위의 두가지 기술들과 많은 차이는 있지만 자바 역시, 궁극적으로는 기존 웹의 단점을 보완하기 위한 프로그램 언어라고 볼 수 있다. 특히 자바는 언어 자체에서 분산환경을 지원하는 네트웍 언어임으로 WWW API와 같은 기능을 지원하면서도 플랫폼에 독립적인 환경을 구축할 수 있다는 장점을 가지고 있으며, VRML을 포함할 수 있다는 확장성으로 인해 위에서 열거한 두가지 차세대 기술력을 모두 포함하는 WWW의 주요한 기술로 인정되고 있다.
그림 1은 자바 애플릿을 이용하여 네트웍을 통해 여러 사용자간의
실시간 시뮬레이션 게임의 예를 나타낸것이다.
그림 2는 VRML과 같은 새로운 데이타 타입의 플러그-인 뿐만 아니라
S-HTTP, Multicast과 같은 프로토콜도 플러그-인 할 수 있다.
참고로 Netscape의 플러그-인 기술은 데이타만을 플러그-인 할 수 있다.
class Car {
int door;
public Car() {
door = 4;
}
void number_of_door() {
System.out.println(door);
}
int maxSpeed() {
return 180;
}
}
class Granduer extends extends Car {
int maxSpeed() {
return 220;
}
}
위의 자바로 구현한 두 클래스간의 관계를 보면, Granduer는 extends로 정의되어
Car의 서브클래스이다.
즉 Car의 모든 속성(variable, 메소드 ..)들은 Porsche로 상속된다. 뿐만아니라
Porsche 클래스에서는 maxSpeed()를 다시 정의함으로서 메소드
오버라이드가 가능하다. 이러한 특징들은
일반적인 객체지향 언어가 가지고 있는 기능들이다.
또한 자바는 이러한 단순함을 가지면서도 C/C++에서 제공되지 않은 가비지 수집(garbage collection), 쓰레드 동기화, 풍부한 클래스 라이브러리 등 추가적인 기능을 제공한다. 자동적인 가비지 수집으로 메모 리 관리를 위해 사용자가 일일이 프리(free) 선언을 해 오던 불편함을 해소했으며, Xerox CeDAr/Mesa에서 따온 쓰레드 동기화는 멀티쓰레드 프로그램을 더욱 간단히 구성하도록 도와준 다. 또한 구문 자체가 단순해 진 반면, 사용자 인터페이스 그래픽, 네트워크 등을 지원하는 풍부한 클래스 라이브러리를 지원함으로서 사용자가 직접 프로그램해야 하는 로드를 많이 줄여준다.
public synchronized void stop() {
if (kicker != null) {
kicker.stop() ;
kicker = null;
}
}
private syncronized void startSort() {
if (kicker ==null || !kicker.isAlive()) {
kicker = new Thread(this);
kicker.start();
}
}
이 프로그램은 자바 멀티쓰레드 프로그램의 동기화에 대한 예제로서
한 프로그램내에 두 개의 메소드 stop()과 startSort()를 쓰레드로 구현한 것이다.
stop()과 startSort(), 두 메소드는
kicker라는 공통된 변수를 공유하고 있다. 이 두 메소드는 syncronized 라고 선언되어
동시에 수행될 수 없다. 따라서 공유되는 변수 kicker의 모니터링을
통해 일정 순간에 한 메소드만이 수행되게 되어
kicker 변수의 값에 따른 연속적인 일을 수행하게 된다.
자바와 핫자바의 관계는 핫자바가 자바로 만든 브라우저라고 이해하면 쉽게 입증되는 반면, WWW 브라우저의 75 %을 차지하는 Netscape와 최초의 자바 브라우저인 핫자바와는 그 의미부터 조금 다르다. 핫자바의 진정한 의미는 애플릿 브라우징에도 있지만, 실질적으로는 자바 애플리케이션 이라는 중요한 의미를 가지고 있다. 즉, 자바 애플릿(96년 2월 현재 알파 애플릿만을 지원)을 웹 브라우저에서 표현할 수 있다는 것외에도, 자바의 특징인 프로토콜의 동적인 결합, 새로운 데이타 타입의 확장이 가능한 브라우저로서 자바로 인한 기술혁신을 예고하는 자바 소트프웨어라는 의미를 갖고있다.
애플릿은 다운로드되어 사용되어 진다. 따라서 클라이언트쪽의 안전성과 보안의 문제로 애플리케 이션과는 다른 다음과 같은 제약점을 가지고 있다.
ftp://cair-archive.kaist.ac.kr/pub/WWW/Java/Javasoft/pub/*
JDK 1.0 버젼은 Netscape와 같은 자바-가능 브라우저에 의해 지원되며, 패키지내에는 핫자바
브라우저 대신 애플릿 뷰어만 포함되어 있다.
핫자바 JDK 1.0 버젼도 96년 상반기중에 발표될
예정이다. Solaris2.x용으로 제공되는 JDK 1.0은 다음과 같은 구성으로 되어있다.
% appletviewer [option] URL | file자바 프로그램의 디버깅을 위해서는 다음과 같이 애플릿 뷰어의 구동시에 디버거 옵션을 지정할 수 있다.
% appletviewer -debug URL | file자바 컴파일러는 자바 애플릿과 애플리케이션 프로그램을 컴파일할 때 사용되며,
% javac Source_filename자바 인터프리터는 자바 컴파일러에 의해 생성된 바이트 코드를 수행하고자 할 때 사용된다.
% java Byte_Code_filename
<APPLET
[CODEBASE = codebaseURL]
CODE = appletFile
[ALT = alternateText]
[NAME = appletInstanceName]
WIDTH = pixels HEIGHT = pixels
[ALIGN = alignment]
[VSPACE = pixels] [HSPACE = pixels]
>
[< PARAM NAME = appletAttribute1 VALUE = value >]
[< PARAM NAME = appletAttribute2 VALUE = value >]
. . .
[alternateHTML]
</APPLET>
각 태그 사용법에 대해 알아보면 다음과 같다.
예) CODEBASE = /home/java/mkshin/classes
예) CODE = test.class
예) ALT = "Sorry !, This Applet is written in JDK beta."
예) NAME = AppletClient1
예) WIDTH = 300 HEIGHT = 200
예) ALIGN = middle
예) VSPACE = 10 HSPACE = 20
예) <PARAM NAME=lbl VALUE="This is the next best thing">
예) <em>
You're viewing this page with a browser
that doesn't understand the APPLET tag.
</em>


자바와 자바 스크립트의 차이점은 다음과 같다.
자바스크립트에서 사용가능한 개체들은 다음과 같다.
<head>
...
<script language="javascript">
...
function isanum(s) { ... }
...
function qty_check(str) {
if (!isanum(str) {
alert("Please enter number for quantity");
return false;
}
return true;
}
</script>
</head>
<body>
...
<form name="widget_order"
action="foo.cgi" method="post">
How many widgets today?
<input type="text" name="quantity"
onChange="qty_check(this.value)">
...
</form>
자바스크립트에서 서용하는 객체들은 다음을 포할 수 있다.
// comment on one line /* comment on one or more lines */ /** decumenting comment식별자는 객체와 변수의 이름들을 지정하기 위해 사용되며, 일반 문자나 "_", 또는 "$"로 시작해야 한다.
자바에서 사용되는 키워드는 아래와 같으며, 이중에서 const, future, generic, goto, operator, rest, var 는 정의는 되었으나 JDK 1.0에서는 사용되지 않는다.
abstrac do implements package throw boolean double import private throws break else inner protected transient byte extends instanceof public try case final int rest var cast finally interface return void catch float long short volatile char for native tatic while class future new super const generic null switch continue goto operator synchronized default if outer this
String hello = "Hello";
String world = "World";
System.out.println(hello + " " + world);
int len = hello.length()
String str = hello.substring(1, len);
System.out.println("j" + str);
스트링은 자바 클래스 계층 구조상,
java.lang.String 클래스에서 정의된 타입으로 일반 객체지향
언어와 동일하게 그 클래스에서 정의된 메소드를 사용할 수 있다.
예를들어 위의 예에서
사용한 length()는 스트링의 길이를 알아내는 메소드이며,
substring(1, len)은 파라미터 값으로 주어진 인덱스에 맞는 스트링의 일부분만을
가져오는데 사용되는 메소드로 정의되어 있다. 위의 예에서
len 변수에는 5의 값이 할당된다.
배열은 다른 복합 자료형과 마찬가지로 new 연산자를 사용하여 생성되며, 첫번째 인덱스는 0에서 시작한다
int rgb[] = new int[3];
rgb[0] = 255;
rgb[1] = 100;
....
배열도 마찬가지로 length라는 변수를 이용하며, 배열의 크기를 알아낸다.
사용된다.
int avg = rgb[1] / rgb.length;
다중 배열을 사용하기 위해서는 배열의 배열을 사용할 수 있다.
int a[][] = new int[10][3]
이때 a.length에는 10이 a[0].length에는 3이 할당된다.
if (expr) statment else statement
for (expr; expr; expr) statement
while (expr) statement
do statment whiel (expr);
switch (expr) { ... }
. [] () ++ -- ! ~ instanceof * / % + - << >> >>> < > <= >= == != & ^ | && || ?: = op= ,
[Class Modifiers] class Classname
[extends Superclassname]
[implements Interface, {, Interface}]
{
ClassBody
}
Class Modifier는 그 클래스를 접근할 수 있는 권한이나 특징 등을 부여하는 것으로 다음과
같은 Modifier가 사용된다.
메소드란 클래스에서 수행가능한 일(연산)을 나타내며, 메소드 정의 부분은 다음과 같이 선언한 다.
[Modifier] returnType methodName (parameterList) {
[method body]
}
사용되는 메소드 modifier는 다음과 같다.
native 메소드로 선언된 자바 코드(Helloworld.java)를 작성하고, native 메소드를 부르는 메인 프로그램(Main.java)을 작성한다.
// Helloworld.java
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
}
// Main.java
class Main {
public static void main(String args[]) {
new HelloWorld().displayHelloWorld();
}
}
자바 소스 코드를 컴파일한다.
% javac HelloWorld.java
% javac Main.java
자바 유틸리티인 javah를 이용하여 헤더 파일을 생성한다.
% javah HelloWorld
javah를 이용하여 스텁 파일(HelloWorld.c)을 생성한다.
% javah -stubs HelloWorldC로 구현된 자바와 통합할 파일인 HelloWorldImp.c를 작성한다.
// HelloWorldImp.c.
#include
#include "HelloWorld.h"
#include
void HelloWorld_displayHelloWorld(struct HelloWorld *this) {
printf("Hello World!\n");
return;
}
Loadable Library와 동적으로 컴파일 한다.
UNIX인 경우에는
% cc -G HelloWorld.c HelloWorldImp.c -o libhello.so
프로그램을 동작시키면 다음과 같은 결과가 출력된다.
% java Main
Hello World!
public interface String {
void freezeDry(stream s);
void reconstitute(Stream s);
}
public class Image implements Storing, Painting {
...
void freezeDry(stream s) {
// JPEG compress image before storing
...
}
void reconstitute(Stream s) {
// JPEG compress image before reading
...
}
}
패키지를 import해서 사용하는 방식은 다음과 같이 세가지 유형이 존재한다.
import java.awt.*;
import java.awt.Graphics;
paint(java.awt.Graphics g) {...
struct employee
char name[NAMESIZE];
char address[ADRSIZE];
int tag_number;
double salary;
double (*compute_raise) (double, double);
};
다음과 같은 compute_raise() 함수를 정의해야 하고,
compute_raise(double salary, double percent)
{
return salary *percent;
}
이를 사용위해 C의 메인 프로그램은 다음과 같이 작성하여 사용한다.
main()
{
struct employee Shin = {
"Shin", "EXPO APT", 2419
2400.00, compute_raise
};
printf("raise = %f\n", Shin.compute_raise(George.salary, 0.10));
}
자바를 사용하면 위와 같은 구조는 다음과 같이 간단히 프로그램된다.
우선 struct 문은 클래스내에 정의가 가능하며,
클래스내에 내에 compute_raise는 메소드로서 정의한다.
class Employee {
String name;
String address;
int tag_number;
private double salary;
double compute_raise(double percent) {
return percent * salary;
}
Employee(String a_name, String a_address,
int a_tag_number, double a_salary){
name = a_name;
address = a_address;
tag_number = a_tag_number;
salary = a_salary;
};
}
이때 자바의 매인 클래스는 다음과 같이 정의하여 사용가능하다.
class MainClass {
public static void main(String args[]) {
Employee shin = new Employee("Shin", "EXPO API", 2419, 2400.00);
System.out.println("raise = " + shin.compute_raise(0.10));
}
}
패키지내에서 사용되는 클래스 계층도는 JDK 1.0을 기준으로 작성한 것이며,
http://pec.etri.re.kr/java/JDK/class.ppt
각 패키지별 사용되는 메소드는 아래에 정의되어 있다.
http://java.sun.com/JDK-1.0/api/packages.html

class HelloWorldApp {
public static void main (String args[]) {
System.out.println("Hello World!");
}
}
HelloWorldApp.java을 컴파일하면 HelloWorldApp.class라는 바이트 코드가 생성된다.
% javac HelloWorldApp.java
CLASSPATH 변수를 맞춰준다.
setenv CLASSPATH home/classes
자바 인터프리터를 이용하여 자바 애플리케이션을 동작시킨다.
% java HelloWorldApp
실행 결과는 다음과 같다.
Hello World!
import java.applet.Applet;
import java.awt.Graphics;
public class HelloWorldApplet extends Applet {
public void init() {
resize(150, 25);
}
public void paint(Graphics g) {
g.drawString("Hello world!", 50, 25);
}
}
HelloWorldApplet.java을 컴파일하면 HelloWorldApplet.class라는 바이트 코드가 생성된다.
% javac HelloWorldApplet.java
자바 애플릿을 포함할 html 화일을 작성한다.
<HTML>; <HEAD> <TITLE> Hello World </TITLE> </HEAD> <BODY> This is the applet:<P> <APPLET code="HelloWorldApplet.class" width=200 height=200 > </APPLET> </BODY> </HTML>Netscape 2.0으로 애플릿을 포함한 그 HTML 문서를 로드하면 다음과 같이 Netscape 브라우저에 Hello World 란 문자가 출력된다.
import java.awt.Graphics;
public class MyAppletClass extends java.applet.Applet {
. . .
public void init() { . . . }
public void start() { . . . }
public void stop() { . . . }
public void destroy() { . . . }
. . .
}
기본적으로 사용되는 메소드들의 역할은 다음과 같다.
public class Simple extends Applet {
.....
public void paint(Graphics g) { ... }
public void update(Graphics g) { ... }
...
}
Image im;
public void init() {
im = getImage(getDocumentBase(), "mkshin.gif");
}
public vpid paint(Graphics g) {
g.drawImage(im,x,y,this);
}
오디오 플레이를 위해서는 메소드는 play()를 사용한다.
play(URL soundDirectory, String soundfile);
play(URL soundDirectory);
예를들어 다음과 같이 시용할 수 있다.
play(getDocumentBase(), "mkshin.au");
AudioClip sound = new AudioClip();
sound = getAudioClip(getDocumentBase(), "mkshin.au");
저장 오디오를 플레이하기 위해서는
sound.play();
sound.loop();
등이 사용된다.
import java.applet.Applet;
import java.awt.Graphics;
public class DrawStringApplet extends Applet {
String input_from_page;
public void init() {
input_from_page = getParameter("String");
}
public void paint(Graphics g) {
g.drawString(input_from_page, 50, 25);
}
}
HTML 문서는 다음과 같이 PARAM 태그를 사용하여 정의할 수 있다.
<HTML> <HEAD> <TITLE> Draw String </HEAD> <BODY> This is the applet:<P> <APPLET code="DrawStringApplet.class" width=200 height=200> <PARAM name="String" value="Anyone there!"> </APPLET> </BODY> </HTML>
작성된 프로그램이 위치할 디렉토리 구조는 다음과 같다(자바 알파 버전임을 유의).
classes --- net --- www --- protocol --- multicast --- handler.java
handler.class
먼저 프로토콜 핸들러를 위한 디렉토리를 만든다.
classes/net/www/protocol/multicast
대부분 작업을 하는 디렉토리의 처음 시작은 그 이름에 관계없으나(본 예제에서는 classes로
시작했다.) 그 아래 디렉토리 이름은 반드시 net/www/protocol을 사용해야 한다.
마지막
디렉토리 이름인
multicast는 프로토콜 핸들러의 이름이다.
run 디렉토리 아래에 멀티캐스트 프로토콜 처리를 위한 코드인 handler.java 프로토콜 핸들러 소스를 작성한 후 컴파일한다.
% cd net/www/protocol/run
% javac handler.java
CLASSPATH 환경 변수를 셋팅한다.
setenv CLASSPATH .:/home/classes
이미 핫자바 브라우저가 띄워져 있더라도 CLASSPATH 환경 변수를 세팅한 후에는 다
시 핫지바를 구동시킨다.
핫자바의 URL 입력란에 multicast:URL 형식으로 입력하면
특정 문서의 로드시에 멀티캐스팅 프로토콜이 적용되게 된다.
classes ---- net -- www - content - mpeg - handler.java
handler.class
먼저 디렉토리를 만든다.
classes/net/www/content/mpeg
프로토콜 핸들러와 미찬가지로 작업을 하는 디렉토리의 처음 시작을 classes로
정의했으며, 그 아래 디렉토리 이름은 반드시 net/www/content을 사용해야 한다. 마지막
mpeg 디렉토리 이름은 켄텐트 핸들러의 이름이다.
mpeg 데이타 처리를 위한 코드(handler.java)를 작성한 후 컴파일 한다.
% javac handler.java
CLASSPATH 환경 변수를 셋팅한다.
setenv CLASSPATH .:/home/classes
image/mpeg의 처리를 위한 mailcap 파일을 수정한다.
이미 핫자바 브라우저가 띄워져 있더라 CLASSPATH 환경 변수를 세팅한 후 다시 띄운다.
이제 컨텐트 핸들러는 image/mpeg MIME 타입으로 된 문서를 로드할 때마다
자동적으로 불려지게
되어 처리된다.
자바는 WWW으로 성공적인 출발을 장식했다. 자바는 정보 창고인 인터넷의 활용 범위를 넓힐
수 있는 가이드라인을 제시했으며, 컴퓨터 벤더와 사용자 모두에게 상호운용성의 문제에 대한 해
결책을 제시하였다. 소프트웨어 측면에서도 자바가 있는 웹은 플러그-인 기능을 이용한 차세대
통합 응용 환경을 창출했으며, 이를 통해 인터넷은 더욱 더 확장 발전될 것으로 보인다.
자바 이전의 정보망 관점에서 보면, 현재 대분분의 정보 서비스 모델인 클라이언트-서버 모델은
사용자의 증가에 따라 보다 복잡한 메스 형태의 구조를 가지게 되고 이에 대한 애플리케이션과
서비스의 원할한 제공이 커다란 문제점으로 안고있었다. 결국 또한 자바로 인해 변화된 인터넷은
이러한 문제들의 모든 해결책을 제시한다. 사용자는 자신의 시스템에 핫자바와 같은 하나의 프로
그램만을 인스톨하면 (이것은 모든 플랫폼의 사이의 일관된 환경을 제공하게 된다), 새로운 애플
리케이션을 인스톨하거나, 그 페이지에 내장된 애플릿과는 무관하게 브리우징을 통해서 새로운
서비스를 제공받을 수 있다. 서비스 제공자 입장에서는 WWW 서버내에 애플릿을 포함시킴으로
서 일반 클라이언트의 기종에 관여할 필요가 없으며, 업그레이드도 용이하다. 이것은 데이타뿐만
아니라 코드를 함께 다운로드받음으로서 가능해진다.
이처럼 자바를 이용한 컴퓨터 세상은 궁극적인 네트웍 플랫폼으로 인터넷을 선택하게 되며, 컴퓨 터 산업 전반에 걸쳐 새로운 기술 혁신을 가져오게 될 것으로 기대된다.