2008年5月アーカイブ

 プログラムを開発するのに、開発ツールを利用していませんか?私はJavaでよく利用されているEclipseの履歴機能が気に入って、Eclipseを利用しています。

 Eclipseの履歴機能には、

「元に戻す」
「ファイルを保持する日数」
「ファイル当たりの最大のエントリー数」
「最大ファイル・サイズ」

という機能があるのですが、それぞれ簡単に設定できるので、よければお試しあれ!


 動作環境には、

OS:Mac OS X 10.5.3 Leopard
Eclipse:3.3.2(Europa)

を利用していますが、OSにWindowsやEclipseには、3.2などの3.X系でも利用できます。

Eclipseの「設定」から履歴機能を変更できます。
私の環境では、「Eclipse」メニューから「Preferences」をクリックすると「設定画面」ウィンドウが表示されます。
WindowsのEclipse 3.2なら「ウィンドウ(W)」メニューから「設定(P)」をクリックすると「設定画面」ウィンドウが表示されます。
画面で確認してみましょう!

設定画面.jpg


「元に戻す」という機能は、一般的な入力の戻りや取り消しが行える回数の事で次のように、設定します。

テキスト・エディター.jpg
表示をクリックすると拡大されて表示されます。

「ローカル・ヒストリー」の中にある「ファイルを保持する日数」、「ファイル当たりの最大のエントリー数」、「最大ファイル・サイズ」の機能を画像で確認してみましょう。

ローカル・ヒストリー.jpg
表示をクリックすると拡大されて表示されます。

 「ファイルを保持する日数」に、最大値を入れて再度設定画面を開くと、画像のような数になりますが、ここまで保持する必要があるかは微妙ですけど、私にはありがたいです。
 「ファイル当たりの最大のエントリー数」、「最大ファイル・サイズ」も画面の値が最大値で、警告が表示されるまで入力してみました。


 試しに、ローカル・ヒストリーから操作を戻してみましょう!比較もできるので、履歴をみることでどうのように変化したかも確認できます。

ローカル・ヒストリーへ.jpg
表示をクリックすると拡大されて表示されます。

ローカル・ヒストリーをクリックすと、比較画面が表示されます。
比較.jpg
表示をクリックすると拡大されて表示されます。

 時刻をクリックすると現在の比較が表示されます。ねえ、便利でしょ?

 Eclipseの良さは、他にもあると思いますが、後々戻せるので、私の場合は安心して作業に取り込めます。操作性は、Eclipseが現在と差はないので、履歴機能の設定を最大限にしても損はないと思います。

 先日、私が所属しているWEB-DBチームのリーダから私が作成したWebで、リンク切れしているWebがあると言われました。
他のメンバー、先輩は見れているようで私も常に確認していましたが、リンク切れしていることはありませんでした。

リンク切れはたまたまだろうと思いながらも、作成したローカル上で「IE」、「Firefox」、「Safari」を使い調べましたが、試したブラウザでは、リンク切れしていませんでした。
そこで今度は、ローカル上ではなくサーバ上のWebを迂回していると、「Firefox」だけがリンク切れしているのを発見しました。
そう言えばリーダは商品説明のときに、「Firefox」を利用してることを思い出し「これだ!」と思い、リンク切れのURLを見ました。URLには、「ncad.co.jp/~arai/pro3seminar%5Cpro3seminar.html」と表示されます。

URLに「%5C」という文字が含まれていますが、「%5C」にリンクするWebは作成していませんので「%5C」が原因だと分かりました。「%5C」を「/」に変えると問題なく適切なWebが表示されます。

勘が鋭い方はもうお分かりでしょうか?URLを指定するときに、「/」ではなく「\」を使っていたのです。
なぜか(といっても作成したのは私ですが)、ひとつ階層を下がるときにだけ「\」を使っていたようです。階層を戻るときには、すべて「../」などのように指定しているのですが、Windowsの操作に慣れてしまったせいかもしれません。

  タイトルに「\」の親切、不親切と書きましたが、タイトルの意図が分かったでしょうか?「Firefox」が親切か?不親切か?を決めるのではなく、どう思っていただくかを述べたかったのです。

 「\」で指定しても正しく表示される「IE」や「Safari」の方が親切かと思うかもしれませんが、「Firefox」も場合によっては親切とも言えます。

「なぜ?」と聞かれれば、「\」はHTMLを作成する上では標準ではないからです。本来階層を表すのは、「/」であり「\」は「IE」や「Safari」がきっと「\」は「/」と書きたかったのだろうと気を使ってくれて「/」と認識してくれたのだと思います。
ローカル上でも「Firefox」は「\」指定だとリンクできないようにして欲しかったのですが、Windowsのローカル上では、「\」は階層を表すのでしょうがないですね。
まだ技術者とは名乗れませんが、「\」を「/」と親切に対応してくれるよりもせめて警告を表示してくれると開発する上ではありがたいですね。
なにかアプリを開発するときにでもできるだけ標準で作成したほうが、流用性は高くなります。
今回の問題は、「IE」を中心に作成していたため気づかなかった問題ですが、もし「Firefox」を中心に作成していたら「\」の問題はなかったかもしれません。技術者の中には、「\」で表示されないほうが親切と感じませんか?
ただ、表示すらされないというのはWebの作成者としては他の人に見てもらえないのは残念ですが。

 

 「\」に対応したブラウザ、「\」に対応してないブラウザどちらが親切、不親切だと思いますか?

前回はDJUnitを使った単体試験を紹介しましたが、今回はWEBアプリケーションでよく使われるStrutsのアクションクラスのテストを楽に行うライブラリを紹介いたします。
StrutsTestCaseを利用することによってアクション単位にテストすることが可能でブラウザを開かなくても試験ができます。今まではアクションの試験は実際にブラウザを動かす必要があったため面倒なものでした。さらに画面から入力される情報をプログラム上で作成するので未入力でボタンを押したなどのバリデートのテストも同時行えます。

 

StrutsTestCase for JUnit
http://sourceforge.net/project/showfiles.php?group_id=39190

cactus(今回はStrutsTestCaseの中にあるjarを使いますので落とさなくても良いです)
http://jakarta.apache.org/cactus/downloads.html

【環境・バージョン情報】
OS:WindowsXP SP3
Eclipse:3.3.2
JDK:JDK1.5.0
StrutsTestCase:strutstest214-1.2_2.4.zip
Tomcat:6.0.16
struts:1.2
 

すでにhttp://localhost:8080/sampleでログイン処理後(セッションにユーザID格納)、一覧ページを開くような処理が実装されているとします。

 

StrutsTestCase for JUnitのページからダウンロードしたstrutstest214-1.2_2.4.zipのexamples\test.warに入っているjarの中身を利用します。

【新たに追加したLIB】
aspectjrt-1.2.1.jar
cactus-13-1.7.jar
commons-collections.jar
commons-httpclient-2.0.jar
junit-4.0.jar
strutstest-2.1.4.jar

 

WEB.xmlに記述を追加します。

【WEB.xmlの追加】
    <!-- Cactus Servlet Redirector configuration -->
    <servlet>
        <servlet-name>ServletRedirector</servlet-name>
        <servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
    </servlet>

    <!-- Cactus Servlet Redirector URL mapping -->
    <servlet-mapping>
        <servlet-name>ServletRedirector</servlet-name>
        <url-pattern>/ServletRedirector</url-pattern>
    </servlet-mapping>

 

