Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom
Bar]
[Photo of the
Author]
Jose M. Fernández

필자에게 연락하기


차 례:
들어가는 글
기원
JAVA를 얻고 설치하기
개발환경
특징
JAVA의 첫 번째 프로그램
요약

자바로하는 프로그래밍 1부

[Ilustration]

요약: 이글은 Java 프로그래밍연재의 첫번째입니다. 먼저 언어로서의 자바와 그 일반적인 특징 및 적절한 정보를 어디에서 찾아 볼 수 있는가를 이야기합니다.




들어가는글

Java 프로그래밍 언어와 개발환경을 설명할 연재를 시작한다. 첫 목표로서 언어, 마이크로웨이브, 세탁기의 기록에 대하여 중요하게 여기지 않을 것이다(다중 출판물, 재밌는 문학을 읽는 것 조차 흥미를 일으켜진다해도). 마림바 리듬에 맞춰 손을 흔드는 거대한 코와 삼각형 모양의 몸체를 가진 작은 남자인 듀크(Java 마스코트)와 예전 미국 공상과학영화를 생각하는 것으로부터 역시 신경을 쓰지 않을 것이다.

Java 현상은 약간을 변화가 있다. 그것에 대한 가치는 모든 컴퓨터 매거진에 쓰여지고, Java 애플릿을 발전시킨 제품을 판매하는 많은 소프트웨어 회사가 있고, 몇몇 web 사이트가 Java 애플릿이나 그 이상을 가지고 있지 않다.

이 연재를 통하여, 기본적인 것은 간단하지만 동시에 아주 복잡하고, 끊임없이 발전하고 있기 때문에 어려운 이 프로그래밍 언어를 폭넓게 배우기 위해 가능한 한 많이 조사하려고 노력할 것이다.

첫번째 연재의 목표는 일반적으로 언어의 기술을 제공된 후에 애플릿, network 관계 프로젝트, JDBC등과 같은 깊은 주제는 심도있게 조사할 것이다.

Java가 범용 언어라는 것은 web페이지를 위한 애플릿을 매우 인기 있게 만든다 할지라도 배타적으로 사용되지 않는다는 것을 강조한 것이다. Java 애플릿보다 더 흥미를 끌수 있는 많은 다른 대체 때문에 단지 자바의 관점을 강요할 수가 없다.

이 첫번째 연재는 실제적이라기 보다는 기술적이다. 다음의 글에서 언어와 개발환경의 기본적인 특성들을 탐구할 것이다. 단지 하나의 자바의 프로그래밍 예를 끝에서 볼 것이다.

기원

Java는 1991년 처음 18개월 동안 Sun Microsystem Inc.에 있는 James Gosling, Patrick Naughton, Chis Warth, Ed Frank, Mike Sherindan에 의해 착상되어 졌다. 1992년과 1995년 사이에 Bill Joy, Arthur Van Hoff, Jonathan Payne, Frank Yellia, Tim Lindolm은 초기 프로트타입(prototype)의 공동으로 연구하여 완성하였다.

>위 날짜들로부터, Java가 WWW에 이전이거나 적어도 동시에 만들어진 것은 분명하다. -- 1991년이 될 때 까지 Tim Berner Lee는 HTML언어를 개발하지 않았다.

Java의 구문이 C와 매우 비슷하고 객체 지향 특성을 지닌 C++ 역시 비슷하다. Java는 응집성과 논리적으로 일관되는 프로그래밍 언어이다.

C와 C++이 가진 유사성들은 Java가 인터넷을 위한 C++의 버전인 인상을 줄 수도 있지만, 중요한 이론과 실제적인 차이는 있다. 특히, Java는 C++과 비교한 후, 개체지향 법례을 개선하고 순화하였다.

인터넷은 일반적으로 알려진 언어로 만들어 자바를 시작했고 동시에, 자유로이 사이버스페이스에서 이동될 수 있는 오브젝트의 범위를 넓힌 이후로 자바는 인터넷에 깊은 효과를 가지게 되었다(동적인 자동 실행 프로그램).

JAVA를 얻고 설치하기

Java 프로그래밍을 하기위해 결정적인 도구가 있다. 부수적으로 항상 GNU/LINUX 환경을 참조한다.(잃어버리게 된 경우에):

현재의 ELF를 기본으로 요구하는 Linux 커널 1.2.13이나 그 이후 버전 설치한다.

