0から始めるJava言語

更新日 2002/11/19

1. はじめに
 このホームページは、これから Javaを始めようという人が、できるだけつまづかずに習得できるよう支援するのが目的です。とはいうものの、私自身Javaを使ってプログラムを書いた経験もなく、どちらかというと自分の勉強のために始めたようなHPですので、あまり高望みせずに着実に進めていきたいと思います。
2. 準備
3. コンパイルと実行
4. オブジェクト指向プログラミング ・・・ 何、言ってんだかわかんないので読まないように
5. ファイル入出力
6. 表の表示
7. 表からの入力
8. データベース操作 ・・・ Oracle8 で味を占めたので、JBuilder2 を使ってアクセスしてみました(不完全)
9. 参考文献
2. 準備  ↑top
 普通の人は、Windows95/98を使って始めることと思いますので、使用する環境としてはWindows95/98を選択します。ここでは、JDKの取得およびインストール方法について記述します。
  1. 何はともあれ、ダウンロードしてきましょう。 こちら にあります。Windows版を選んでください。セットアップ用のファイルは30MBもありますので、ご注意ください。Java WorldなどにCD-ROMが付いているのでこれを購入するのもいいでしょう。セットアップファイルの名前は、「j2sdk-1_4_0_03-win.exe」 です。

  2.  
  3. これをダブルクリックして、セットアップを起動します。インストール先は指定できますが、デフォールトでは C:\jdk1.2 に展開されます。

  4.  
  5. コマンドパスを張ります。これはAUTOEXEC.BATというファイルに以下の記述を追加することで、どのディレクトリでも javac(Javaコンパイラ)やjava(実行コマンド)を使うことができるようになります。AUTOEXEC.BATの編集は、メモ帳(notepad)を立ち上げておいてそこにドラッグ&ドロップすればいいでしょう。 従来のクラスパス指定はJDK1.2より不要となりました。
    1.  
      SET PATH=C:\JDK1.4.0\BIN;
    NTや2000の場合は環境変数PATHにC:\jdk1.4.0\binを追加してください。
3. コンパイルと実行 ↑top
 「Hello」 を標準出力に書き出すだけのサンプルを使って、コンパイルと実行方法について記述します。初心者が起こしがちな間違いを私の経験(失敗ばっかりです)を活かして説明していきます。
  1. メモ帳を使って、サンプルプログラムを書いてみましょう。以下の内容を打ち込み、Hello.javaというファイル名で登録します。 ファイル名は、クラスの名前である Hello に拡張子 .java をつけたものである必要があります。
    1.  
      public class Hello {
       public static void main(String argv[ ]) {
        System.out.println("Hello World");
       }
      }
  2. このファイルをコンパイルしてみます。Windows95ではMS-DOSプロンプトを立ち上げて(真っ黒の画面のやつです)、該当のディレクトリに移動し、javac Hello.java と入力します。ここでは、Dドライブの\javaというディレクトリにHello.javaをつくったという想定で書いています。
    1.  
      C:\WINDOWS> d:
      D:\> cd java
      D:\java> javac Hello.java
  3. 同じディレクトリに、Hello.classというファイルができていると思います。これを実行するときは、javaというインタプリタを用います。以下のようにキーを叩いて見てください。 このとき拡張子の .class は付けないで指定します。
    1.  
      D:\java> java Hello
      Hello World
    ここで、Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld  と出た場合は、CLASSPATHに問題があります。
    環境変数の設定で、今いるディレクトリ(".")を参照するように変更する必要があります。

      set CLASSPATH=.;C:\...      (ピリオドとセミコロンは半角英文字です)

  どうでしょう、ちゃんと動いたでしょうか?  ここではとにかく、コンパイルができて、実行できたということが大切です。

  私がつまづいたのは、まず、ファイル名の付け方です。ファイル名=クラス名.javaでなければいけないのです。大文字・小文字が違っていてもコンパイラに怒られてしまいます。実行時も注意が必要です。java Hello.class とやっても怒られます。慣れてくると気にせずにできますが、最初は、どうしてこんな分かりにくいの? と投げ出したくなりました。

  ここでは、単に皆さんの環境に問題がないかを確認するために、コンパイルと実行をやってみたと思ってください。
実は、上記のプログラムはとても特殊な例で、オブジェクト指向の説明としてはあまりよくない例です。それでは、オブジェクト指向プログラミングとはいったいどういうことを言うのでしょうか?
 