以下のように記述したcactus.propertiesをsrc直下に置きコンパイルすればclassesにコピーされます。

【cactus.propertiesの中身】
cactus.contextURL = http://localhost:8080/sample
cactus.servletRedirectorName = ServletRedirector
cactus.enableLogging=true
 

そこで以下のようなテストプログラムを作成して、Tomcatプラグインを起動しつつ、JUnitで実行してみると

StrutsTestCaseを使って楽にアクションのテストを行う1.JPG

StrutsTestCaseを使って楽にアクションのテストを行う2.JPG

と無事にJUnitが完了できました。

setUpメソッドにログイン処理を書くことができることによって、ログインした状態で各ページのテストを実行することが可能です。これはわざわざブラウザでログインしないでテストできるので、シナリオを作ってテストするようなツールで実行するより早くテストが実行できるかもしれません。

 

最終的にはJSPも含めたブラウザからのテストをしないといけないのですが、アクションのテスト結果も出せなどと言われた場合や、余裕があるプロジェクトでは利用する価値はあるのではないでしょうか。

やっぱりvi(2)

| | コメント(0)

前回、viに関する記事を書いたので、それに続けて、私がよく使う機能を紹介したいと思います。

コーディングを行っているとよくコピー&ペーストを行うと思います。
その際は、単純にマウスで範囲選択して、コピー&ペーストを行うと言うのが一般的ではないかと思いますが、viの機能でもそのような事が出来ます。
利点は、キーボードから手を離す必要がなく、複数のコピーを保持しておけると言う点です。

まずは、単純に複数行をコピー&ペーストする例です。

例として、次のような3行が記述されているファイルを想定します。
---------------
ABC
DEF
GHI
---------------

この3行をコピーして、最終行の後にペーストします。
[Esc]キーを押してコマンドモードになっていると言う状態から始めます。

1. [1G] キーを押す。
意味: ファイルの先頭にカーソルを移動する。

2. [3yy] キーを押す。
意味: カーソル位置から3行を記憶する。

3. [G] キーを押す。
意味: ファイルの最終行にカーソルを移動する。

4. [p] キーを押す。
意味: 先程記憶した3行をカーソル位置の次の行に貼り付ける。

結果:
---------------
ABC
DEF
GHI
ABC
DEF
GHI
---------------

この方法ですと、別の行を記憶した場合、前述の3行は上書きされてしまいます。
コピー内容を保持しておく為には、名前付きのバッファにコピーする必要があります。
バッファの名前としては、アルファベット1文字が割り当てられています。

次にバッファbに3行をコピーしてペーストする例を記述します。
(条件は最初の例と同様です。)

1. [1G] キーを押す。
意味: ファイルの先頭にカーソルを移動する。