JDK(Java Development Kit)환경과 넷스케이프 버전 2.0.14나 그 이후 버전, 텍스트 편집으로 좋은 Xemacs를 이용할 것이다. 항상 Xwindows 상에서 작업을 할 것이다. 그것은 항상 필요하지 않을지라도, 개발된 애플릿과 그래픽적인 인터페이스와 관련된 프로그램은 어느 때라도 요구하게 된다.

다음의 웹사이트로부터 JDK배포판을 내려 받을 수 있다:

http://www.blackdown.org/java-linux.html

이 사이트로부터 파일들을 빨리 내려 받기 위해서는 편리한 미러를 차례로 선택할 수 있다. 몇 달 전, 최신 버전은 JDK-1.1.3(이 기사를 위해 사용된 버전)이었지만, 마지막으로 방문하였을 때는 이미 거기에서 버전 1.19를 보았다. 모든 것을 내려 받는다면 24Mb인 것을 주목! 그럼에도 불구하고 단지 엄격하게 필요한 것은 대략12Mb(인내!)를 내려받는다.

gunzip형태의 file은 압축을 푼 뒤에 문제없이 시작할 수 있다.

보통 디렉토리 /usr/local에서 배포판을 설치하며, 서버디렉토리 /JDK1.1.3에 다음과 같은 것을 새로 만들어진다:

/doc HTML 형식의 공식 문서

/demo 자바 프로그램 데모

/lib 라이브러리

/bin 이 디렉토리는 적당한 JDK의 도구들은 있다.

/lib 디렉토리 안에, "classes.zip"(이 파일은 압축을 풀지 않는다)이라는 파일을 있으며, 그것은 JDK에 의해 사용될 수 있는 편집된 모든 클래스들을 포함합니다.

루트 디렉토리 안에 "src.zip"이라는 파일이 있으며, 그것은 classes.zip에 포함된 소스파일로 포함한다. 그들은 편집되지 않고, 단지 정보적인 목적으로 배포판이 제공된다.

개발환경

앞에서 언급된 것처럼 개발 도구들은 /bin디렉토리에 위치한다:

javac : Java 소스들을 bytecode로 변형시키는 Java 컴파일러.

Java : Java 해석 프로그램. Java bytecode를 실행한다.

jre : Java와 비슷한 다른 해석 프로그램이지만, 사용자를 위하여 모든 옵션사용을 요구하지 않는다.

appletviewer: 애플릿을 검사하고 수행한다.

jdb: 디버그.

javap: Java로 컴파일된 bytecode 파일의 디어셈블러.

javadoc : 문서 생성 프로그램은 public과 produce의 클래스들, 인터페이스, 생성자, 메소드와 필드를 설명하는 일련의 HTML 페이지를 생산한다. 또한, 클래스의 계층구조와 모든 멤버들을 인덱스도 생산한다.

javah : Java 프로그램의 고유 메소드(C언어)를 추가하는 툴.

jar: 자바 클래스의 기록과 Jar 보존 파일을 소스.

javakey : 디지털 기호를 유지하는 툴.

updateAWT : 어플리케이션의 AWT1.02 메소트에서 변화된 이름으로 갱신한다.

현재의 디렉토리 구조로서 이상없이 작업하기 위해서는 환경 변수 PATH에 /usr/local/JDK1.1.3/bin을 추가하도록 충고한다. 당신이 사용 가능한 개발 환경을 시스템을 항상 사용하기 원한다면, /etc/profile파일의 안에 있는 PATH변수를 고친다.

특징

계속하기 전에 자문한다. 자바가 무엇일까? 대답하기 위해, 우리는 JDK 메뉴얼에 있는 것 처럼, Java는 프로그램밍 언어와 플랫폼이라는 두 부분으로 대답할수 있다.

프로그래밍 언어로 Java는 다음의 특성으로 high level 언어입니다(몇가지 점에, 우리는 그들을 상세하게 검사한다):

  • 간단하다.
  • 객체지향.
  • 분배된다.
  • 해석된다.
  • 건장하다.
  • 안전하다.
  • 시스템 구조에 중립이다.
  • 이식이 간편하다.
  • 멀티 쓰레드이다.
  • 동적이다.
  • 고해상도.