4. オブジェクト指向プログラミング ↑top
 「オブジェクト指向..」と大きく出ましたが、私ごときが説明できるようなしろものではありません。ここでは、例題を元に説明をして皆さんがふーんと思っていただければ満足です。間違ってるかも知れませんので有識者はご指摘ください。

  この世の中、何事にも理由というものがあります。オブジェクト指向が選ばれる理由とは何でしょうか。

  いくつかの書籍を読んで総じて言えることは、 規模の大きなプログラムにおいて、製造・試験が今までの言語に比べて楽で、保守性、拡張性に優れている 、ということです。ここで「大きなプログラム」というところが重要です。簡単なプログラムについて、今までの言語と比較して考えてみましょう。

  一つ前に使ったサンプルプログラムを BASIC言語で表現してみます。

print "Hello World"
  たったの1行です。内容も直感的でプログラミング初心者にも受け入れやすいでしょう。

  次に、C言語 でサンプルプログラムを書き換えてみます。

void main () {
 printf("Hello World\n");
}
  ちょっと複雑になったとお感じでしょうか。{ }で囲われているのはなぜでしょうか。それに付けられた mainというのは何を表しているのでしょうか。voidっていうのは英語なんでしょうか。

  次に、Java言語 での例を再度示します。

public class Hello {
 public static void main(String argv[ ]) {
  System.out.println("Hello World");
 }
}
  この辺にくると、明らかに面倒くさいという気がするのは私だけではないと思います。C言語を知っていれば、内側の3行は察しが付きますが、その外のclassというのは何でしょうか。printするための関数(Javaでは関数とは言いませんが)も何やら長くなっています。

  このように、簡単なプログラムで考えると明らかにBASICが優れています。 わざわざ、Javaで書く人はいません。そういう意味でこのサンプルは、Javaを説明するには不向きで、とりあえず動いた、動いたというしろものなのです。
  今BASICを使う人はいないでしょうが(VisualBASICについてはよく知りません)、似たようなインタプリタ方式の言語である Perl というのを使って人はいっぱいいます(Perl言語というのは、どちらかというとC言語の方に近いのですが、直感的な使いやすさはBASICに通じるものがあります)。

  ここまで読んできてたプログラミング初心者の方は以下のように考えるのではないでしょうか。
   「私は大きなプログラムなど作るつもりはないので、どうもJava言語を勉強する必要はないようだ」

  結論から言うと、「いいえ、Javaを覚えた方がいいと思います」 という答えです。今のプログラムは、グラフィカルなインタフェース(画面からの入力を示していますが、それ以外のものを想像する方が難しい人も多いでしょう)が必須になってきていますが、これを実現するだけで既に大きなプログラムとなるでしょう。こんな機能も欲しいと付け加えていくと、想像以上に大きなプログラムになっていることもよくあることです。こんなプログラムは、自分で作ったものでも少し時間が経つと何が何だかわからなくなるものです。また、インターネットでブラウザを対象にしているのなら、簡単なプログラムでもJavaを使う方が得策でしょう。

  という訳で、自分でプログラムを作ってみようという人は、結果としてある程度大きなプログラムを作ることになるでしょうから、最初からJavaを勉強し、プログラミングしていくことを奨めるのです。

  次には、こんな質問が来そうです。
   「大きいプログラムだと、どうしてJavaが有利なのか。」

  前置きがとっても長くなりましたが、このセクションで説明したいのはこのことです。

 それでは、前述の流れにそってプログラミング言語の進化について私なりの解釈を書いてみます。

 まず、BASIC言語からC言語への進化の必然性について書いてみます。
 BASIC言語では、1つのプログラムを1つの流れで記述することが強要されていました。もちろんサブルーチンという考え方もありましたが、これは一まとまりの共通的な処理を切り出したに過ぎず、その中で使われる変数は共通のものでした。そのため処理を分割することでプログラムの見通しは良くなりますが、それぞれのサブルーチンを独立に考えることはできませんでした。
 サブルーチン単位でプログラム試験することはできますが、これらを結合させたときに新たな問題が発生することは避けられません。これではサブルーチンを再利用することはできますが、とても部品とまでは言えません。必ず手直しが入るからです。これはBASIC言語の最大の欠点で、これに対処するためにプログラムの構造化も試みられましたが、次に示すC言語に取って代わられました。

 C言語の大きな特長の一つに関数があります。BASICの欠点はサブルーチンの非独立性であると書きましたが、Cでは変数の受け渡しを明確に定義した関数という概念を取り入れて解決しています。先ほどのプログラムサンプルで、main() と出てきたのが関数の名前で、その範囲を { } で表しています。実際は以下のように、複数の関数間の受け渡しで始めてその有効性が理解できるでしょう。

