広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2010年03月24日

    Java総合講座 - 初心者から達人へのパスポート
                  2009年11月開講コース 019号

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■


-------------------------------------------------------
・現在、このメールマガジンは以下の2部構成になっています。
[1] 当初からのコース:毎週日曜の夜に発行
   これは現在、中級レベルになっています。
[2] 2009年11月開講コース:毎週水曜の夜に発行
   これは現在、初心者向けのレベルになっています。
・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
(2009年11月開講コース)019号
 当記事はvol.019のリバイバル(revival)版です。
 vol.019の内容を最新のEclipse、Javaに基づいて書き直しています。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


========================================================
◆ 01.データベース
========================================================

今回からデータベースのお話をしていきます。データベースに
関する知識は、Javaの技術者には不可欠のものです。
というより、ほぼすべてのIT技術者に不可欠のものと言っていい
でしょう。


データベース(database)は、もともとデータ(data)の基地(base)
という意味合いから付けられた名称で、データを保管し管理する
ための基地のようなイメージから来ています。

簡単に言うとデータベースとはデータの集合体なのですが、でも、
たんにデータが集まったものは何でもデータベースと呼べるのでは
なく、特に、データベース管理システム(Database Managemanagement
 System、略してDBMS)と呼ばれるソフトウエアによって管理される
ものをデータベースと呼びます。


データベース管理システムは、データを集中的に管理するためのソ
フトウエアで、データ処理の仕事を一手に引き受けるべく、必要な
機能を一通り提供します。しかも、データに対する処理を効率よく
行い、アプリケーション開発者の生産性を向上する役割を果たしま
す。
たとえば、データの読み書きを高速で行うことはもちろん、重複し
た無駄なデータを書き込まないように制御したり、同時に複数のア
プリケーションからのデータ処理の要求を効率よく交通整理したり、
あるいは互いに関係し合ったデータが矛盾なく更新できるように首尾
一貫性を制御したり、あるいは何らかの障害が発生してデータがおか
しくなってしまったときに以前の状態に復元したり、といったさまざ
まな管理機能を提供してくれます。
また、既存のアプリケーションに変更を加えずにデータ構造を拡張し
たり、保守を行うことを可能にしたりして、アプリケーションとデー
タの独立性を高めてくれます。

何せ、現在のデータベースでは何百テラバイト(TB)もの多量のデータ
も扱う(テラバイト(TB)はギガバイト(GB)の約千倍のデータ量)ので
すから、かなりの高速でデータ処理ができることがわかると思います。


このデータベース管理システムには過去に様々な種類のものが作られ
てきましたが、現在ではリレーショナル・データベース管理システム
(Relational Database Managemant System、略してRDBMS)というの
が、主流になっています。
(さらに新しいものとしてはオブジェクト指向に基づいたDBMSもあり
ますが、今のところ必ずしも使い勝手のいいものではなく、まだあま
り普及していません。)

また、RDBMSによって管理されるデータベースをリレーショナル・デー
タベース(Relational Database)と呼びます。


というわけで、リレーショナル・データベースについて説明していき
ましょう。

なお、まともに説明していくと一冊の分厚い本が書けてしまうほどの
量になってしまいますので、今回はごく基本的なお話だけにします。



リレーショナル・データベースは、以下のようなものです。

・データを表の形式で保存します。

表計算ソフトの表のイメージを思い浮かべていただければ結構です。
例えば、図書情報を保管するデータベースの場合は、表の一行一行に
それぞれ別個の図書のデータを保管します。
そして、各列にそれぞれの図書が持つ属性のデータを入れていくこと
になります。

例えば、書名、著者名、出版社名といった属性のデータを各列に入れて
いくことになります。

・複数の表を互いに関係付けることができます。

たとえば、出版社情報に関する表があって、その表の中には各出版社の
住所や電話番号などのデータを入れる列があったとします。
すると、図書情報の表と出版社情報の表を関係付けることができます。

具体的には、たとえば図書情報の表の中から特定の図書の行を選択した
ところ、その行の中の出版社の列のデータがA出版社という名前だったと
すると、それが出版社情報の表の中のA出版社の行に紐付けされており、
A出版社の住所や電話番号などが連動して取り出せる、といったふうに
なります。

・RDBMSにはSQL(Structured Query Language)という国際的に標準化さ
れた言語でデータ処理を要求することができます。

SQLは国際的に標準化されていますので、どのメーカーが作ったRDBMSで
も(そのメーカーが標準に従っている限り)同じ要求の仕方で同じ処理
をしてもらえます。
したがって、何らかの理由でRDBMSを別のメーカーのものに入れ替えた
としてもアプリケーションを書き換える必要がありません。

(今回は筆者多忙のため、この程度で終わりにします。)

次号に続く。



========================================================
◆ 02.文法解説 [プリミティブ型以外の型]
========================================================

Javaではプリミティブ型(基本データ型)の他に、クラス型、配列型、
インターフェース型と呼ばれる型があります。

クラス型、配列型、インターフェース型を総称して参照型と呼びます。

参照型の変数はオブジェクトを代入して使用します。
(JavaはC++と違い、配列もオブジェクトです。)
といっても、参照型の変数はオブジェクトを直接保管するわけではあり
ません。
(一方、プリミティブ型の変数はデータを直接保管します。)