우리들의 주의를 환기시키는 첫번째 일은 자바가 해석된다는 것이다. 이미 하위 단계 코드인 Java소스에도 불구하고, 그것은 다양한 플랫폼에서 해석되기 이전에 bytecode의 오브젝트를 생성시키기 위해 컴파일을 요구한다.

Java bytecode의 덕택에 "한번 쓰고, 항상 실행"을 할수 있다. 플랫폼상에서 Java 프로그램을 컴파일하고 Java 가상 기계(JVM)의 완전하게 설치한 다른 아키텍처에서 그들을 실행할수 있다. 예를 들어, Java 프로그램은 Windows NT 플랫폼에서 컴파일하고 Sun Ultra Solaris에서 문제(적어도 이론이다.)없이 실행된다.

일반적으로, 플랫폼은 응용 프로그램이 실행되는 하드웨어/소프트웨어 환경이다. 그러나, 플랫폼은 단지 Java를 실행하는 소프트웨어 환경이지만, 각각의 Java 플랫폼은 하드웨어 플랫폼에서 실행할 때 가진다.

Java 플랫폼은 두 컴포넌트를 가지고 있다:

  • Java 가상 기계(Java Virtual Machine; JVM)
  • Application Programming Interface(API)

JVM은 Java 프리컴파일 프로그램이 실행될 수 있는 추상적인 컴퓨터이다. 개념은 가능한 모든 장소에 그것을 설치하는 것때문에 간단하고 작게 설계되었다. 이 단순은 모든 현존한 플랫폼에 확산이 가능하게 만들고, 모든 것에 대한 공통의 소프트웨어층과 매우 상이한 이기종간 네트워크(인트넷과 같은 것)을 제공하여 가장 큰 이슈인 이식의 용이성으로 해결된다. 그것으로 이 기술의 끝없는 성장에 대한 확실한 이유로 생각할 수 있다. 그럼에도 불구하고 가상 머신는 이름을 나타내지만, 단지 소프트웨어 층으로 보이지 않고, 리얼 Java 머신, 신용카드, TV해독기등을 지원한 Java 칩 시장이 조금씩 보이기 시작하는 하나의 컴퓨터 시스템이려고 노력한다.

Java API는 그래픽 사용자 인터페이스(Graphical User Interface; GUI)와 같은 많은 유틸리티를 제공한 소프트웨어 컴포넌트의 많은 모음이다. 그 라이브러리(Java의 전문 용어를 이용한 자바 패키지)에서 불러모아 진다. 이 패키지의 덕택에 잘 알려진 웹 애플릿들 외의 많은 어플리케이션을 위해 Java를 사용하는 것이 가능하고, 예를 들면 proxie, 메일 서버, IRC 서버 그리고 실질적으로 인터넷에 관계된다는 상상으로 웹 서버를 설계 할 수 있다.

다양한 그룹으로 API 패키지들을 분류할 수 있다:

  • Basic: objects, matrixes, numbers, input/output, data structures(데이타 구조), properties of the system(시스템의 특성), date, time 등.
  • Applets : Java 애플릿 기술의 이용한 function들과 유틸리티들을 세트.
  • Network work: URLs, TCP, UDP, 소켓, IP 어드레싱.
  • Internationalization: 지역적인 명세에 쉽게 적응하고 고유 언어에서 읽혀질 수 있는 코드로 쓰여진 도움.
  • Security: low/high 레벨, 디지털 기호 포함, public/private 키, 엑세스 컨트롤과 자격.
  • Software Components: JavaBeans로 알려져 있다.
  • Databases: 많은 관계 데이타베이스에 일관성이 있는 접근을 제공한다.

이 기본적인 API 커널 외에, 또한 3D 확장, 이동하기 쉬운 통신, 에니메이션 등이 있다.

Java는 상세하게 공부할 특성의 시리즈를 가지고 있다고, 단원 처음에 언급했다:

간단하다:

