Advanced Java Programming & Technology
자바는 썬 마이크로시스템(Sun Microsystem)에서 개발한 객체 지향 프로그래밍 언어입니다. 자바는 인터넷환경과 클라이언트/서버 프로그래밍 분야의 문제를 해결하기 위해 설계한 것입니다. 현재 자바는 'JDK(Java Development Kit) 1.0' 버전의 이름으로 공개되고 있습니다.
자바는 프로그래밍 언어의 발전에 있어서 전혀 새로운 관점을 제시합니다. 자바는 규모가 작고 간단한 언어이면서도 매우 다양한 소프트웨어 애플리케이션 요건을 충족시킬 수 있을 만큼 포괄적입니다. 자바는 피상적으로는 C나 C++과 유사하지만, 기존 언어의 기능들을 체계적으로 제거함으로써 단순성을 달성하였습니다. 따라서 자바를 이용해 작성한 애플리케이션은 C로 작성한 것과는 비교 할 수 없을만큼 크기가 매우 작습니다.
자바의 대표적인 특징이라면, 객체지향 프로그래밍 환경하에 멀티스레드를 지원하는 것입니다.
그리고, 네트웍 프로그래밍에 용이하며 분산환경에 적합하고, 강력한 그래픽 사용자
인터페이스(GUI)를 제공한다는 것입니다. 따라서 잘 작성된 자바 프로그램은, 자바의 특징들을
충분히 살려가며 작성한 것입니다. 자바의 기능들은 JDK의 패키지(package)로 모두 제공되고
있습니다. 본문에서는 JDK를 이용한 간단한 예제 프로그램과 함께 자바의 기능을 하나씩
경험해 보겠습니다.
스레드란 프로세스 스케줄링(process scheduling)의 부담을 줄여 성능을 향상 시키기 위한 프로세스의 다른 표현 방식입니다. 일반적으로 라이트웨이트 프로세스(lightweight processes) 라고도 이야기 합니다. 자바는 이러한 동시 실행 스레드를 여러개 생성할 수 있습니다. C와 C++는 단일 실행 스레드 패러다임에 속하는 언어로서, 스레드에 대한 언어 수준(language-level) 지원을 제공하지 못합니다. 하지만 자바는 다중 스레드에 대한 언어 수준 지원을 제공하여, 더욱 다양하고 강력한 프로그래밍 접근을 유도합니다.
자바에서 스레드를 이용한 프로그래밍 기법은 하나의 스레드를 이용해서 프로그램을 작성할경우에 새로운 개념이 없습니다. 진정한 스레드 프로그래밍이라면 하나의 순차적인 스레드가 아니라, 프로그램내에서 동시에 여러가지 일을 수행하는 다중 스레드를 사용하는 것입니다.
스레드를 제대로 사용하기 위해서는 스레드가 실행되는 여러 가지 속성과 구조에 대해서 잘
알아야 합니다. 또한, 여러개의 스레드가 생성되어 실행될 때에 스레드들간의 동기화, 교착상태
등 발생할 수 있는 여러 가지 문제점을 해결하는 방법을 익혀야함 합니다.
자바에서 스레드를 사용하는 방법에는 두 가지가 있습니다. 하나는 Thread 클래스의 기능을 상속받는 방법이고, 다른하나는 Runnable 인터페이스를 사용하는 방법입니다.
다음은 Thread 클래스를 이용한 스레드 생성 기법의 프로그램 구조입니다.
class BarThread extends Thread { .... public void run() { } .... }[Applet Example 01]
위의 프로그램에서, 'BarThread'는 'Thread' 클래스에서 파생된 클래스입니다. 스레드의 주요 기능을 수행하는 'run' 메소드는 자바의 오버라이드(override) 기법을 이용하여 새롭게 정의하고 있습니다.
'BarThread' 클래스는 'Thread' 클래스의 내용을 상속 받음으로써 스레드의 기본적인 기능을 가지게되었고, 'run'메소드를 새롭게 정의함으로써 새로운 모습의 완벽한 스래드를 정의하였습니 다.
다음은 'Runnable' 인터페이스(interface)를 이용한 스레드 생성 기법의 프로그램 구조이다.
class BarThreadTest extends Applet implements Runnable { Thread mythread; .... public void start() { mythread = new Thread(this); } public void run() { } .... }[Applet Example 02]
자바에서는 다중 상속을 지원하지 않습니다. 부모클래스가 바뀌면, 완전히 재컴파일해야 하는 C++ 코드와는 달리, 자바는 이러한 종속성을 완화시키는 인터페이스 메소드를 사용합니다. 인터 페이스는 표준적인 엄격한 클래스 상속 구조를 이용할 때의 어려움을 겪지 않으면서 다중 상 속 의 잇점을 활용하는 기법입니다.
위 프로그램에서, 'BarThreadTest' 클래스는 'Applet' 클래스로부터 상속을 받습니다. 그리고, 스
레드를 사용하기 위하여 'Runnable' 인터페이스를 사용하고 'run()' 메소드를 새롭게 정의 합니
다. 그래서, 'mythread'가 실행될 때에는 'Thread' 클래스 내부에 기본적으로 정의되어 있는
'run()' 메소드가 실행되지 않고, 'BarThreadTest' 클래스에 오버라이드 되어 새롭게 정의된
'run()' 메소드를 실행 시키게 됩니다. 잘보면, 'mythread'를 생성하기 위해 'this' 라는 값으로
'BarThreadTest'의 위치를 알려주게 됩니다.
자바는 언어적인 차원에서 멀티스레딩을 지원합니다. 즉, JDK에서 스레드 객체를 제공하며, 자 바 런타임 시스템에서 스레드 제어구조를 제공합니다. 여러개의 스레드가 동시에 실행되면서, 같 은 데이터나, 메소드를 사용할때에는 주의해야할 점이 몇가지 있습니다.
한 예로 키보드의 입력과정을 알아보겠습니다. 사용자가 입력한 킷값은 키보드 버퍼에 쌓이게 되고, CPU는 키보드 버퍼에서 킷값을 읽어오게 되어있습니다. 그런데, 키보드 버퍼가 꽉차있는데 사용자가 킷값을 덮어쓰는 경우와, 키보드 버퍼에 킷값이 없는데 CPU가 중복하여 읽어오려는 경 우가 있을 수 있습니다. 이런 경우에서 사용자와, CPU를 각각의 스레드로 볼 수 있고, 키보드 버 퍼는 스레드가 동시에 사용하는 공동 데이터라고 볼 수 있습니다.
기존의 멀티 스레드 프로그래밍 환경에서 공통 데이터를 처리하는 임계영역(critical section)을
처리할 때 많은 어려움이 있었습니다. 이러한 문제는 세마포어와 같은 것을 이용하여 해결했지만, 세마포어를 이용한 기법은 상당히 어려운 프로그래밍 과정이었고, 너무 복잡하여 한편으론 확실하지 않은 위험한기법 이었습니다.
하지만, 자바는 이러한 문제점을 언어적인 차원에서 해결하고 있습니다. 'synchronized'라는 키워드로 정의된 블록이나 메소드는 오직 하나의 프로세스만이 접근할 수있도록 제한함으로써, 임계영역의 문제를 쉽게 해결하였습니다. 또한, 자바는 모니터 기법을 제공하고 있습니다. 'wait()' 메소드와 'notify()'메소드를 제공함으로써 여러개의 프로세드들 사이에서 모니터를 주고받으며 동기화를 아주 쉽게 구현할 수 있도록 하고 있습니다.
다음은 잘 작성된 동기화 프로그램의 공통 데이터를 정의한 예입니다.
class BarInfo { private boolean canAccess = false; private int size=50; public synchronized void init() { canAccess = false; size = 50; } public int getSize(){ return size;}; public synchronized int smallerSize() { while(canAccess == false ) { try { wait(); } catch(Exception e) { } } size -=10; canAccess = false; System.out.println("smaller..."); notify(); return size; } public synchronized void largerSize() { while(canAccess == true ) { try { wait(); } catch(Exception e) { } } size += 10; canAccess = true; System.out.println("larger !!!"); notify(); } }[Applet Example 03] [Applet Example 04]
위의 프로그램에는 'synchronized'로 정의된 두 개의 메소드가 있습니다. 'largeSize()' 메소드와
'smallerSize()'메소드는 'wait()' 메소드와 'notify()' 메소드를 사용하여 모니터를 주고 받으며 순
차적으로 실행 됩니다. 'canAccess'의 값을 변경합니다. 결국, 'BarInfo' 클래스의 'largerSize()'
메소드와 'smallerSize()' 메소드는 번갈아가며 한 번씩 실행되며 동기화되어 실행됩니다.
자바에서는 일반적인 언어에서와 마찬가지로 키보드나, 마우스의 입력을 처리할 수 있습니다.
자바의 이러한 기능이 월드와이드웹(WWW)에 적용되면서 대화형 웹서비스를 가능하게 하였습니
다. 자바는 사용자에게 즉각적이고 지속적인 자극을 제공함으로써, 웹의 상호작용 수준을 향상 시
켰습니다. 동시에 자바 애플릿은 사용자의 입력을 지속적으로 받아들이고 처리합니다. 또한 자바
는 이러한 입력에 반응하고, 사용자에게 정의된 서비스를 제공합니다.
또한, 자바는 일반적이고 편리한 사용자 입력, 선택 기능을 위해서 AWT를 제공합니다. AWT 에서는 Button, Choice, List, Edit 등과 같은 그래픽 사용자 인터페이스(GUI; Graphic User Interface)를 제공하고 있습니다.
자바의 다양한 입력은 AWT(Abstract Window Toolkit)의 이벤트(Event)로써 모두 처리됩니다. 자세히말하면, 'Component' 내부에서 사용자의 입력이 있을 때 'Event' 객체가 생성됩니다. 생성 된 이벤트는 구성자의 각 계층을 거치면서 처리됩니다. 이벤트 처리 과정에서 필요없는 이벤트는 무시될 수 있습니다. 이러한 AWT의 이벤트 처리 루틴은 이벤트 필터링(event-filtering) 시스템 과 유사합니다.
모든 이벤트는 'handleEvent()' 메소드에서 처리됩니다. 그리고, 'handleEvent()'에서 처리되는 이벤트 루틴은 이벤트의 종류에 따라 'mouseEnter()' , 'mouseEnter()', 'mouseExit()', 'mouseMove()', 'mouseUp()', 'mouseDown()', 'mouseDrag()', 'keyDown()', 'action()' 등으로 분류 하여 제공하기도 합니다. 따라서, 몇개의 메시지처리는 'handleEvent()'에서 처리하지 않고, 메시 지에 필요한 각각의 메소드만을 새롭게 정의하여 사용합니다.
다음은 일반적인 'handleEvent()' 메소드의 사용, 정의 방법입니다.
public boolean handleEvent(Event e) { if (e.target instanceof Scrollbar) { textField.setText(String.valueOf(slider.getValue())); controller.convert(this); } else if ((e.target instanceof TextField) && (e.id == Event.ACTION_EVENT)) { setSliderValue(getValue()); controller.convert(this); } else if ((e.target instanceof Choice) && (e.id == Event.ACTION_EVENT)) { controller.convert(this); } return false; }[Applet Example 06]
자바의 입/출력 패키지(java.io package)는 기존의 파일을 모두 스트림(Stream)으로 처리합니다. 스트림은 보다 쉽게 파일을 접근할 수 있도록 구성되어 있습니다. 스트림을 이용하면 일반적인 파일 이외에도 네트웍 소켓(socket)이나, 배열(array), 파이프(pipe) 등을 쉽게 접근 할 수 있습니 다. 자바에서 제공하는 스트림은 크게 입력 스트림과, 출력 스트림이 있습니다.
입력 스트림은 파일이나 문자열 또는 메모리 등 다양한 종류의 데이터를 읽어오는 기능을 가지 고 있습니다. 입력관련 클래스는 모두 'InputStream' 클래스로부터 파생되며, 바이트 단위로 읽거 나 바이트의 배열을 읽는 등 동일한 인터페이스를 제공하고 있습니다. 입력 스트림을 생성하면 자동으로 입력 스트림을 열게 되며, 스트림을 닫을때는 'close()' 메소드를 명시적으로 선언합니 다. 만약 스트림을 닫지 않으면 쓰레기 처리(Garbage Collection) 작업에서 자동으로 닫습니다.
출력 스트림역시 파일이나 문자열 또는 메모리 등 다양한 곳에 데이테를 출력하는 기능을 가지 고 있습니다. 출력관련 클래스는 모두 'OutputStream' 클래스로부터 파생됩니다. 사용하는 방법은 입력 스트림과 유사하며, 출력 스트림을 생성하면 자동으로 출력 스트림을 열게 되고, 스트림을 닫을때는 'close()' 메소드를 명시적으로 선언합니다. 만약 스트림을 닫지 않으면 쓰레기 처리 (Garbage Collection) 작업에서 자동으로 닫습니다.
다음은 파일을 열고 읽고/쓰는 예제 프로그램입니다.
FileInputStream fin; FileOuputStream fout; public void openFile() { try { fin = new FileInputStream("index.html"); } catch(Exception e) { System.out.println("index.html open error..."); } try { fout = new FileOutputStream("index.out.html"); } catch(Exception e) { System.out.println("index.out.html open error..."); } System.out.println("Success open files..."); } public void readFile() { byte b[] = new byte[1000] int nr_read = 0 while(true) { try { nr_read = fin.read(b) } catch(Exception e) if(nr_read == -1) break theArea.appendText(new String(b, nr_read)+"\n") }[Applet Example 07]
아직까지는 보안상의 문제로, 애플릿 프로그램에서는 'Socket'을 이용한 네트웍 접근 방법과 'FileInputStream/FileOutputStream' 형태의 접근을 허용하지 않습니다. 따라서, 일반적으로 애플 릿 프로그램에서 파일접근 방식은 다음과 같습니다.
다음은 URL형식의 파일 접근 예입니다.
DataInputStream din; public void openFile() { URL url=null; try { url = new URL(getCodeBase(), "index.html"); din = new DataInputStream(url.openStream()); } catch(Exception e) { theArea.appendText("index.html open error...\n"); } } public void readFile() { String line=null; while(true) { try { if((line = din.readLine()) == null) break; } catch(Exception e){ break; } theArea.appendText(line+"\n"); } }[Applet Example 08]
파일을 접근하기 위해서 'URL' 클래스를 이용하여 파일을 읽어온후 'DataInputStream'을 생성
합니다. 그리고, 'openStream()'메소드를 이용해서 파일 스트림 형태로 접근하며, 'readLine()'메소
드를 이용하여 파일을 읽어들입니다.
자바는 AWT를 통하여 윈도우, 메뉴, 버튼, 리스트, 에디트 등 그래픽 사용자 인터페이스(GUI) 를 제공합니다. 또한, AWT는 이미지, 이벤트, 색상, 폰트 등 다양한 패키지를 제공합니다. 따라 서, 기존의 윈도우즈 프로그래밍에서 가능했던 것을 자바에서 그대로 표현 가능합니다. 특히, 자 바가 멀티미디어 프로그래밍에 적합한 이유는, 이미지 파일(GIF, JPG)과, 오디오 파일(AU)을 쉽 게 컨트롤 할 수 있는 기능을 제공한다는 것입니다. 그러면 다음 내용에서 그래픽 자원의 사용법 과, 이미지, 오디오를 이용한 에니메이션 프로그래밍에 대해서 알아보겠습니다.
'paint()', 'repaint()', 'update()' 메소드는 그래픽 출력을 위한 기본적인 메소드입니다. 'paint()' 메소드는 애플릿이 처음 생성될 때, 또는 다른 윈도우 크기가 변경되었거나 다른 윈도우에 의해 가려져서 새롭게 화면을 그려줘야 할 필요가 있을 때 호출되는 메소드 입니다. 즉, 이곳에서 처리 된 내용은 화면에 그대로 출력됩니다. 그밖에 마우스 버튼이 눌러졌다던지, 또는 키보드의 입력에 의해서 새롭게 화면을 갱신할 필요가 있을 때 'repaint()' 메소드를 사용합니다. 이때 'repaint()'메 소드는 다시 'update()'메소드를 호출합니다. 그러면 다시 'update()' 메소드는 그때의 상황에 맞 게 화면을 갱신 시켜주면 됩니다.
일반적으로 'paint()' 메소드와 'update()' 메소드는 비슷한 성격을 가지고 있습니다. 다른점은 'paint()' 메소드는 바탕부터 새롭게 지우고 새롭게 화면을 출력하지만, 'update()' 메소드는 바탕 을 지우지 않고 현재 화면에서 필요한 부분만을 새롭게 갱신합니다. 따라서, 애니메이션 프로그램 이나 스크롤이 되는 프로그램에서 'update()' 메소드를 정의함으로써 깜빡임을 줄일 수 있습니다.
다음은 화면출력 메소드를 사용하여 화면을 갱신하는 애플릿의 프로그램 구조입니다.
public class ClockApplet extends Applet implements Runnable { .... public void run() { while (clockThread != null) { repaint(); count++; try { clockThread.sleep(1000); } catch (InterruptedException e){ } .... } } public void paint(Graphics g) { .... g.setColor(Color.blue); g.drawString("This is count test !!!!", 10, 20); } public void update(Graphics g) { .... g.setColor(Color.red); g.drawString("count = "+count, 10, 40); } .... }
위의 프로그램에서 처음 화면 출력을 위해 'paint()' 메소드가 호출됩니다. 그리고, 스레드를 이 용하여 1초에 한 번씩 'repaint()' 메소드를 호출하여 'update()' 메소드를 호출함으로써 화면을 갱신하게 됩니다. 즉, 'paint()' 메소드 이외에 'update()' 메소드를 따로 정의하는 이유는 화면이 갱신될 때 깜빡임을 줄이기 위함 입니다. 그러나 'update()' 메소드는 화면을 지우지 않고 출력하 기 때문에, 화면에 출력되는 내용은 겹쳐치게 됩니다.
'update()' 메소드를 잘 정의함으로써 에니메이션이나 스크롤 기법을 구현할 수 있습니다. 그러 나, 이러한 기법은 처리되는 내용이 다양하고 출력되는 내용이 많을경우, 역시 화면의 깜빡임이 심해집니다. 따라서, 좀더 깔끔한 화면 처리를 위해서 화면출력 이전에 메모리상에서 미리 출력하 고 실제화면에는 단 한번만 출력하는 기법을 사용합니다. 이러한 방법을 더블 버퍼링(Double Buffering)이라고 합니다.
다음은 더블 버퍼링을 하는 프로그램 구조입니다.
public class ClockApplet extends Applet implements Runnable { Image bufferimg; Graphics buffermap; boolean isbegin = true; public void paint(Graphics g) { if(isbegin == true) { bufferimg = createImage(image_w, image_h); buffermap = bufferimg.getGraphics(); isbegin = false; } .... buffermap.setColor(Color.blue); buffermap.drawString("This is count test !!!!", 10, 20); g.drawImage(bufferimg, 0, 0, this); } .... public void update(Graphics g) { .... buffermap.setColor(Color.red); buffermap.drawString("count = "+count, 10, 40); g.drawImage(bufferimg, 0, 0, this); } .... }[Applet Example 09]
일반적인 에니메이션의 구현은 위와같은 화면처리 기법하에 약간의 시간 간격을 주면서 여러장 의 이미지를 번갈아 보여주는 형식으로 구현됩니다. 또한 사운드까지 지원되면 보다 좋은 효과를 낼 수 있습니다. 다음은 자바에서 이미지 파일과 사운드 파일을 읽고, 출력하는 메소드의 사용 방 법입니다.
다음은 더블 버퍼링을 이용하면서 스크롤도 시키는 예제프로그램 입니다.
▷ 이미지 읽기 Image animFrame; public void init() { animFrame = getImage(getCodeBase(), "images/frame01.gif"); .... } ▷ 이미지 출력 public void paint(Graphics g) { g.drawImage(animFrame, 0, 0, this); } ▷ 오디오 읽기 AudioClip background; public void init() { background = getAudioClip(getCodeBase(), "audio/backmusic.au"); .... } ▷ 오디오 출력 public void start() { background.loop(); .... } 또는 public void paint(Graphics g) { background.play(); .... }[Applet Example 10]
위와같이 'getImage()', 'getAudioClip()' 메소드를 사용하여 URL형식을 통하여 이미지와 오디
오 파일을 읽어올 수 있습니다. 읽어온 내용은 'drawImage()', 'loop()', 'play()' 메소드로 출력
할 수 있습니다.
인터넷의 정보는 점점 늘어만가고, 그 많은 정보중에서 보다 정확한 자료를 찾기위해 인터넷상 의 정보들은 점차 DB화되고 있습니다. 특히, 기존의 PC통신상에서 DB서비스를 하고 있거나, 자 체 DB를 가지고 있는 기업이나 단체에서는 그 DB를 WWW상에서도 서비스 하기 위해서 상당한 관심을 가지고 있습니다.
현재 WWW상에서는 CGI라는 기법으로 다음 그림과 같이 DB 서비스를 하고 있습니다.
이러한 서비스는 사용자가 서버쪽의 CGI 프로그램을 실행시키면, 서버쪽의 CGI 프로그램이 DB를 참조하여 그 내용을 HTML형식으로 브라우저에 보내주는 형식이었습니다. 이러한 구조는 브라우저나, 서버에서 지원하는 형식에 맞추어 출력해주어야 합니다. 여러 가지 환경변수를 이용 하여 네트웍상에서 정보를 전송하여, 결국 HTML 형식으로 출력해줍니다.
CGI를 이용한 DB서비스는 기존의 HTML과 비교해볼때에 내용과 결과의 양은 유동적이지만, 출력되는 문서형태는 결국 정해진 HTML형식에 따르도록 되어있습니다. 또한, 사용자가 브라우 저 상에서 CGI를 실행시켜야 새로운 내용을 가져오는 아주 수동적인 서비스 였습니다.
자바는 기본적으로 능동적이면서도 상호 대화형 서비스가 가능하기 때무에 이러한 CGI의 단점 을 극복할 수 있습니다. 그리고, 자바는 그래픽환경을 지원하기 때문에 CGI와는 비교할 수 없는 그래픽컬하고 동적인 서비스를 WWW상에서 가능하게 해주고 있습니다.
다음은 자바를 이용한 DB 서비스의 형태 입니다.
자바를 이용한 DB접근 방법은 CGI와는 달리 프로그램 자체가 인터넷을 건너와 자신의 컴퓨터 에서 실행되는 구조를 가지고 있습니다. 따라서, 직접 DB를 접근하므로 훨씬 다양한 서비스를 기 대할 수 있습니다. 그러나, DB접근이 자유로운 만큼 보안상의 문제를 야기시킬 수 있습니다. 따 라서, 현재 WWW상에서는 자바 애플릿을 통하여 이러한 형태의 서비스를 할 수 없습니다. 단, 자바 어플리케이션은 이러한 서비스가 가능합니다.
그래서, 애플릿에서 URL형태의 파일 접근은 가능한 점을 이용한 편법을 씁니다. 다름 그림처 럼 DB 쪽에 조그만 서버를 제작하여 URL이 공개된 특정 파일을 통하여 자바 프로그램과 서로 정보를 교환합니다.
그러면, 어떻게 DB를 사용할 수 있는 자바 프로그램을 제작할 수 있을까요?
아래 그림은 DB접근을 위한 CGI프로그램과, 자바 프로그램을 제작하는 과정입니다.
![]() | ![]() |
| [그림 6] | [그림 7] |
왼쪽 그림은 지금까지 사용했었던 C로 작성된 DB용 CGI 프로그램 제작단계입니다. C언어를
이용하여 DB용 CGI 프로그램을 작성할때에는 DB용 C 라이브러리(library)가 필요했었습니다. 자
바로 프로그램을 작성할때에서 마찬가지입니다. DB용 자바 프로그램을 작성하기 위해서는 DB
회사에서 제공하는 Java 패키지가 있어야만 합니다.
간혹 패키지는 class화일의 형태로 제공되지 않고 다이나믹 링크 라이브러리(DLL) 형태로 제공 되기도 합니다. 이러한 경우는 DB나 Motif와같이 잘 정의된 기존의 C 라이브러리를 그대로 사용 하기를 원할 때 사용됩니다. 그리고, 다이나믹 링크 라이브러리 형식의 패키지를 제작할때에는 몇 가지 단계를 필요로 하는데, 이러한 방법을 네이티브 메소드를 이용한 프로그래밍 이라고 합니다.
이러한 다이나믹 링크 라이브러리는 다음과 같이 제작합니다. 첫번째, 네이티브 메소드를 정의 하는 자바 프로그램을 작성합니다. 이때, 네이티브 메소드는 기존의 C 라이브러리 함수와 이름이 같고, 파라미터, 리턴값이 같고, 바디가 없는 메소드 입니다. 이렇게 네이티브 메소드와, 'loadLibrary()'메소드를 사용한 자바 프로그램을 자바 컴파일러(javac)로 컴파일합낟. 컴파일된 클래스 파일은 다시 C 변환 프로그램(javah)으로 C 프로그램을 얻어냅니다. 이렇게 생성한 C 프 로그램의 함수들을 이용해서 프로그래머는 새로운 C프로그램을 작성할 수 있습니다. 그리고, 이 모든 프로그램과 C library를 컴파일하여 새로운 라이브러리 파일을 생성합니다. 이렇게 C언어와 의 인터페이스를 이용해서 작성된 자바 다이나믹 링크 라이브러리는 기존의 DB 라이브러리를 충 분히 이용하면서 자바로도 DB를 쉽게 접근할 수 있도록 하고 있습니다.
현재 자바 패키지를 제공하는 DB로는 Msql, Sybase, WebLogic, OCI, EOF 등이 있습니다. 이
중 Msql은 모든 패키지를 java, class화일로 제공하고 있으며, Sybase는 java, c, class파일로 제
공함으로써 프로그래머는 자신의 플랫폼에 맞추어 다이나믹 링크 라이브러리를 컴파일, 생성하여
사용하는 방식으로 사용해야합니다.
자바는 처음 연구, 개발 될 때 임베디드 시스템과(embedded system), 광범위한 네트웍을 대상 으로 개발되었습니다. 자바 개발자들은 자바를 개발할 때 기본적인 틀이 되는 언어로 C++언어를 선정하였습니다. 그리고, 자바는 C++언어의 불합리한 점을 많은 부분에서 개선하였습니다. 결과적 으로, 자바는 C++언어가 가지고 있는 객체지향적인 장점뿐만 아니라, C++언어가 가지지 못하는 많은 장점을 가지게 되었습니다.
자바의 대표적인 특징을 살펴보면, 자바는 객체지향적이면서 간단하고 실행환경(run-time system)의 크기가 작습니다. 그리고, 자바를 지원하는 모든 플랫폼에서 하나의 프로그램으로 실행 이 가능 하기 때문에 개발기간이 짧아지며, 이식성이 좋다는 장점이 있습니다. 또한, 가비지 컬렉 션(garbage collection) 기능은 프로그래머로 하여금 편한 프로그래밍 환경을 제공하며, 반면 오류 가 없는 튼튼한 프로그램을 제작할 수가 있습니다. 그밖의 안전성과, 다른 언어와의 결합성, 멀티 스레드 기능 등 많은 장점을 가지고 있습니다.
실시간 자바(real-time Java)는 크게 두가지 모습으로 응용할 수 있습니다. 첫째 월드와이드웹 상의 실시간 자바의 모습으로 증권거래 시스템, 대화형 에니메이션, 비디오 게임, 화상회의 등이 가능합니다. 다른 하나는 임베디드 시스템(embedded system)의 모습으로 교통안내시스템, 음성- 펜 기반 컴퓨팅 환경, 항공 항로 시스템, 가상현실, 미사일 방어 시스템 등의 응용이 가능합니다.
이러한 실시간 시스템을 개발할때에는 여러 가지 어려운 점이 있습니다. 그러나 자바는 다음의 문제들을 하나씩 해결하고 있습니다.
임베디드 실시간 시스템(enbedded real-time system)에서는 종종 서로다른 호스트의 다양한 프 로세서를 접근해야 하는 경우가 있습니다. 예를 들면, 하나의 실시간 시스템 개발과정에서 Motorola 68000, Power PC, Intel 960 등을 동시에 처리하는 경우가 아주 일반적입니다. 이러한 요구를 받아들이기 위해서 프로그래머는 각각의 환경에 맞는 새로운 컴파일과정과, 프로그래밍 작업을 해야만 합니다. 그러나 자바로 작성된 프로그램은 그러한 문제점을 해결합니다. 호직 한 번의 코딩 작업과 한 번의 컴파일로 다양한 종류의 프랫폼에서 실행가능하게 해줍니다.
임베디드 실시간 시스템(embedded real-time system)의 관리에 있어서 가장 어려운점은 시스 템을 다운시키지 않고 새로운 소프트웨어를 설치해야 한다는 것이다. 항공 교통 정리, 전화 교환, 군대 정찰 서비스 등은 절대 실행중 중단되어서는 안되는 시스템입니다.
이때 자바 언어의 이식성과 해석 기능은 이러한 문제를 해결 합니다. 자바는 매우 동적이므로 동적으로 확장 가능한 시스템을 생산합니다. 자바 언어는 변화하는 환경에 적응할 수 있도록 설 계되었습니다. 클래스들은 필요할때마다 동적으로 링크할 수 있으며 네트웍 상에서 다운받을 수 있습니다. 인입 코드는 검증을 거친후에 해석기로 전달되어 실행됩니다.
실시간 시스템에서 네트웍이나 노드(node)가 끊어지게 되면, 새롭게 정보를 보내거나 다시 일을 처리해야 하는 경우가 종종 있습니다. 그러나 자바 프로그래밍 환경은 이러한 부담을 덜어줄 수 있습니다. 자바는 네트웍이나, 기계의 프로세서, 케이블의 종류에 대해서 알 필요가 없습니다. 자 바는 오직 자바 바이트 코드만 읽어와서 일을 수행하기만 하면 됩니다.
실시간 시스템을 개발할때에는 기술적인 면에서 다음과 같은 값비싼 요구사항이 있습니다.
이러한 실시간 시스템의 요구사항 아래 자바는 비교적 저렴한 개발, 유기 비용과, 빠른 마케팅,
높은 이식성, 높은 네트웍 연결성, 높은 안정성과 기능성을 제공합니다. 분만 아니라, 강력한 그래
픽 지원과 사용자 인터페이스는 그 질을 한층 높여줍니다.
기존의 프로그래밍 언어보다 강력해진 자바의 기능을 통하여 소프트웨어 산업과, 인터넷은 큰 변화를 맞아하게 될것입니다. 네트웍 속도가 빨라지게 됨으로써 이젠 더 이상 내 컴퓨터에 프로 그램을 설치할 필요가 없어질것입니다. 서서히 등장하고 있는 NC(Network Computer)나 자바 터 미널(Java Terminal)과 같은 것이 바로 그것입니다.
앞으로 자바관련 다양한 패키지나, 개발 환경이 충분히 제공되면 현재의 모든 소프트웨어는 자 바 응용 프로그램으로 전환할것입니다. 이러한 프로그램은 특히, 앞에서 설명한 멀티미디어 프로 그램일것이고, 실시간 서비스를 해주는 네트웍 프로그램일것이고, 방대한 데이터를 처리하는 데이 터베이스 서비스가 될것입니다.
현재 비쥬얼 프로그래밍 환경역시 인터넷 프로그래밍을 지향하고 있으며, 조금씩 자바를 지원
하고 있습니다. 이러한 형태는 자바 프로그래밍 환경에서 현재의 C/C++을 이용한 비쥬얼 프로그
래밍을 지원하는 형태로 전환될것입니다. 현재의 비쥬얼 프로그래머는 천천히 자바 프로그래밍환
경을 맞이할 준비를 해야할것입니다.