以前、「参照型の変数の記憶域にはアドレス(オブジェクトの記憶場所
を示す住所あるいは番地のようなもの)がはいっている」というような
説明をしました。これは、Javaの用語集(glossary)
http://java.sun.com/docs/glossary.html
で「参照型の変数の値はアドレスである」旨が記載されていることに
従ってわかりやすく簡単に話を済ませたものです。
このように説明すると簡単でわかりやすいとは思いますが、しかし誤解
を招く恐れがありますので、ここでもう少し詳しく説明しておきましょう。

ここでいうアドレスは、メモリー上のオブジェクトの保管場所の実アド
レスを意味するわけではなく、オブジェクトの保管場所を指し示す情報
という程度の意味に過ぎません。
一種のポインターという言い方もできますが、CやC++のポインターとは
異なり、実アドレスを保持するというわけではありません。(ここでいう
ポインター(pointer)とは、対象物を指し示す物という意味です。)

では、この変数には具体的にどんな情報がはいっているのかというと、実
はそれはJVM(Java Virtual Machine)の仕様では規定されておらず、JVM
の実装に任されています。つまり、JVMの実装によって異なるのです。
そして、JVMの実装を具体的にプログラマーが知る必要はありません。
(JVM(Java Virtual Machine)の仕様を知りたい人は
http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html
などを参照のこと。)

ちなみに、あるJVMの実装では、オブジェクトのメソッドへのポインターが表
の形式で保管されており(通常、オブジェクトのフィールドのデータとメソッ
ドは別々の場所に保管されている)、その表へのポインターや型へのポインター
やデータへのポインターなど複数のポインターを収容するハンドル(取っ手)
のようなものが別の場所に保管されており、参照はそのハンドルへのポインター
となっています。(参照型の変数のことをたんに参照と呼ぶことがあります。)

また、参照型の変数が空っぽであること、すなわち、値がnullであることをメモ
リー上でどのように表現するかについてもJVMの実装にまかされています。
(C++と違って、記憶域が0で埋められているわけではありません。)

このように参照型の変数からオブジェクトにアクセスするためのJVM上の仕組み
は一般に複雑であり、かつ、その仕組みを知る必要もありません。

ちなみに「Javaは主にC++をまねして作られたけれど、CやC++のポインターは
廃止した」という言い方がされることがありますが、ここでいうポインター
は実アドレスを保持する変数を意味しており、そういう意味ではJavaは確かに
ポインターを廃止しています。

ここでいう「ポインターは廃止した」というのは、CやC++のようにプログラム
の中で変数(ポインター)にアドレスを代入したり、アドレスに対して加算・
減算などの演算をしたりというような、メモリー上のアドレスの値に対する操作
が行えないことを意味します。
CやC++では、こういった記憶域の管理をプログラマーが行わなければならず、
それが不具合の温床になっていました。
Javaでは、プログラマーはアドレスに対する操作を行えないようになっており、
記憶域の管理はすべてJVMがやってくれるようになっているのです。
それによって、プログラムの不具合発生率が大幅に軽減されることになりまし
た。

しかしながら、Javaでもポインター(pointer)という言葉自体はときどき
使われています。

たとえば、参照型の変数がnullのときに、その変数にオブジェクトが代入済みで
あると勘違いして何らかの操作を行おうとした場合(たとえばそのオブジェクト
のメソッドを実行させようしたとき)、変数が空っぽであるために(メソッドの
実行はできませんから)Exceptionを発生しますが、そのときのExceptionは
NullPointerExceptionという名前になっています。



次回は配列型について文法解説します。



======================================================
◆ 03.前回の演習問題の答
======================================================

108行目の
out.close();
や133行目と147行目の
out.close();
を見ると、開いたファイルはデータの読み取りや書き込みが終わったら即座に
クローズしていることがわかりますね。

したがって、116行目の
out.close();
は、この時点ではオープンしているファイルがないため無意味な処理になります。
そもそもここではクローズ操作ができないことになりますので、例外(Exception)が
発生してしまいます。

(「ファイルを開く」の操作でファイルをオープンしたままにしておいた場合は、
「ファイルを閉じる」の操作やウインドウを閉じるときにファイルをクローズする
必要がありますが、その場合は、現在ファイルをオープンしたままなのか、あるいは
クローズした状態なのかという状態を記憶しておく必要があります。
こういった「状態管理」については、また後に説明します。)

このクローズ操作の代わりに、「ファイル」メニューの「ファイルを閉じる」メニ
ュー項目を選択したらHumanInfoWindowのテキスト・フィールドの中のデータがすべ
て空にされるようにするには、たとえば114行目〜120行目を次のように書き換えると
いいです。
-------------------------------------------------------
else if ("ファイルを閉じる".equals(menuItem.getLabel())) { // 060910
   window.getTextFieldName().setText("");
   window.nengoChoice.select("");
   window.getTextFieldYear().setText("");
   window.getTextFieldMonth().setText("");
   window.getTextFieldDay().setText("");
   window.labelResponse.setText("");
} // 060910
-------------------------------------------------------

上記の""は空(から)文字を意味します。
つまりsetText("")はテキスト・フィールドに空文字をセットしているわけですから、
テキスト・フィールドの中が空になります。

試してみてください。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2010 Future Lifestyle Inc. 不許無断複製