Java에서는 작업을 따라 잡기위해 항상 잘 정의된 약식이 감소된다. 그것은 강력한 언어의 모든 기능성을 제공되었지만, 작게 사용하고 혼란시키는 기능은 그들과 종종 교체되었다. Java는 C/C++와 많은 C++의 객체 지향 기능의 구문을 상속 받는다. C/C++를 잘 아는 프로그래머 누구라도 Java를 배우는데 문제가 없을 것이다. 그들의 유사성에도 불구하고, Java는 C/C++의 많은 기능을 제거되었다:

  • 포인트 산술
  • 레지스터 (struct)
  • 타입 정의 (typedef)
  • 매크로 (#define)
  • 자유 메모리 필요(free)
  • 다중 계층.
  • operator의 overload.
  • unions안의 structure.
객체지향이다: Java는 결과적으로 객체지향의 접근에 깨끗하고 유용하게 실제적인 출발점부터 설계되었다. Java의 오브젝트 모델은 사용하기에 간단하고 쉽다.
분배된다: Java는 TCP/IP연결을 많은 비중을 두어 설계되었다. 사실, 그것은 네트에 대한 정보를 지역적인 파일만큼 쉽게 입수하기위한 개발자를 허락한다.
건장하다: Java는 컴파일타임중에 타입 검사를 허락하는 강력한 타입언어이다. 그것은 또한 런타임 동안에 몇가지를 검사한다. 메모리는 해석프로그램이 더 이상 사용하지 않는 오브젝트를 자동적인 쓰레기 수집기(garbage collector)가 구현되어 자동적으로 관리된다. Java 자체에 많은 객체 지향 예외 처리기를 제공한다. 올바르게 쓰여진 어플리케이션에서 모든 런타임 에러가 프로그램에 의해 다루어 질수 있다.
독립적 아키텍처이다: Java의 개발자들의 주된 목표는 "한번쓰고, 어떠한 순간이나 어느곳이던 항상 실행된다"이다. Java 코드는 기계 독립적인 high level 바이트 코드로 한번 컴파일된다. 이 바이트 코드는 기계 독립적인 런타임 시스템(해석 프로그램)을 가지고 실행되도록 설계되었다.
안전하다:

분배된 필요한 정보는 클라이언트 운영체제에서 보안의 가장 크게 요구한다. Java는 여러 기능의 덕택에 그것을 런타임 환경에서 보안을 제공한다:

  • bytecode 입증자
  • 실행시간 동안의 메모리의 가용성
  • 파일 접근 제한사항

컴파일러는 단지 올바른 코드를 생성시킬지라도, 해석 프로그램은 컴파일 이후에 코드가 수정(고의적인던, 아니던)되지 않다는 보증을 이중으로 검사한다. 또한 Java 해석 프로그램은 클래스에 대한 메모리 가용성을 결정한다. Java는 어떠한 시스템에서도 안전한 모든 어플리케이션들 중 하나로 여겨질수 있다.

이식이 간편하다: 기본적인 Java의 이식용이성 이외에, 정말로 독립적 아키텍처이기 위해서, Java는 이식용이성을 표준으로 구현한다: 정수는 항상 정수이고, GUI는 추상적인 윈도우즈의 시스템으로 구성됨으로 아키텍처(UNIX, PC, Mac)로부터 독립적이다.
해석된다: Java의 기본적인 목표들중에 하나인 독립적인 플랫폼을 달성하기위해 Java 컴파일러는 중간 코드(바이트코드)를 생성시킨다. 그것은 어떤 시스템 상에서라도 적당한 해석 프로그램으로 실행될 수 있다. 이 예가 Java 어플리케이션의 가능한 성능 문제점들에 의아하게 여길것이다. 그럼에도 불구하고, 이 성능 관계 때문에 Java 작성자는 가장 높은 성능을 가능하게 유지하기 위해서 기계코드의 번역하기가 간단하고, 쉬운 것으로 바이트 코드 디자인을 유지하려고 노력했다.
멀티 쓰레드이다: 건장한 방식으로 동시에 여러 작업을 실행할 수 있는 Java 어플리케이션을 작성하는 것은 간단하다.
동적이다: Java는 런타임까지 어플리케이션을 형성하는 모든 모듈들을 연결하려고 노력하는 것은 아니다. 이 기능은 코드를 동적으로 안전하고 편리하게 연결하는 것을 돕는다.

이것 후에 GNU/Linux 세계에 있는 Java의 상태(직무상 Java 문서를 많이 발견할 수 있다)에 대해 "언급"하는 것을 의아하게 여길 수 있다. Linux를 위한 JDK의 가용성을 일찍 언급했고, 썬 마이크로시스템스사에서 개발된 상업상의 설치가 아니다.(자유로이 분배할 수 있다하더라도).

문제점 없이 어떠한 Java 소스라도 컴파일할 수 있는, GPL라이센스 아래에 컴파일러 GUAVAC와 같은 툴(tool)이 있다. Berkeley라이센스 아래에 KAFFE라고 불리는 가상기계도 역시 언급한다. 최후의 두 프로젝트들은 여전히 완전한 개발 시스템을 가지고 있는 썬사(순간적인 무료 배포)로부터 Java 클래스 라이브러리가 필요하게 될지라도 매우 진보한 단계에 있다.

여전히 초기단계인 최근의 여러 프로젝트는 빠르고 비주얼적인 어프리케이션 개발 환경을 제공하는것을 겨냥한다.

마지막으로, 나는 자바와 GNU 기술을 관계하는 네트에 큰 이동이 있다는 것과, 썬사로부터의 독립과 특히 Java의 무료배포의 완전한 도구 박스의 개발을 관계하는 것을 기술하겠다.

JAVA의 첫 번째 프로그램

일반적인 언어의 특성들을 몇가지 본 후에 실제의 프로그램을 봅시다. 들어가는 말에서 언급하기 때문에, 전현적인 재료를 중요하게 여기지 않기 위해 hello world 예제를 좋아하고, 우리가 좋아하는 어떠한 차원의 제곱을 그린 프로그램의 시작하는 것을 가능한 한 더 좋아 할 것이다(너무 많지 않은 복잡한 비트):

File Cuadro.Java
class Cuadro {
public static void main (String args[]) {
        int l ,a;
        if (args.length == 2) {
            l = Integer.valueOf(args[0]).intValue();
            a = Integer.valueOf(args[1]).intValue();
         }
         else {
          l= 20;
          a= 15;
         }
          for (int i=l; i>0; i--){
            System.out.print("*");
            }
            System.out.print("\n");
            for (int i= a-2; i>0; i--){
             System.out.print("*");
               for(int j=l-2; j>0; j--) {
                  System.out.print(" ");
                  }
                  System.out.print("*\n");
                  }
                for (int i=l; i>0; i--){
                System.out.print("*");
                }
              System.out.print("\n");
           }
}

Java는 "컴파일 유닛(기능 단위)"를 정의하기 때문에 소스 파일에게 주어진 이름은 매우 중요하다. 파일은 하나 이상의 클래스의 정의를 포함할 수도 있다. 컴파일러는 소스 파일이 확장자 .Java(4 문자)을 가지고 있으리라고 예상한다. 결과적으로, 몇몇 시스템은 그것을 지원하지 않는다.(DOS or Windows 3.1)

예제에서 정의된 클래스의 이름은 소스 파일의 이름과 함께 동시에 발생한다. 이것은 자바의 클래스안에 반드시 모든 코드가 있어야 한다. 규칙에 의하여 클래스의 이름은 클래스를 포함한 소스 파일의 이름과 함께 동시에 발생해야 한다. 또, Java는 대소분자를 구분한다(대문자나 소문자인 경우).

커맨드 라인 타입에서 예제를 컴파일하는 방법은 :

> javac Cuadro.java

Java 컴파일러(모든 것이 OK 되었다면)은 당연히 바이러리(bytecode)폼 포함하고, 해석 프로그램에 의해 실행 될수 있는 Cuadro.class 파일을 생성시킨다.

> java Cuadro

Java 소스 코드를 컴파일 할때, 특유한 각각의 클래스는 클래스로서의 같은 이름과 관련되는 것을 보존한다. 그것은 클래스가 소스 파일에서 .class 파일로 보존하는 것을 포함하기 때문에 소스 파일에게 같은 이름을 주는 것은 좋은 습관이다.

예제 Cuadro.java의 단순함에도 불구하고 Java와 전형적인 Java 프로그램의 구성의 기본들을 이해하는 것을 돕는다.

우선 이 예제가 HTML 파일에 포함될 수 있는 애플릿이 아니라는 것을 고려한 커맨드 라인에 있는 자바 해석 프로그램에 의해 실행되는 독립적인 프로그램이다.

프로그램의 첫번째 라인은 :

class Cuadro {

첫번째 단어는 언어의 애약된 토근이다. 그것은 "Cuadro"인 경우에 새로운 클래스명의 정의를 나타난다. -- 스페인에 있는 제곱 -- 그것의 두 중괄호 {} 사이에 정확한 모든 클래스의 정의가 포함된다. Java에서 모든 프로그램의 작업은 클래스의 안에 있어야 한다는 것을 주의하여야 한다.

다음 라인은:

public static void main (String args[]) {

그것은 main()이라는 이름을 가지는 메소드를 선언한다. 모든 Java 어플리케이션은 main()(C/C++과 비슷하게)이라고 불리는 메소드로 실행을 시작한다. 다음은 예제를 이해하기 위해 약간의 세부사항을 필요한 주석을 달겠다(다음에 올릴 기사에 더 깊이있게 설명한다).

키워드 public은 클래스의 멤버의 메소드들의 유호범위를 제어한다. 클래스가 public으로 선언된 후 클래스는 클래스 밖에서 정의된 코드에 의해 사용될 수 있다. 키워드 static은 클래스를 부추길 필요가 있지 않고 호출되기 위해 main()메소드를 강요한다. Void는 메소드가 어떠한 값(리턴값)도 되돌려 주지 않는다는 것을 나타낸다. 예제에서 main의 매개변수로 String클래스로부터 인스턴스의 행렬로 잡혀있는 것과 같이 function이나 메소드에게 매개변수를 넘겨주기 위해서는 function이름 뒤에 쓰여진 소괄호를 이용한다.

명백하게 메소드의 모든 코드는 중괄호 사이에 둘려싸인다. 다음 라인은:

 int l, a ;

두개의 정수 변수를 선언한다. 자바에서는 변수를 사용하기 전에 모든 변수가 선언되어야 한다. 주의, 각각의 코드 끝부분에는 ";(세미콜론)"이 있어야 한다.

나머지 코드들은 작은 알고리즘을 구현한다 :

  1. 테스트시 아키먼트의 오른쪽 수를 제공한다:
    If (args.length==2)
    
  2. 매개 변수가 제공된다면, 그것들은 정수의 변수에 할당된다:
      l = Integer.valueOf(args[0]).intValue();
      a = Integer.valueOf(args[1]).intValue();
    
  3. 그렇지 않으면 변수의 디볼트값을 초기화한다:
      l = 20;
      a = 15;
    
  4. 프로그램의 나머지부분의 명령어들은 화면에 제곱을 그린는데 필요한 것이다. 특히 프린트 하려고 하면:
    System.out.print()
    

    print()은 문자열 아기먼트로 통해 인쇄한다. System은 시스템에 접근을 허락하는 정의된 클래스고, out 콘솔에 연결된 출력 열이다. 또한,

    for (int i=l; i>0; i--)
    

    기대한 대로, 우리가 C/C++과 다른 언어에서 경험한 것 같이 실행된다.

독자는 이 작은 코드가 어떻게 컴파일되고 실행되는지를 검사하는 것과 또한, 다양한 플랫폼 아래 : Linux, 윈도우즈 95(현재는 이것으로 사용하지 않지만!)에서 컴파일된 오브젝트 Cuadro.class를 실행함으로써 코드의 이식성을 검사하는 것과 그것이 어떠한 플랫폼에서도 똑같이 실행되는 것을 보는 것은 좋은 과제감이다.

요약

우리는 프로그래밍 언어로서의 Java의 일반적인 기능들 중 일부를 알아보았다.우리는 프로그램 하기 위해 출발했고, 긴 길을 가기 위해, 다음 연재에서 언어의 더많은 기술을 쓸 것이다. 다음 연재에서, 정의들과 변수의 타입, 기본적인 명령어, 클래스 등을 공부하게 될 것이다. 주된 언어의 명세이다.

연재의 기초를 준 다음의 출판물과 URL에서 각각의 글들을 참조하였다.

  • JAVA Reference Manual. Patrick Naughton Herbert Schildt. McGraw-Hill.
  • Programming with JAVA. Tim Ritchey. Prentice Hall.
  • Tutorial de Java . Spanish manual in HTML format that can be obtained at www.fie.us.es/info/internet/J AVA. Agustín Froufe.
  • The Java Tutorial. English manual in HTML www.javasoft.com. Sun.
  • Tutorial from the JDK distribution.

번역 : 이수환


본 웹사이트는 Miguel Angel Sepulveda씨에 의해 관리됩니다.
© Emre Demiralp 1998
LinuxFocus 1998