2. ["b3yy] キーを押す。
意味: バッファbにカーソル位置から3行を記憶する。

3. [G] キーを押す。
意味: ファイルの最終行にカーソルを移動する。

4. ["bp] キーを押す。
意味: バッファbに記憶した3行をカーソル位置の次の行に貼り付ける。

これにより、別の行を名前なしのバッファにコピーしてもバッファbの内容は保持されます。
これを応用し、複数のコピー&ペーストを行う例を記述します。

1行目と3行目をそれぞれバッファbとバッファcにコピーしてペーストします。
(条件は最初の例と同様です。)

1. [1G] キーを押す。
意味: ファイルの先頭にカーソルを移動する。

2. ["byy] キーを押す。
意味: バッファbにカーソル位置の行を記憶する。

3. [2j] キーを押す。
意味: 現在行から2行下にカーソルを移動する。

4. ["cyy] キーを押す。
意味: バッファcにカーソル位置の行を記憶する。

5. ["bp] キーを押す。
意味: バッファbに記憶した行をカーソル位置の次の行に貼り付ける。

6. ["cp] キーを押す。
意味: バッファcに記憶した行をカーソル位置の次の行に貼り付ける。

結果:
---------------
ABC
DEF
GHI
ABC
GHI
---------------

最後に複数行をコピーする場合の別の方法を紹介します。
前述では、3行をコピーしましたが、行数が多くなると、何行コピーしたいと言うよりはここからここまでコピーしたいと考えると思います。
その例として、ABCの行からGHIの行までをバッファbにコピーしてペーストする方法を記述します。
(条件は最初の例と同様です。)

1. [1G] キーを押す。
意味: ファイルの先頭にカーソルを移動する。

2. [ma] キーを押す。
意味: マークaにカーソル行の位置を記憶する。

3. [2j] キーを押す。
意味: 現在行から2行下にカーソルを移動する。
(実際は、何行下にあるか解らないので、jキー等の移動キーで、GHIの行まで移動する。)

4. ["by'a] キーを押す。
意味: バッファbにマークaの行からカーソル行までを記憶する。

5. [G] キーを押す。
意味: 最終行にカーソルを移動する。

6. ["bp] キーを押す。
意味: バッファbに記憶した行をカーソル位置の次の行に貼り付ける。

結果:
---------------
ABC
DEF
GHI
ABC
DEF
GHI
---------------

上記2で、カーソル行の位置を記憶しましたが、これは、コピーの場合だけでなく、カーソルの移動にも使用出来ます。使用方法は、'+マーク名で、上記の例ですと['a]を入力する事で、ABCの行にカーソルを移動出来ます。

長くなりましたが、この機能を使う事で、複数個所のコードを一箇所にまとめたり、記憶した内容を繰り返し利用する場合などに便利だと思います。

 プログラミングを知ろう、学ぼうと言う企画で全7回説明してきましたが、7回目は6回説明してきた事やこれからどう勉強するかについてまとめます。

 この企画の受講状況を各自で管理してもらおうと思い管理表をGW_firstJava.xlsからダウンロードできますので使ってもらえると各自の進行具合が分かります。学び終えた場所の「日付」に「Ctrl+;」を「時刻」に「Ctrl+:」を押せば終了した日付と時刻を記憶できます。PDF版はGW_firstJava.pdfからダウンロードできます。なお、ファイルはウィルスバスターでウィルスチェックしています。


7-1.プログラミング入門者の3つの壁

 プログラミング入門者(GW企画の対象者)には、3つの壁があります。プログラミング入門者の3つの壁に詳しい説明がありますので読んでみると面白いと思います。では、ここで何を説明するかですが、さて、GW企画で「プログラミング入門者の3つの壁」を越えられる力が身についているのでしょうか疑問も思われる方がいるかもしれません。答えは十分力は付いて、6回読む前とでは思考能力も向上しているでしょう。それでは3つそれぞれ見ていく事にしましょう。

1.「HelloWorld」出力の壁
2.言語特有の壁
3.30行「50行」の壁

7-1-1.「HelloWorld」出力の壁

 「HelloWorld」出力の壁には2つのポイントがあります。1つ目は、その事自体を知る(今回で言えばプログラミング、Javaを知る)と2つ目は、準備をして初めてのプログラム「HelloWorld」を出力する事でした。壁を越えられる力は次の回でした。

GW企画 1回目 プログラムの第一歩

知るだけでも大きな成果でそこから調べるべきキーワードも自ずと見えてきたはずです。

7-1-2.言語特有の壁

 私たち通常コミュニケーション日本や英語でもそれぞれに言語特有の難しいポイント(壁)が存在します。プログラミング言語でも言語それぞれに壁があるのです。GW企画で採用したJavaでは1つとしてオブジェクト指向からプログラミングに適用する事を焦点に絞り壁を越えられるように説明してきました。壁を越えられる力は次の回でした。

GW企画 5回目 ERDからクラスへ ロジッククラス作成
GW企画 6回目 ERDからオブジェクト指向に対応

 2つの回でもオブジェクト指向のメリット・デメリットを知る事が出来たのではないでしょうか。

7-1-3.30行「50行」の壁

 30行「50行」の壁は、一般的な入門書ではプログラミングの機能自体を教える事や入門者に見やすいようにとどうしても行数が限られてしまいます。
例えば、Cなら1つの機能を教えるのに「30行」あればたり、Javaのようなオブジェクト指向言語はクラスの説明でも「50行」あれば足りてしまいます。
GW企画では、7回と言う短い期間で行うと言う事で少しソースが長くても頑張って貰おうと思い30行「50行」の壁を越えられる力を説明しました。壁を越えられる力は次の回でした。

GW企画 5回目 ERDからクラスへ ロジッククラス作成
GW企画 6回目 ERDからオブジェクト指向に対応

 ソースの長さに戸惑ったと思いますが、1つ1つの処理(例えばクラスやメソッド)を見ても処理される事はそれほど難しい事ではなく、他のクラスやメソッドでも同じ事が書かれていると知っていただくだけも30行「50行」の壁は越えられる力の一歩になるでしょう。

7-2.今後の勉強について(入門者から初心者へ中級者を目指して

 プログラミング(Java)をマスターするにはGW企画の7回ではまだまだ不十分ですが、プログラミング(Java)を知ってはもらえたと思います。
今後は、一般的な入門書を見ながら初心者向けの本や中級者向けの実践本を勉強できる力は備わっているはずです。

 

 全7回最後までお読みいただきありがとうございます。勉強するには、ある程度期間(例えば1ヶ月)を決めて取り組み自分が作成してみたい事もプロジェクトして取り組むと大変勉強になります。最後に、全体を通して参考になるWebを紹介します。

・Javaプログラミング入門者・初心者向け
1.Java入門講座
2.JavaでHello World
3.Javaの道(Java入門・リファレンス)

・プログラマー・SEを目指す人向け
1・エンジニアのための『仕事・職場・転職』応援サイト Tech総研
2・エンジニア★流星群 @Tech総研

・全般的なプログラミング講座
1.@IT - アットマーク・アイティ

 前回は、ERDからJavaクラスを作成しロジッククラスで処理していましたが、ERDはデータベースに基づいた設計でありオブジェクト指向に反していると指摘しました。
今回は、オブジェクト指向を意識してソースを書き換えました。

 この企画の受講状況を各自で管理してもらおうと思い管理表をGW_firstJava.xlsからダウンロードできますので使ってもらえると各自の進行具合が分かります。学び終えた場所の「日付」に「Ctrl+;」を「時刻」に「Ctrl+:」を押せば終了した日付と時刻を記憶できます。PDF版はGW_firstJava.pdfからダウンロードできます。なお、ファイルはウィルスバスターでウィルスチェックしています。


6-1.インタフェースソース

BankCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * 銀行に関する共通インタフェース
 * 
 * @author arai
 */
public interface BankCommon {

    /**
     * 銀行名を返す
     * 
     * @return 銀行名
     */
    public String getBackName();

}

UserCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * ユーザに関する共通インタフェース
 * 
 * @author arai
 */
public interface UserCommon {

    /**
     * ユーザIDを返す
     * 
     * @return ユーザID
     */
    public String getUserID();
}

AccountTypeCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * 口座の種類に関する共通インタフェース
 * 
 * @author arai
 */
public interface AccountTypeCommon {

    /**
     * 口座の種類番号を返す
     * 
     * @return 口座の種類番号
     */
    public int getAccountTypeNumber();
}

AccountCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * 口座に関する共通インタフェース
 * 
 * @author arai
 */
public interface AccountCommon {

    /**
     * 口座番号を返す
     * 
     * @return 口座番号
     */
    public int getAccountNumber();
}

6-2.モデルソース

JavaBankModel.java

UserModel.java

AccountTypeModel.java

AccountModel.java

AccountManagementModel.java


6-3.ソースの解説

 今回は、新たに「例外処理」を導入しています。
例外処理とは、予測されるエラーが発生した場合の処理を決めておくことです。
書き方は、


try { 例外が起こると予想される処理 } catch (例外クラス 変数) { 例外が発生した場合の処理 }
のように書きます。
例えば、クラスはまだインスタンス化(オブジェクトが生成できていない)されていない時に「null」(空)を返します。
「null」の場合に、メソッドにアクセスすると「NullPointerException」が発生します。
対処するには、以下の

try { 例外が起こると予想される処理 } catch (NullPointerException e) { }
のように書くと「キャッチ」してくれプログラムが止まることなくそれ以降の処理が実行されます。

6-4.サンプルソース

Sample5_1.java
package jp.co.ncad.gw.erd.sample;

import jp.co.ncad.gw.erd.model.JavaBankModel;
import jp.co.ncad.gw.erd.model.UserModel;

public class Sample5_1 {

    // ここからスタート
    public static void main(final String[] args) {

        // ユーザ「ジャバ太郎」を作成
        UserModel javaTarou = new UserModel();
        javaTarou.create("java", "ジャバ太郎", "obj", "1980/1/1");

        JavaBankModel javaBank = new JavaBankModel();
        javaBank.addUser(javaTarou); // ユーザ登録

        javaBank.newAccount("pro", "普通預金"); // 存在しないユーザIDを選択すると・・・
        javaBank.newAccount(javaTarou.getUserID(), "特別預金"); // 存在しない口座の種類を選択すると・・・
        javaBank.newAccount(javaTarou.getUserID(), "普通預金");

        // 画面に情報を表示
        javaBank.viewScreen(javaTarou.getUserID());

        int javaAccNum = javaBank.getAccountNumber(javaTarou.getUserID());
        javaBank.addSaving(javaAccNum, 10000); // 預金を預ける

        System.out.println(); // 空行を表示

        // 口座情報だけ表示
        javaBank.viewAccount(javaTarou.getUserID());

    }
}
proはユーザの登録が行われていません
特別預金が存在しません。存在する口座の種類名を指定下さい
銀行名:ジャバ銀行
銀行住所:東京
ユーザID:java
ユーザ名:ジャバ太郎
パスワード:obj
生年月日:1980/1/1
口座番号:1
預金金額:0
口座の種類名:普通預金

口座番号:1
預金金額:10000
口座の種類名:普通預金
            

6-5.オブジェクト指向に対応して

 オブジェクト指向は、メッセージ(メソッド)と要素(フィールド)をクラスの中に1つとして定義する事から正規化されたERDに比べ冗長になってしまいます。
ですが、オブジェクト指向にする事によりクラス自体に意味を持ちクラスの存在がより明確に定義できます。
あまりオブジェクト指向を忠実に宣言しすぎるとより冗長になり重複部分が増えて処理速度、メモリに負担が掛かります。
他の言語に比べオブジェクト指向言語は特に設計の問題が重要で設計者やプログラマの力量にも大きく関わってくる事が分かったと思います。

次回は、6回のまとめをして終わらせようと考えています。

 5回目は、4回目で作成したクラスを操作するロジッククラスを作成します。

 この企画の受講状況を各自で管理してもらおうと思い管理表をGW_firstJava.xlsからダウンロードできますので使ってもらえると各自の進行具合が分かります。学び終えた場所の「日付」に「Ctrl+;」を「時刻」に「Ctrl+:」を押せば終了した日付と時刻を記憶できます。PDF版はGW_firstJava.pdfからダウンロードできます。なお、ファイルはウィルスバスターでウィルスチェックしています。

5-1.ロジッククラス

5-1-1.長いソースを理解するには

 ロジッククラスは、300行近くあるので

JavaBankLogic.javaからダウンロードしてタイピングしないでそのまま使ってもらってもかまいません。

長いソースを理解するには、自分自身で「main()」メソッドを作成し実際に動きを確認する方法が効果的です。
下のソースに、サンプルとして載せて置いたのでサンプルソースを見ながら進めるのもいいでしょう。
また、いっぺんに見ようとはせずメソッド単位を見れば大した処理では無い事に気づき他のメソッドも似たような処理とも分かります。

ロジッククラスで新しく加わった処理を説明していきます。

5-1-2.リスト

 リストは、その名の通り一覧と言う意味ですが、Javaではリストを管理できるクラス「ArrayList」があります。
「ArrayList」は、「List」インタフェースを実装して「<>」の中に、格納するクラスを記述します。
例えば、ユーザをリストで管理したい場合には、「List<UserModel>」のように宣言時には、「List」を使いインスタンス化するときには、「ArrayList<UserModel>」で行います。
リストに追加するには、「set(追加する値)」となり、値に「UserModel」オブジェクトを格納します。
リストから取り出すには、「get(位置)」となり、追加した何番目かを指定してあげます。
リストから登録数を取得するには、「size()」で取得できます。

5-1-3.if文

プログラムがただ一方的に流れていては柔軟なプログラムが出来ませんよね。ではどうすればいいと思いますか。
それは、処理の流れを状況に応じて変えることが一番大きく影響しますよね。
Javaでは、if文を使用し状況に応じて適切な処理に振る事ができます。

書き方は、以下のように記述します。

if (条件式) {

: }
「条件式」が真の時にだけ「{}」の中を処理し、偽は「}」以降から処理します。
条件の式は「==」「!=」「<」「<=」「>」「>=」を使い、それぞれ「等しい」「等しくない」
「小さい」「以下」「大きい」「以上」を意味しています。
条件が合えば「true」という真の意味に、合わなければ「false」という偽の意味になります。

5-1-4.for文

 リストのように1つ1つデータをif文で調べていくのは大変ですね。それではコンピュータを使ってプログラミングする必要性がありません。
for文は、決められた回数繰り返すのに、変数をうまく使い処理を繰り返しています。

書き方は、以下のように記述します。

for (最初に一回; 条件; 文の後に) {
	文
}


サンプルプログラムの一番多い書き方は、
for (int i = 0; i < リスト.size(); i++) {
    :
    :
}
で「int i = 0」でiの宣言をして0で初期化してリスト.size()まで繰り返しています。
「{」から始まり「}」を過ぎると「i++」が実行されてiに1を足して繰り返します。
5-2.サンプルプログラムで実行してみよう

5-2-1.サンプルソース
Sample4_1 .java
package jp.co.ncad.gw.erd.sample;

import jp.co.ncad.gw.erd.logic.JavaBankLogic;
import jp.co.ncad.gw.erd.model.UserModel;

public class Sample4_1 {

    // ここからスタート
    public static void main(final String[] args) {

        // ユーザ「ジャバ太郎」を作成
        UserModel javaTarou = new UserModel();
        javaTarou.setUserID("java");
        javaTarou.setName("ジャバ太郎");
        javaTarou.setPassword("obj");

        JavaBankLogic javaBankLogic = new JavaBankLogic();
        javaBankLogic.addUser(javaTarou); // ユーザ登録

        javaBankLogic.newAccount("pro", "普通預金"); // 存在しないユーザIDを選択すると・・・
        javaBankLogic.newAccount(javaTarou.getUserID(), "特別預金"); // 存在しない口座の種類を選択すると・・・
        javaBankLogic.newAccount(javaTarou.getUserID(), "普通預金");

        int javaAccNum = javaBankLogic.getAccountNumber(javaTarou.getUserID());
        javaBankLogic.addSaving(javaAccNum, 10000); // 預金を預ける

        UserModel user = javaBankLogic.getUser(javaTarou.getUserID()); // 銀行にユーザIDから自分の情報を貰う
        System.out.println(user.getUserID() + "の銀行情報");
        System.out.println("銀行名:" + javaBankLogic.getJavaBankName());
        System.out.println("銀行住所:" + javaBankLogic.getJavaBankAddress());
        System.out.println("ユーザID:" + user.getUserID());
        System.out.println("ユーザ名:" + user.getName());
        System.out.println("パスワード:" + user.getPassword());
        System.out.println("生年月日:" + user.getBirth());
        int accNum = javaBankLogic.getAccountNumber(user.getUserID());  // 口座番号を取得
        System.out.println("口座番号:" + accNum);
        System.out.println("預金金額:" + javaBankLogic.getSaving(accNum));
        System.out.println("口座種類名:" + javaBankLogic.getAccountTypeName(accNum));

    }
}
   
  
proはユーザの登録が行われていません
特別預金が存在しません。存在する口座の種類名を指定下さい
javaの銀行情報
銀行名:ジャバ銀行
銀行住所:東京
ユーザID:java
ユーザ名:ジャバ太郎
パスワード:obj
生年月日:null
口座番号:1
預金金額:10000
口座種類名:普通預金

難しいと感じたらロジッククラスに例えば以下のように追加してみましょう。

 

/**
    *  コンストラクタ
* 初期化処理 */ public JavaBankLogic() { System.out.println("コンストラクタ通過1"); javaBank = new JavaBankModel(); : 以下省略


 一通り3回目で登場した文章の動作に近づきましたね。でも、Javaはオブジェクト指向でありDB設計のERDとは相反します。ERDは正規化を求めたのに対して、オブジェクト指向は要素とメッセージを一つに併せた考えです。
次回は、オブジェクト指向により近づける為にソースプログラムを変えて説明します。

参考引用したWeb
KMG プロ3ゼミ Java入門講座 単位3 判断が分かるときは
KMG プロ3ゼミ Java入門講座 単位4 処理を繰り返すには

 4回目は、3回目で作成したERDを元にクラスを作成します。

 この企画の受講状況を各自で管理してもらおうと思い管理表をGW_firstJava.xlsからダウンロードできますので使ってもらえると各自の進行具合が分かります。学び終えた場所の「日付」に「Ctrl+;」を「時刻」に「Ctrl+:」を押せば終了した日付と時刻を記憶できます。PDF版はGW_firstJava.pdfからダウンロードできます。なお、ファイルはウィルスバスターでウィルスチェックしています。

4-1.ERDからクラスへ

 クラスを作成する前に、インタフェースと言う「2つ以上の手順、技術、規格や仕様」を作成します。

ERDで主キーを設定しましたが、主キーは他のテーブルにも使われることからインタフェースにメソッドを決めておく必要があります。
メソッドとは、オブジェクト指向で言うメッセージに該当し「手続き」と訳されてクラスの中に定義します。
それでは順次見ていく事にしましょう。

4-2.インタフェースの作成

 インタフェースを作成するのは、ジャバ銀行、ユーザ、口座の種類と口座です。
メソッドを定義するのは、主キーの箇所で定義だけ行い処理の内容は書きません。

4-2-1.インタフェースのソース 

BankCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * 銀行に関する共通インタフェース
 */
public interface BankCommon {

    /**
     * 銀行名を返す
     * 
     * @return 銀行名
     */
    public String getBackName();

}
  

UserCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * ユーザに関する共通インタフェース
 * 
 * @author arai
 */
public interface UserCommon {

    /**
     * ユーザIDを返す
     * 
     * @return ユーザID
     */
    public String getUserID();

    /**
     * ユーザIDを設定
     * 
     * @param userID ユーザID
     */
    public void setUserID(String userID);
}
  

AccountTypeCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * 口座の種類に関する共通インタフェース
 */
public interface AccountTypeCommon {

    /**
     * 口座の種類番号を返す
     * 
     * @return 口座の種類番号
     */
    public int getAccountTypeNumber();

    /**
     * 口座の種類番号を設定
     * 
     * @param accountType 口座の種類番号
     * @return 口座の種類番号
     */
    public void setAccountTypeNumber(int accountTypeNumber);
}
  

AccountCommon.java
package jp.co.ncad.gw.erd.common; // 共通に所属

/**
 * 口座に関する共通インタフェース
 */
public interface AccountCommon {

    /**
     * 口座番号を返す
     * 
     * @return 口座番号
     */
    public int getAccountNumber();

    /**
     * 口座番号を設定
     * 
     * @param accountNumber 口座番号
     */
    public void setAccountNumber(int accountNumber);
}
  

 ソースを見てみるといくつか新しいのが出てきているので説明します。

4-2-2.パッケージ

 行の先頭に「package」と書かれていますが、これはパッケージといいクラスやインタフェースをグループごとにまとめる役目をします。
まとめる方法としては、作成者名、作成者が所属する名前、クラスやインタフェースの種類によって作成しています。
例えば、「jp.co.ncad.gw.erd.common」は、共通のERDプログラムでGWプロジェクトの作成者(所属名)を「ncad.co.jp」のグループとすると解釈できます。
パッケージの解釈やルールはプロジェクトごとにルールを決めておくのが一般的です。

4-2-3.インタフェースの構文

 インタフェースは、「interface」キーワードで作成して構文で表すと以下のようになります(プログラム規則)。
アクセス修飾子 interface インタフェース名 {
	メソッドを定義
}
インタフェース名は、クラス名と同じで単語の1文字目はすべて大文字です(Java主義)。

4-2-4.メソッド

 構文中にメソッドの定義と書いていますが、インタフェースではメソッドを定義するだけで処理は書きません。
メソッドを構文で書くと以下のようになります。
アクセス修飾子 戻り値 メソッド名(引数) {
	:
	:
}
 戻り値はメソッドの呼び出し元に対して返す値で「void」は何も返さないことを意味しています。
引数は、「型名 変数名」の形で「,」を指定する事により複数定義する事が可能です。

4-2-5.JavaDocコメント

 「/** */」は、「//」と同じコメントですが「JavaDoc」という「仕様ドキュメント」を自動で作成するために用いられます。
仕様ドキュメントとは、クラスやメソッドを集めたものをHTMLとし各情報を参照できるように管理しています。
「<br />」とコメント中に書かれていますが、「<br />」はHTMLでの改行にあたり仕様ドキュメントを作成すると指定した行が改行されます。
「@」以降に、「@return」または「@param」などを指定します。
「@return」は戻り値が何かを示し、「@param」は引数(メソッドに渡す値)が何かを示しています。

4-3.モデルの作成

4-3-1.モデルソース

JavaBankModel.java
package jp.co.ncad.gw.erd.model; // モデルに所属

import jp.co.ncad.gw.erd.common.BankCommon;

/**
 * Java銀行
* 銀行に関する共通インタフェース及び顧客に関する共通インタフェースを実装 */ public class JavaBankModel implements BankCommon { /** 銀行名 */ private String backName; /** 銀行住所 */ private String address; /** * コンストラクタ
* 要素の初期化を行います */ public JavaBankModel() { backName = "ジャバ銀行"; address = "東京"; } /** * 銀行住所を返す * * @return 銀行住所 */ public String getAddress() { return address; } /** * 銀行住所を変更する * * @param address 銀行住所 */ public void changeAddress(String address) { this.address = address; } /** * 銀行名を返す * * @return 銀行名 */ public String getBackName() { return backName; } /** * 銀行名を変更 * * @return 銀行名 */ public void changeBackName(String backName) { this.backName = backName; } }
  

UserModel.java
package jp.co.ncad.gw.erd.model; // モデルに所属

import jp.co.ncad.gw.erd.common.UserCommon;

/**
 * ユーザモデル
* ユーザに関する共通インタフェースを実装 */ public class UserModel implements UserCommon { /** ユーザID */ private String userID; /** ユーザ名 */ private String name; /** パスワード */ private String password; /** 生年月日 */ private String birth; /** * 生年月日を返す * * @return 生年月日 */ public String getBirth() { return birth; } /** * 生年月日を設定 * * @param birth 生年月日 */ public void setBirth(String birth) { this.birth = birth; } /** * ユーザ名を返す * * @return ユーザ名 */ public String getName() { return name; } /** * ユーザ名を設定 * * @param name ユーザ名 */ public void setName(String name) { this.name = name; } /** * パスワードを返す * * @return パスワード */ public String getPassword() { return password; } /** * パスワードを設定 * * @param password パスワード */ public void setPassword(String password) { this.password = password; } /** * ユーザIDを返す * * @return ユーザID */ public String getUserID() { return userID; } /** * ユーザIDを設定 * * @param userID ユーザID */ public void setUserID(String userID) { this.userID = userID; } }
  

AccountTypeModel.java
package jp.co.ncad.gw.erd.model; // モデルに所属

import jp.co.ncad.gw.erd.common.AccountTypeCommon;

/**
 * 口座の種類モデル
* 口座の種類に関する共通インタフェースを実装 */ public class AccountTypeModel implements AccountTypeCommon { /** 口座の種類番号 */ private int accountTypeNumber; /** 口座の種類名 */ private String accountTypeName; /** * 口座の種類名を返す * * @return 口座の種類名 */ public String getAccountTypeName() { return accountTypeName; } /** * 口座の種類名を設定 * * @param accountTypeName 口座の種類名 */ public void setAccountTypeName(String accountTypeName) { this.accountTypeName = accountTypeName; } /** * 口座の種類番号を返す * * @return 口座の種類番号 */ public int getAccountTypeNumber() { return accountTypeNumber; } /** * 口座の種類番号を設定 * * @param accountType 口座の種類番号 * @return 口座の種類番号 */ public void setAccountTypeNumber(int accountTypeNumber) { this.accountTypeNumber = accountTypeNumber; } }
  

AccountModel.java
package jp.co.ncad.gw.erd.model; // モデルに所属

import jp.co.ncad.gw.erd.common.AccountCommon;
import jp.co.ncad.gw.erd.common.AccountTypeCommon;

/**
 * 口座モデル
* 口座に関する共通インタフェース、口座の種類に関する共通インタフェースを実装 */ public class AccountModel implements AccountCommon, AccountTypeCommon { /** 口座番号 */ private int accountNumber; /** 預金金額 */ private long saving; /** 口座の種類番号 */ private int accountTypeNumber; /** * 口座番号を返す * * @return 口座番号 */ public int getAccountNumber() { return accountNumber; } /** * 口座番号を設定 * * @param accountNumber 口座番号 */ public void setAccountNumber(int accountNumber) { this.accountNumber = accountNumber; } /** * 口座の種類番号を返す * * @return 口座の種類番号 */ public int getAccountTypeNumber() { return accountTypeNumber; } /** * 口座の種類番号を設定 * * @param accountType 口座の種類番号 * @return 口座の種類番号 */ public void setAccountTypeNumber(int accountTypeNumber) { this.accountTypeNumber = accountTypeNumber; } /** * 預金金額を返す * * @return 預金金額 */ public long getSaving() { return saving; } /** * 預金金額を追加 * * @param saving 預金金額 */ public void addSaving(long saving) { this.saving += saving; } }
  

AccountManagementModel.java
package jp.co.ncad.gw.erd.model; // モデルに所属

import jp.co.ncad.gw.erd.common.AccountCommon;
import jp.co.ncad.gw.erd.common.BankCommon;
import jp.co.ncad.gw.erd.common.UserCommon;

public class AccountManagementModel implements BankCommon, AccountCommon,
        UserCommon {

    /** 銀行名 */
    private String  backName;
    /** ユーザID */
    private String  userID;
    /** 口座番号 */
    private int     accountNumber;

    /**
     * 口座番号を返す
     * 
     * @return 口座番号
     */
    public int getAccountNumber() {

        return accountNumber;
    }

    public void setAccountNumber(int accountNumber) {

        this.accountNumber = accountNumber;
    }

    /**
     * 銀行名を返す
     * 
     * @return 銀行名
     */
    public String getBackName() {

        return backName;
    }

    /**
     * 銀行名を設定
     * 
     * @return 銀行名
     */
    public void setBackName(String backName) {

        this.backName = backName;
    }

    /**
     * ユーザIDを返す
     * 
     * @return ユーザID
     */
    public String getUserID() {

        return userID;
    }

    /**
     * ユーザIDを設定
     * 
     * @param userID ユーザID
     */
    public void setUserID(String userID) {

        this.userID = userID;
    }
}
  

4-3-2.インポート

 インポートは、他のパッケージのクラスを利用するために「import パッケージ名.クラス名」で指定することにより、「パッケージ名.クラス名」を指定することなくクラスを識別してくれますが、同じクラス名が存在する場合には、導入していないクラスはパッケージからのフル指定で行わないといけません(プログラム規則)。

4-3-3.インタフェースの実装

 クラスでインタフェースを実装するには、「implements」を指定し実装したいインタフェース名を「,」で区切り指定します。
インタフェースを実装するとインタフェースで定義したメソッドを必ず実装(処理を記述)する必要がある為、同じインタフェースを実装したクラスはメソッドの定義を共通化できます。

4-3-4.メソッドの実装

 「this」はクラスを定義した要素を指定する事により引数からの変数名と区別しています。
「return」に戻り値の返す値を指定します。

4-4.サンプルの作成

4-4-1.サンプルソース

Sample4_1.java
package jp.co.ncad.gw.erd.sample;

import jp.co.ncad.gw.erd.model.AccountManagementModel;
import jp.co.ncad.gw.erd.model.AccountModel;
import jp.co.ncad.gw.erd.model.AccountTypeModel;
import jp.co.ncad.gw.erd.model.JavaBankModel;
import jp.co.ncad.gw.erd.model.UserModel;

public class Sample4_1 {

    // ここからスタート
    public static void main(String[] args) {

        // Java銀行を作成
        JavaBankModel javaBank = new JavaBankModel();

        // ユーザを作成
        UserModel user = new UserModel();
        user.setUserID("java");
        user.setName("ジャバ太郎");
        user.setPassword("obj");
        user.setBirth("1980/1/1");

        // 口座の種類を作成
        AccountTypeModel accountType = new AccountTypeModel();
        accountType.setAccountTypeNumber(1);
        accountType.setAccountTypeName("普通");

        // 口座を作成
        AccountModel account = new AccountModel();
        account.setAccountNumber(1);
        account.addSaving(1000);
        account.setAccountTypeNumber(1);

        // 口座管理を作成
        AccountManagementModel accountMgt = new AccountManagementModel();
        accountMgt.setBackName(javaBank.getBackName());
        accountMgt.setAccountNumber(account.getAccountNumber());
        accountMgt.setUserID(user.getUserID());

        System.out.println("ジャバ太郎の銀行情報");
        System.out.println("銀行名:" + javaBank.getBackName());
        System.out.println("銀行住所:" + javaBank.getAddress());
        System.out.println("ユーザID:" + user.getUserID());
        System.out.println("ユーザ名:" + user.getName());
        System.out.println("パスワード:" + user.getPassword());
        System.out.println("生年月日:" + user.getBirth());
        System.out.println("口座番号:" + accountType.getAccountTypeName());
        System.out.println("預金金額:" + account.getSaving());
        System.out.println("口座種類名:" + accountType.getAccountTypeName());
    }
}
  
 
4-4-2.サンプルプログラムの実行
 パッケージを導入した場合は、今までの実行方法とは異なりますので説明通りに進めましょう。
・ディレクトリ構成を知る
現在「D:\GW_Java」の場合は以下のようにフォルダを配置する必要があるので確かめてみましょう。
\---jp
    \---co
        \---ncad
            \---gw
                \---erd
                    +---common
                    |       AccountCommon.java
                    |       AccountTypeCommon.java
                    |       BankCommon.java
                    |       UserCommon.java
                    |
                    +---model
                    |       AccountManagementModel.java
                    |       AccountModel.java
                    |       AccountTypeModel.java
                    |       JavaBankModel.java
                    |       UserModel.java
                    |
                    \---sample
                            Sample4_1.java
「コマンド プロンプト」の画面では以下のように指定します。

D:\GW_Java>javac jp\co\ncad\gw\erd\sample\Sample4_1.java
入力し終えたら「Enter」キーを押下する事によりコンパイルが始まりエラーが出力されなければ成功です。
それでは、実行をしてみましょう。
 
D:\GW_Java>java jp.co.ncad.gw.erd.sample.Sample4_1
ジャバ太郎の銀行情報
銀行名:ジャバ銀行
銀行住所:東京
ユーザID:java
ユーザ名:ジャバ太郎
パスワード:obj
生年月日:1980/1/1
口座番号:普通
預金金額:1000
口座種類名:普通

パッケージを導入すると実行するのに面倒ですが、大規模なプロジェクトではソースが
管理されパッケージを導入しない場合と比べて生産性が向上します。

4-4-3.サンプルソース何か変?

 サンプルソースは今回内容を確認する為に作成したもので実を言うとおかしいプログラムなのです。
どこがおかしいかと言うと画面に出力する時に、情報がリンクしていなくただ作成したオブジェクトをうまいように(サンプルではジャバ太郎の銀行情報)プログラム上で加工して出力しているだけです。
「口座管理」を無視して情報が管理できていません。

 次回は、ロジッククラスというクラスを作成しモデルクラスを有効に活用するプログラムを作成するので、お楽しみに!!

参考引用したWeb
さて、3回目ではJavaから少し離れた話題も取り入れつつ実際に役立つプログラミングを学びましょう。

 この企画の受講状況を各自で管理してもらおうと思い、管理表をGW_firstJava.xlsからダウンロードできますので、使ってもらえると各自の進行具合が分かります。学び終えた場所の「日付」に「Ctrl+;」を「時刻」に「Ctrl+:」を押せば終了した日付と時刻を記憶できます。PDF版も用意してありGW_firstJava.pdfからダウンロードできます。なお、ファイルはウィルスバスターでウィルスチェックしています。

3-1.ERDで学ぶDB設計
●3-1-1.ERDとは何か
 2回目では、社員を説明する文章から社員クラスを作成しましたが、もっと複雑な関係が出てくる文章から直接クラスに書き直すのは大変になってきます。
そこで利用するのが「ERD」(Entity-relationship Diagram)又は「ER図」とも表現しますがどちらも同じです。
「ERD」は、実体関連図と訳されデータベース設計時に利用される事が多く、オブジェクトやクラス間の関連を把握するのに便利です。
その為に何段階かの手順が必要ですが、難しく考える事はありません。
手順を列挙してみると、
1.文章の把握
2.文章から情報を抽出
3.第一正規化
4.第二正規化
5.第三正規化
6.ERD
の順になります。

●3-1-2.文章の把握
 はじめに、何と言っても文章を知らない事には始まりません。
以下は今回作業を進める為の文章です。
ジャバ銀行という銀行がありユーザは登録する事によりユーザIDごとに口座を作ることが出来ます。
銀行にユーザが登録できる数は制限がありませんが、ユーザIDは他と重複する事ができません。
ユーザは、ユーザID・名前・パスワード・生年月日の要素を持っています。
口座は、口座番号・預金金額の要素を持っています。
ユーザは、指定した口座番号、ユーザID及びパスワードを入力し一致したら預金の表示、
積み立て又は積み下ろしが出来ます。

文章を把握しないといけませんが、ただ読むだけではなく自分自身で言葉を変えたり整理してみるのも理解する近道です。

●3-1-3.文章から情報を抽出
 文章から情報を抽出すると以下の図が導き出されます。
次からは、第一正規形、第二正規形、第三正規形の順で進めていくのですが、次の図は、非正規形とも言います。


非正規化.png

背景が黄色で塗られている箇所がありますが、これは「主キー」といい主キーを指定すれば集合の要素から一意な要素を識別出来ます
図の「主キー」を1つでも指定しないと一意な要素を導き出来ません。

●3-1-4.第一正規形
 第一正規形は、非正規形から繰り返しグループを取り除く事により正規化します。
次の図が第一正規形です。

第一正規化.png

ジャバ銀行と口座管理の2つに分けて、口座管理は、銀行名、ユーザID及び口座番号を主キーに設定する事により繰り返し項目を排除しています。

●3-1-5.第二正規形
 第二正規形は、複合主キーの1つのキーから導き出せる属性を取り除いた状態を指します。
次の図が第二正規形です。

第二正規化.png

 「ジャバ銀行」、「口座管理」、「ユーザ」及び「口座」の4つに分けて、口座管理からユーザ及び口座を特定できるようにしています。
第二正規形まで行うと重複部分が大分少なくなってきています。

●3-1-6.第三正規形
 第三正規化は、主キー以外の項目から導き出せる属性を取り除いた状態を指します。
次の図が第三正規形です。

第三正規化.png

 口座種類を別のテーブルに移す事により重複部分をより少なくしています。
口座テーブルの口座種類番号は、主キーである必要は無く口座番号で識別できる為です。

●3-1-7.ERD
 ERDは、正規化されたテーブル同士を関連付けを図で示します。
以下の図がERDです。

ERD.png

 テーブルの主キーを参照する側の主キーに矢印を向けています。
ERDを見る事により、テーブルがどこから参照しているかが分かり文章で説明するよりも関係がはっきりしている事が分かると思います。

さて、次回は、「ERD」からプログラミング(Java)がどう関係するのかを中心に説明したいと思っています。
お楽しみに!!

参考Web
ERD 「実体関連図」
30分間データモデリング ~ER図を描こう!

GW企画の2回目は、クラスの作成を通してJavaを学びます。

 この企画の受講状況を各自で管理してもらおうと思い、管理表をGW_firstJava.xlsからダウンロードできますので、使ってもらえると各自の進行具合が分かります。学び終えた場所の「日付」に「Ctrl+;」を「時刻」に「Ctrl+:」を押せば終了した日付と時刻を記憶できます。PDF版も用意してありGW_firstJava.pdfからダウンロードできます。なお、ファイルはウィルスバスターでウィルスチェックしています。

2-1.オブジェクト指向って何?

 Javaという言語の特徴で忘れてはいけないのが、オブジェクト指向です。
オブジェクト指向という言葉が初めて出てきましたが、説明すると「オブジェクト同士のやり取りにメッセージを使い情報を処理する」事を言います。
オブジェクトは、目的、対象、目的語又は物と訳します。
先程の説明を柔らかく表現すると「物(例えば、社員)同士のやり取りにメッセージを使って情報を伝達する」とも言えます。

2-2.クラスを学ぼう

 文章だけで理解するのは大変ですね(私の場合はオブジェクト指向の専門本を数冊読みました)。
説明するのも大変ですから、具体的な例題を出し実際にオブジェクトを作成してみましょう。
次の文章からクラス(後で説明しますから心配しないで)を作成します。

社員は、氏名、所属名、住所、電話番号、生年月日及び入社日の要素を持ちます。

文章を眺めると「社員」が主語ですよね。「社員」自体はオブジェクトに該当します。
社員と言うオブジェクトが6つの要素から出来ている事が分かりますね。
では、「社員」をJavaのクラスで表すとどのようになるかは次を見てください。
// 社員クラス
class Employee {
    String  name;               // 氏名
    String  affiliationName;    // 所属名
    String  address;            // 住所
    String  tel;                // 電話番号
    String  birth;              // 生年月日
    String  joinCompanyDay;     // 入社日
}

 「class」というキーワードが出てきました(1回目にも出てきましたが覚えていますか、忘れていても気にする事はありませんよ)が、オブジェクトは出てきていないじゃないかと思われるかもしれませんね。
でも、オブジェクトとクラスは密接な関係があるのです。

 クラスは、オブジェクト(例えば物)を抽象化して定義した事だと思ってください。
例えば、人間の太郎や次郎をオブジェクトと取られると太郎や次郎を抽象化して人間として定義したのがクラスです。太郎や次郎のどっちかがサルなら人間ではなく動物として抽象化できますね(名前がややこしかったですね)。
先程の文章は、社員と言うオブジェクトを定義していたのでクラスの説明をしていたわけです。
社員のクラスには、定義だけされて中身(例えば、氏名で言えばジャバ太郎のように)が記述されていませんでしたね。

 それでは、「社員クラス」の説明に入ります。
プログラム上で「class」というキーワードを指定して「Employee」のように、クラス名を指定すると、クラスを定義できます。
要素は「String name;」のように定義します。
「String」は文字列を扱う場合に指定し「name」と要素名を記述すれば「name」に名前を代入する事が出来るのです。
「//」には、日本語が記述されていて分かりやすいなと思われたかと思います。
プログラム上の「//」以降は、コメントとして扱われプログラマ(プログラム作成者)にだけ効果がありプログラムには無関係に扱われます。
ちょっとずつでも、社員クラスを理解できましたか。
ここで、「要素の行にある「//」の前に「;」は何を意味しているか」を考える方がいるかもしれません。
私の感覚では「;」を日常的に使っている為、説明するのを忘れてしまいました。
というのも「;」は、日本語で言うと「。」であり英語で言うと「.」に相当するからです。
プログラムを解釈するのは、コンパイラと言うソフトウェアですが適切な箇所に「;」がないとコンパイルエラーというエラーで教えてくれますのでまずは見様見真似で覚えてください。
社員クラス最後の説明は、「{」、「}」の2つですね。
コンパイラ(プログラムを解釈するソフトウェア)にどこまでがクラスの定義か教えてあげないといけませんから「{」で始まり「}」で終わる事を教えてあげれば素直にそれに従います。
「}」には「;」が対応して終わりが分かるからというように覚えておきましょう。

2-3.クラスをインスタンス化って?

 文章だけでは飽きてしまうので、試せるプログラムから勉強しましょう。
次のプログラムを入力してみましょう。
Employee.java
// 社員クラス
public class Employee {

    String  name;               // 氏名
    String  affiliationName;    // 所属名
    String  address;            // 住所
    String  tel;                // 電話番号
}
Sample2_1.java
// GW企画 2回目 サンプル1
public class Sample2_1 {

    // ここからスタート
    public static void main(final String[] args) {

        Employee employee = new Employee(); // クラスをインスタンス化
        employee.name = "ジャバ太郎"; 		// 氏名を設定
        employee.affiliationName = "GW"; 	// 所属名を設定
        employee.address = "sun"; 			// 住所を設定
        employee.tel = "123456789";			// 電話番号を設定

        // 出力
        System.out.println("社員情報");
        System.out.println("氏名:" + employee.name);
        System.out.println("所属名:" + employee.affiliationName);
        System.out.println("住所:" + employee.address);
        System.out.println("電話:" + employee.tel);
    }
}

 入力できたら、「Employee.java」と「Sample2_1.java」を同じフォルダに作成して以下の手順を行ってください(下のコマンド プロンプト実行例も参考にしながら行うと間違いなくできます)。
(1)「スタート」メニューの「すべてのプログラム」から「アクセサリ」の「コマンド プロンプト」をクリックします。
(2)「コマンド プロンプト」をJavaを使っている事が分かるように「tilte Java」とするとタイトルが「Java」に変ります(必須ではありませんが他にもコマンド プロンプトを使っていると最小化しても何に使っているか直ぐに分かりますから便利です)。
(3)2つのファイルを作成した場所に移動するように設定します。
例、現在「C」ドライブで「D:\GW_Java\2」にファイルがある場合です。
(4)移動できたら「javac Sample2_1.java」を入力し「Enter」キーを押すとコンパイラ(プログラムを翻訳するソフトウェア)がコンパイル(翻訳)すると新に2つのファイル「Employee.class」と「Sample2_1.class」が作成されます。
(5)「java Sample2_1」で今回作成されたプログラムが実行されます。
C:\>title Java

C:\>D:

D:\>cd GW_Java\2

D:\GW_Java\2>javac Sample2_1.java

D:\GW_Java\2>java Sample2_1
社員情報
氏名:ジャバ太郎
所属名:GW
住所:sun
電話:123456789

D:\GW_Java\2>


 正しく出力されましたか。この手順はJavaを扱う基本操作なので覚えておいて損はありません。

「Sample2_1」クラスの説明をします。
「 // ここからスタート」というコメントの下に、「public static void main(final String[] args)」が記述されていますよね。
ここから見ていくと、注目すべき場所は「main」というメソッドです。
メソッドとは、クラスの手続きを表したものでオブジェクト指向で言う「メッセージ」に当たります。
「Sample2_1」クラスの手続きである「main」からスタートして処理を実行します。

Employee employee = new Employee(); 	// クラスをインスタンス化
employee.name = "ジャバ太郎"; 		// 氏名を設定
employee.affiliationName = "GW"; 	// 所属名を設定
employee.address = "sun"; 		// 住所を設定
employee.tel = "123456789"; 		// 電話番号を設定

を見ると「クラスをインスタンス化」と書いてありますが、インスタンスとは「実体」と訳され「クラスを実体化しろ」という処理をしています。
実体とは「オブジェクト」の事です。
オブジェクトに、氏名、所属名、住所及び電話番号を設定するには、「employee.name」のように書き、社員の氏名を指して「=」で右側の「"ジャバ太郎"」が代入されます。
「"ジャバ太郎"」のように文字列を表すには、「""」で囲みます。

 設定が済みましたので画面に出力してみましょう。
文字列を出力するには、「System.out.println()」を使います。
これは、「システムを使い出力する内容は()の中身を(1)行で書き出せ」と言う意味です。
「println」は、print lineの略でプリント行と訳し、文字列を出力後には改行せよという処理です。
Javaには、「System.out.print()」も用意されており、lineが無いので行ではなく「()」の中身が表示され改行されない事に注意しましょう。
後は、「"氏名:" + employee.name」のように、「"氏名:"」に「employee.name」の中身が合わさり画面に出力されます。

 今回は、どうでしたか?大変でしたか?
プログラミング入門者向けに書いていますが、実を言うと全7回でJavaの全部を説明するのは紙面上の理由からできていません。その為に凄い速さで解説してます。
今回分からない事があっても気にすることなく一通り残り5回を学びましょう。
例えば、「オブジェクト指向」を知っただけでも進歩ではないですか。
この2回だけの説明でも他の知らない人に比べて優位に立っていると自信を持ってください。
それに無料ですしね。

さて、次回は、「ERD」というデータベースに欠かせない手法を説明します。プログラミングと関係が無いと思うかもしれませんが、Javaを扱うにはERDも立派な勉強範囲です。
お楽しみに!!

 分からない点がありましたら、コメントを気軽にして下さい。
又、プログラマーの先輩方、ここをこうした方がいいよという事がありましたら、お手数ですがコメントをしていただくとありがたいです。


参考引用したWeb
KMG プロ3ゼミ Java入門講座 単位6
KMG プロ3ゼミ Java入門講座 単位7

参考Web
オブジェクト指向
クラス (コンピュータ)