void main() {
  char name[10];
  strcpy(name, "Tom");
  hello(name);
}
void hello (char name[10]) {
 printf("Hello World, my name is %s\n", name);
}
 この例では同じ名前の2つの変数を使っていますが、この2つが干渉し合うことはありません。この考え方により、大規模なシステムを細分化して設計、製造、試験することが可能となり、より複雑なシステム開発が実現できるようになりました。

 こんな便利なC言語ですが、使っているうちに欠点があらわになってきました。
 今度は、C言語からJava言語への進化です。 このレベルの記述ですとC++言語と同等の説明となるでしょう。

 関数内で使う変数について独立であることを書きましたが、実際のプログラムでは関数の引数として受け渡す変数が膨大な数の関数の中を流れて1つの処理を実行します。この変数が各種の処理によってどのように変化していくかは、関数の処理の流れを追っていく必要があります。ある1つの変数に着目したとき、これを書き換えている関数は複数存在し、これを管理することは重要ですがプログラム規模が大きいほど困難を伴います。関数間をデータが流れていく以上、その独立性は保てません。C言語の説明で細分化して試験できるように書きましたが、実際はこの後に関数をくっつけて結合試験なるものを実施する必要があります。

  私は仕事として、C言語を用いていくつかのシステムを開発してきました。中にはピークで100人を超えるような規模の大きなものもありました。関数が1000を超えると、関数と関数の関係など何が何だか分からなくなってきます。プログラムの開発量を減らすために同じような機能を切り出して共通関数を定義するのですが、この部分に改造が必要になってくると関数間の関連が問題になってきます。機能改善のためにプログラムに手を入れることがありますが、ちょっとしたことでも修正量や開発期間が予想以上になったしまうことはよくあることです。

 ではどうすればいいでしょうか。データが関数間を流れるのが問題であるのなら、流れないようにすればいいことになります。これをそのまま実現すると、1つの関数ですべてを処理するBASIC言語に戻ってしまって本末転倒になりますが、ここではデータが流れる関数をまとめた単位を新たに定義するということを考えます。つまり、いくつかの変数とこれを処理する関数を一まとまりにすることで、データの独立性を完全なものにしているのです。該当の変数はそのまとまりの中でしか使っていないのですから、プログラマはその中だけを意識していればいいのです。
 これがオブジェクト志向プログラミングの本質であると私は解釈しています。ただしこのままだと、C言語でデータを扱うときに構造体というもののメリットが欠落してしまいます。また、データをまとめるという観点で考えると必然的に似たような処理がいたるところに出てきます。これを解決するのが継承というしくみです。これはデータを構造化すると共にそれを処理すための方法も構造化する一石二鳥のしくみです。

 このオブジェクト志向プログラミングを実現するための言語として、Java言語が生まれました。今までにもオブジェクト志向のプログラミング言語はいくつか存在していますが、Java言語はそれらの敷居が高かった部分を改善し、有る意味では妥協して、より実装しやすい言語として登場したため、万人の支持を受けているようです。

 先ほど、「いくつかの変数とこれを処理する関数を一まとまりにする」ことを書きましたが、これをクラスといいます。この中の処理するための関数はメソッドと呼ばれます。

  それでは、少しはJavaらしいサンプルプログラムを通して、具体的に考えていこうと思います。
 
 
 
5. 配列とリスト        ↑top
 要素が増減しないものは配列、増減するものはArrayListなどを使うことが望ましいというのをどこかで読みました。VectorクラスはJDK1.1からあるものですが、同期機能を持っていることが特長のようです。ただし、処理自体は遅いらしく、同期処理を必要としない場合は、同様の機能であるArrayList を使う方がよいようです。
 

 

5. リストのソート        ↑top
 リストを画面表示する場合、見やすいようにソートすることは必須と言えますが、どのように実現するのでしょうか。JDKの仕様を見ると確かにそういうメソッドは用意されているのですが、サンプルの説明がよく分からず、用例をHP検索で探したのですが適当なページを見つけることができず、苦労しました。実現してみると簡単なことなんですがね。。 以下に示します。

class Student {
  String id;         // 学籍番号
  String name;    // 氏名
  int score;        // 点数
}


List list = new ArrayList();

// 点数(score)が大きい順にソート
Collections.sort(list,
    new Comparator() {
       public int compare(Object o1, Object o2) {
          Student first = (Student)o1;
           Student second = (Student)o2;
            return (second.score - first.score);
       }
    }
);


6. JavaMail        ↑top
 ちょっと横道にそれますが、Mailを操作するためのユーティリティが用意されていますので、ここで紹介しておきます。

 JavaMailは J2EEに属しますが、JDKから切り出されたユーティリティで、別にインストールする必要があります。メール送信だけであれば、以下の jarファイルを用意し、クラスパスを張るだけで実現可能です。

【必要な jarファイル】
  mail.jar  と activation.jar

【インストール】
  mail.jarは、 ここ から取得します。バージョンは、最新の 1.2 を用います。
  activation.jarは、JavaBeans TM Activation Framework 拡張機能である JAF (javax.activation)に対応するものですが、 ここ から入手できます。

【環境設定】
Class pathに以下を追加します。C:\jdk1.3.1_02は環境に合せてください。
  C:\jdk1.3.1_02\javamail-1.2\mail.jar
  C:\jdk1.3.1_02\jaf-1.0.1\activation.jar


【リスト1 メール送信サンプルプログラム testSmtp.java】 (Window2000にて動作確認済み)
 メールを送信するだけのサンプルプログラムを示します。この中のSMTPサーバIPアドレスと、送信先、サブジェクト、送信内容を変更して使います。

import java.util.Properties;
import javax.mail.*;
import javax.mail.event.*;
import javax.mail.internet.*;

public class testSmtp {
  public static void main( String args[] ) {

    String smtphost = "10.xxx.xxx.xxx";                  // SMTPの IP アドレス
    String from     = "egami3@cc.rim.or.jp";              // 送信元
    String to       = "egami.hideki@nttcom.co.jp ";      // 送信先
    String subject  = "Test Message";                     // サブジェクト
    String msgtext  = "This is test message.\n ";      // 送信内容

    Properties props = new Properties();
    props.put( "mail.smtp.host", smtphost );
    Session session = Session.getDefaultInstance( props, null );
    Message msg = new MimeMessage( session );

    try {
      InternetAddress fromaddr = new InternetAddress( from );
      msg.setFrom( fromaddr );

      InternetAddress[] toaddr = { new InternetAddress( to ) };
      msg.setRecipients( Message.RecipientType.TO, toaddr );

      msg.setSubject( subject );
      msg.setText( msgtext );

      Transport.send( msg );

    } catch( AddressException e ) {
      System.out.println( "Address Exception: " + e );

    } catch( MessagingException e ) {
      System.out.println( "Messaging Exception: " + e );
    }
  }
}


6. 異常の検出        ↑top
 
 
 
 
5. ファイル入出力          ↑top
 普通なら画面やアプレットから始めるのが多いようですが、情報の書き込み・読み出しを演習するためにファイルを用いることとしてるため、まずはファイルの入出力から始めます。後半では、この部分をデータベースに置き換えていきたいと思います。
 
6. 表の表示       ↑top
 JDK1.2 から組み込まれる Swing を用いて、表を表示します。これは、データベースの検索結果の表示をイメージしたものです。前節で作成したファイル読み出しを用いて一覧を表示させてみます。
 
7. 表からの入力 ↑top
  準備中です。
 
8. データベース操作  ↑top
 JBuilder を使って実現してみます。最新は JBuilder3ですが、1つ前の JBuider2 Professional というデータベースを扱えるもので試してみました。68,000円もしますから、これも個人では利用しにくいですね。
 画面を取り込んで説明します。ただし、重いので別ページ に切り出しています。
 
 
 
 
9. 参考文献 ↑top
 Javaに限らず役に立つと思われる書籍を紹介しています。本文からも参照できるようにしていきますが、一覧は こちら でまとめています。


[HOME] / [Perl] / [Oracle8]   / [Palm(GCC)][Palm(CodeWarrior)] / [EJB] / [本の紹介]

このページにご意見のある方は、egami@ee.e-mansion.com までお願い致します。