« 2009年1月27日 |Top

最新記事【2009年1月28日】

Apache Tomcat (アパッチ トムキャット)は、サーブレットやJSPを実行するためのサーブレットコンテナであり、HTTPサーバを内部に含んでいるソフトウェアで、Apache Software Foundation (ASF)でOSS (Open Source Software)で開発されています。なお、フリーソフトウェアではありますが、使用許諾条件(オープンソースライセンス)はApache software licenseに従うので注意が企業レベルで開発を行う場合は注意が必要です。


サーブレットコンテナには有償のものからTomcatのようにオープンソースなものまでたくさんありますが、Tomcatの特長としては、フリーソフトウェアであるため、Web コンテナとしては最も広く普及しており、最新のJSP仕様をサポートし、安定性も高いということがあげられます。そのため、「インターネット上や書店などでTomcatに関する豊富な情報を得られる」「Tomcatの経験を持つJavaエンジニアが多い」という利点が得られるのです。


もちろん、基幹業務向けの大規模なWebアプリケーションでは、高度な信頼性とスケーラビリティ、そしてベンダー・サポートが要求されるため、商用製品のWebコンテナ(アプリケーション・サーバ)を利用するケースが一般的です。とはいえども、Tomcatもプロダクション利用に十分な安定性とパフォーマンスを実現しており、小規模~中規模のWebアプリケーション開発における業界標準ツールとして定着しています。また、Tomcatは単独でWebサーバとして動作することも可能ですが、ApacheやIISのプラグインと動作できるようになっており、実際にはプラグインとしての利用が主流です。

サーブレットの実行環境(実行するためのソフトウェア)はWebコンテナ、またはサーブレットコンテナと呼ばれ、これらの言葉はあまり区別されずに使われることも多いですが、純粋にサーブレットの処理を行うものをサーブレットコンテナと呼び、サーブレットコンテナを含みJSPやHTTPサーバとしての機能も含むものをWebコンテナと呼ぶ傾向があります。


Webコンテナとしては、Apache Tomcat, Jetty, BEA WebLogic Server, IBM WebSphere Application Server, Resin, JBossなどがあり、Javaでは特にApache Tomcatが有名です。Java Platform, Enterprise Edition(Java EE)では、Webコンテナは 「Java EEアーキテクチャのWebコンポーネント規約を実装」しており、この規約はコンピュータセキュリティ、並列性、ライフサイクル管理、セッション管理、デプロイやその他のサービスを含むWebコンポーネントの実行環境を規定います。


ライフサイクル管理とは、一度ロードされるとメモリ上に残って、2回目以降の処理が速くなり、ローディングに際し最初に一度だけ実施する処理や、メモリから削除される直前に実施する処理などが定義できることを示します。CGIでは前述のとおり、要求があるたびに毎回ロードされます。セッション管理とは同一のクライアントとの一連の処理の間、データを保持しておく仕組みで、CGIではアプリケーションプログラムが自分で保持しなければならないため、プログラムが煩雑になります。

JavaServer Pages ( JSP ) は、HTML内にJavaのコードを埋め込んでおき、Webサーバで動的にウェブページを生成してクライアントに返す技術のことを指します。サーブレットと違い、HTMLの中でデザイン部分とプログラム部分を分けて書くことができるため、ある程度までウェブデザイナの負担を減らすこともできる。類似技術としてPHP、ASP、ASP、.NETなどがあります。


サーブレットの技術の延長としてJSPがあり、JSPはサーブレットを自動生成して動作しているため、厳密に言えばサーブレットとJSPは違う技術なのですが、これらは組み合わせて使うのが一般的なため、JSPもサーブレットの一部として扱われることが多いです。クライアントからのJSPの実行がリクエストされると、アプリケーションサーバのサーブレットコンテナはJSPのソースファイルをサーブレットのソースコードに変換し、そしてさらに、そのソースコードをその場でコンパイルして実行し、結果をクライアントに返信します。


このため、最初はコンパイルの時間がかかるが、いちどコンパイルが実行されると2回目以降は必要なくなるため、結果としてアクセス速度が早くなります。また、結果は通常のHTML形式になるため、Webブラウザに特殊な機能を組みこむことなくWebアプリケーションを構築でき、開発者にとっても、利用者にとっても、非常に負担が少なくできます。

Java Servlet(ジャバ サーブレット)とは、Javaを用いて、ウェブページのためのHTML文書などを動的に生成するサーバ上で動くプログラム、またはその仕様のことを指します。これはJava EEの一機能という位置づけになっていて、単にサーブレットと呼ばれることが多いです。


似たような技術(すなわち対抗技術)としてはPerlなどを用いたCGIが特に有名で、他に、PHPプログラムのプロセスをApache HTTP Server上で動かすことができるmod_phpなどのモジュール、マイクロソフトが提供するASPなどがあります。


CGIがクライアントのリクエストのたびに新しいプロセスを起動するのに対して、サーブレットはメモリに常駐して、リクエストのたびにプロセスより軽量なスレッドを起動するので、非常に効率がよく、また、サーブレットはJavaで書かれているのでさまざまなプラットフォームで使うことができるというメリットがあります。


またJavaはもともとネットワーク環境との親和性が高く、Webアプリケーションといえば、サーバ・サイドで実行されるJavaアプリケーションのことだといってよい状況にあり、Microsoft.NetやPerl、Pythonなども使われることはありますが、企業の業務開発ではJavaでプログラミングされることがほとんどです。この技術を用いてショッピングサイトやオンラインバンキングなどをはじめとする多種多様な動的なWebサイトが構築されています。

ここでは、「Javaで音楽を扱う方法」を解説します。


Javaで音楽を扱うのは、画像やネットワークを扱うのに比べて少々難しいところがあります。というのも、サンの公式のライブラリである、Java Sound APIに含まれるは音楽に関してはかなり基本的な機能しか実装されていないからです。MIDIや音声の簡単な録音、再生の程度であれば、それで十分まかなえるのですが、音響合成のレベルまで行くと、発振器(オシレーター)の部分から自作しなくてはならず、非常に大変です。


しかし、幸いその辺りを網羅してくれているサードパーティ製のパッケージが2種類出ており、それらを利用することでMIDIシーケンサーやオシレーターから音色をつくれるシンセサイザーの作成が出来るようになります。そのサードパーティ製のパッケージにはjMusic、Jsynthの2つがありますが、jMusicはオープンソースで無料で使用することが出来ますが、開発が2004年でストップしています。そのため、オーディオ関連の最新機能には対応していないのが難点です。


逆に、JSynthはASIO等の最新機能にも対応していますが、個人用途でもJava Appletとして公開する場合は有償となってしまいます。使い分けとしては、より実用的な音響合成を求めるならばJsynで、趣味の範囲の音響合成ならjMusicで、という形が一番無難でしょう。

GUIプログラミング及びネットワークプログラミングを一通り学んだあとは、後はもう個々人が専門としてやりたいことを学習していけばよいでしょう。次に、学習指針として使える、プログラムの分野、ジャンルとそれに関係するパッケージを示していきたいと思います。


さらにここから画像処理、コンピューターグラフィックを扱っていきたいならば、Java 2D、Java3D、JOGL(Java OpenGL)、JAI(Java Advanced Imaging)等を、音楽などを扱いたい場合はJava Sound APIやjMusic、Jsynth等を、もっと実用的なネットワークを扱いたいならば、Peer to Peer(P2P)を扱うJXTAや、分散コンピューティングを扱うJMX(Java Management Extensions)など、データベースならばJDBC、WebアプリケーションならばJava サーブレット、JSP等を勉強すると良いでしょう。


よほど専門的すぎるもので無い限り、以上の技術に関してはそれぞれ対応する専門書籍がいくつか出ているので、それを参考にするとよいと思われます。また、より深く勉強するための情報収集のために、特定のパッケージについてのメーリングリストに加入すると、バグや新仕様に関する、より詳しい情報が得られることでしょうし、あるいは、積極的にセミナーやワークショップ、コンベンションなどに参加すれば より先進的な技術が学べることでしょう。ここより後ろの項目では、以上の項目の中から、幾つか項目をピックアップして、関連技術の紹介をしていきたいとおもいます。

NetBeans(ネットビーンズ)とは、サン・マイクロシステムズを中心としたコミュニティにより開発されているJava用オープンソース統合開発環境(IDE)です。この統合開発環境は、NetBeans Platformを利用して開発されており、様々なモジュールを組み込むことが可能で、NetBeansの特徴の一つであるGUIエディタ(Project Matisse)もその一つです。


統合開発環境自体がJavaで書かれていることから、Java VMを搭載したオペレーティングシステム上で動作が可能です。ほぼ100%Javaで書かれていたため、以前は動作が重いと不評であったが、バージョン4.0以降はJavaVM自体の大幅な高速化もあって、ネイティブな環境との速度差は感じないとされています。


Java統合開発環境として既に広く使われているEclipseと比較されることが多く、現状、シェア、多機能性、プラグインの豊富さは、Eclipseに今のところは座を譲っています。NetBeansは3.51までJava Look&Feelを使用していたため、特にWindowsユーザーに受け入れられにくかったようで、3.6でLook&FeelをSystemLook&Feelに変更したことにより、ユーザーが増加しはじめたようです。


なお、4.0からは、Java SE/EEのリファレンス的な開発環境としての側面が強まっており、。5.5からは、WebサービスやパーシスタンスAPI等に対するスムーズな開発を可能にしており、UMLやJSFのビジュアル開発なども取り込まれました。また、Eclipseと異なり、6.5以降はML(多言語)版が最初から用意されており、日本語化をせずにすむというのがメリットとしてあげられるでしょう。

Eclipse は IBM が開発した 統合開発環境(IDE)。オープンソースに寄贈されて開発が進められています。統合環境にプラグインとしてさまざまな機能を組み込むことができるよう設計されており、その拡張性は非常に高く、Java開発環境自体が標準添付のプラグインとして実装されているほどであり、プラグイン次第でC++やPHP、Perl、C#、D言語、TeX、Python、Ruby、JavaScript、COBOL、AspectJなど多様な言語への対応が可能となっています。


機能としてはデバッグ・ステップ実行、リファクタリング機能、のほか、クラス名・メソッド名・変数名の補完、import文の整理・自動生成などのコード編集支援機能、JUnitやビルドシステムApache Antと連携機能を備えています。またよく使用されるプラグインとして、Tomcat, Java EEなどのウェブ系開発に必要なものが一通りそろっているWTP(Web Tools Platform)プラグイン、UMLのユースケース図, クラス図, シーケンス図, コラボレーション図, 配置図などを編集、およびクラス図などからJavaコードの生成等ができるUMLプラグイン、EclipseでAWT/Swing/SWTのGUI開発ができるVE(Visual Editor)などがあげられる。


数年前までJava 開発プラットフォームとしてはデファクトスタンダードの地位にあり、いまでもシェアはかなり大きいといわれています。IBM の WSAD (WebSphere Studio Application Developer ) とその後継製品である RAD (Rational Application Developer for WebSphere Software) も、Eclipse ベースでワークベンチを追加したものです。

初心者向けのプログラミング学習では、大抵DOSプロンプトなどのコマンドラインでコンパイルを行っていたことでしょうが、プログラミングに慣れてくると、いちいち「javac ~」と打つのが非常に面倒になってきます。そういったコンパイル作業等を自動でやってくれるようになるのが、"統合開発環境"です。


またコンパイル作業だけでなく、プログラムの中で、一時停止して、変数の状態を確認できるようにするデバッグ機能、クラスの名前を変更したとき、プログラム内も自動的に修正してくれるリファクタリング機能などの便利な機能があるため、特にゲーム作成をはじめとする大規模なプログラミングでは必要不可欠といえるでしょう。


Java統合開発環境として有名なものに、IBMによって作られた「Eclipse」、Javaの開発元であるSun Microsystemsによって作られた「Netbeans」があります。数年前まではNetbeansは外観がとっつきづらく、また動作が重い等との理由で、Eclipseのほうがシェアが上でしたが、最近は動作も軽くなったようで、シェアも徐々に拮抗してきているようです。


またNetbeansは標準で日本語に対応しているのに対し、Eclipseはメニュー等を日本語化するのに日本語化パッチを当てるなどの手間掛かるので、それがネックになっているようです。しかし、Eclipseは昔から使われていただけあって、ネット上に日本語のwikiが存在し、こまめに情報が更新されてたり、インストールの手引きなどが載っている等のメリットがあります。

ネットワークプログラミングで最も基本的なものはソケットを使った通信プログラムです。ここではJavaによるソケット通信プログラムの基本的な書き方を紹介します。


ソケットとは、プログラム間でデータのやり取りをする通信路の端にあたるもので、通信路とプログラムをつなぐプラグのような役割をします。TCPをつかって通信するサーバ・クライアントプログラムはお互いの間で接続を確立するわけですが、ソケットとポート番号をあらかじめ結び付けておくことで、プログラムにとってはソケットにデータとホスト名、ポート番号を渡せば、あとは相手側のプログラムにデータが届く仕組みとなっています。


Javaでネットワークでデータ通信を行うプログラムを書く場合、java.netパッケージとしてJavaが提供するSocektクラス、またはServerSocketクラスを利用します。ソケットを通じてデータをやり取りする場合、


1.ソケットを開く(Socketのインスタンスの生成)
2.ソケットへの入出力ストリームを開く
3.プロトコルに応じてデータをストリームに書いたり読んだりする
4.ストリームを閉じる(ストリームのインスタンスメソッドclose())
5.ソケットを閉じる(Socketのインスタンスメソッドclose())


という順番で書くのが基本的な流れとなります。また、ソケットを開く際には、コンストラクタの引数としてホスト(またはIPアドレス)とポート番号を指定する必要があります。またストリームやソケットを閉じる際には必ずストリーム→ソケットの順でクローズを行わなければなりません。

GUIの部品に対するマウスやキーボードからの働きかけをイベントと呼び、イベントに対する応答を記述することをイベント処理といいます。イベントは発生したインスタンスから「イベントリスナー」と呼ばれるオブジェクトに伝えられます。イベントはイベントクラスのオブジェクトであり、イベントの発生位置、発生源やそれに関する情報をもっています。イベントをイベントリスナーに送るには、次の2つのことをする必要があります。


1.イベントリスナークラスを定義し、必要なイベントメソッドを記述する
2.イベント発生源にイベントリスナーオブジェクトを登録する


また、イベントは1つの発生源から複数のリスナーに通知したり、1つのリスナーが複数のソースからイベントを受け取ることができます。具体的な上記の手続きを順に書くと、イベントリスナークラス(例えばEvLisner)にActionListnerインターフェースをインプリメントし、actionPerformed(ActionEvent e)メソッドをオーバーライドし、そこにイベントを受信したときの挙動をif文で分別して記述します。


リスナーインターフェースをインプリメントしたクラスであれば、どのようなクラスであってもリスナーになれるので、イベントに対する振る舞いをコンポーネントとは別のクラスに記述することができます。次に、イベント発生源のインスタンス(例えばJButton b)にリスナーを登録するために、b.addActionListner(listner)というメソッドをコンストラクタに記述し、完了します。

JavaにおけるGUIプログラミングは、実用レベルのプログラムで特にOS固有のデザインを使用したい場合はSWTを用いて開発を行うこともありますが、基本的にはSwingを用いて行います。SwingではJFrameというウィンドウフレームの上にJPanelというパネルをのせ、その上にラベル(JLabel)、ボタン(JButton)などのオブジェクトを乗せてGUIを構成していきます。


JFrameクラスから作成したフレームの上に直接ボタンやラベルを貼り付けることもできますが、フレーム上でボタンやラベルをグループ毎に分けて別々のレイアウトを設定したい場合などにJPanelクラスから作成したパネルをフレームの上に配置し、ボタンなどのコンポーネントはパネルに貼り付けることでパネル毎にレイアウトを設定することができます。具体的な追加方法としては、JPanelを作成した後、例えばJButtonのインスタンスを生成し、JPanelのインスタンスからadd(JButtonのインスタンス)という形でメソッドを呼び出すことで実現できます。


GUIのデザインの概形を構成した後は、それぞれのオブジェクトのインスタンスメソッドset~を用いて詳細な位置の配置や、オブジェクト上に表示するテキストなどの設定を行います。例えばウィンドウのタイトルを変更したい場合、JFrameのインスタンスからにsetTitle(String title)とメソッドを呼び出してやれば、該当するウィンドウのタイトルが変更されます。それぞれのオブジェクトによってどんなset~があるかは異なるのでAPIリファレンスを参照してください。

CUIプログラミングが一通り程度できるようになったら、次はGUIプログラミングか、あるいはネットワークプログラミングに移ることになります。


JavaでネットワークプログラミングやGUIプログラミングを行う場合、CUIプログラミングに比べて、"慣習"というのが非常に多いため、何故こう書かなければならないのか分からない、と、戸惑うことがが多いでしょう。とにかく、多くのサンプルコードに触れて、そのコードを参考に自分でプログラムを書いて、体で覚えるのが一番です。GUIのプログラミングはサンプルコードがJavaの公式サイトにあるので(ただし英語ですが)、それを参考にすると良いでしょう。


また、ネットワークプログラミング、GUIプログラミング共に、ネット上のJava入門サイトでもある程度触れられているので、最初はそちらの解説などを読んでも良いかもしれません。また、ネットワークプログラミング、GUIプログラミングを勉強する段階になってくると、統合開発環境(IDE)を用いてプログラミングを行う事がほぼ必須になってきます。また今後のことを考えても、統合開発環境でのプログラミングに慣れておくこととよいと思います。特にGUIプログラミングの場合、デザインを変更するたびに一々手動でコンパイルをしなおして確認するのは正直大変です。


統合開発環境にはGUIプログラミングをサポートしてくれるプラグイン(例えばNetbeans のProject Matisse、Eclipse の Visual Editorなど)が存在するので、それらを利用するとデザインが非常に容易に出来ることかとおもいます。一応次の項目からJavaにおける両者のプログラミングの基本について述べておきます。

ある程度、Javaの基本的な部分を一通り理解した人は、自分の目的に応じて、Java APIリファレンスを参照すると良いでしょう。Java API リファレンスではパッケージごとに、入っているクラスやインターフェース、クラスやメソッドの書式や効果などが事細かに書いてあります。


Javaの場合、日本語のAPIリファレンスも置いてあるので、英語だと読めない人でも安心です。引数が分からないメソッドがあったり、どのクラスにどのようなメソッドがあるかを確認したい場合、これを参照することで大抵の悩みは解決するでしょう。


また、実用的なアプリケーションを開発する際には、プログラム内で使用するクラスやインターフェース、メソッド等が非推奨APIに入っていないかどうかを確認すべきでしょう。非推奨APIとは、挙動改善などの理由により使用が推奨されないAPIのことで、リファレンスでは通常、代わりのAPIが表示されます。非推奨APIは、以降のバージョンのJavaでは削除される可能性があります。Javaの公式サイトで"Java SE* API仕様"(*にはJava開発環境のバージョンが入る)という名前で公開されています。


Java SE 6 の場合は http://java.sun.com/javase/ja/6/docs/ja/api/ がAPI仕様書のオンラインページになっています。また、オフラインで確認したい場合、JDKのインストール時にダウンロードした「Java SE* ドキュメント」の中にもあるので、そちらを参照すると良いでしょう。また、必要なメソッドを探すのが面倒、Java SE APIが見づらい、サンプルコードが欲しいなどの不満がある方は、逆引きAPIや、APIの解説書が出ているのでそれらを購入すると良いでしょう。

「オーバーロード」と「オーバーライド」は、名前が似ている上に、どちらもメソッドに関する用語なのでよく混同されます。「オーバーロード」は多重定義とも呼ばれ、"戻り値や引数の型が異なる同名のメソッド"をいくつも定義することです。


例えば、hoge(int a)というメソッドが有ったとして、引数としてdouble型もとりたい、という場合に、hoge(double a)を"あたかも別のメソッドのように"、もう一つ定義することのことを指します。あるいは引数を増やしたい場合、hoge(int a, int b)という形で定義する事もできます。オーバーロードの場合、メソッドの機能として基本的な動きは変わらないようにするのが普通です。


それに対して、「オーバーライド」は再定義と呼ばれ、ある親クラスから継承したメソッドを、"今のクラスに合った動きをしてくれるメソッド"に定義を書きかえることを指します。例えば、親のクラスにあるfoo()メソッドの戻り値はint型であるが、今のクラスではString型で戻ってきて欲しいとします。そのとき、今のクラスのほうでfoo()メソッドを戻り値がString型になるように、あたかも"foo()メソッドが今のクラスのメソッドである"ように定義する事で、今のクラスではfoo()の戻り値がString型であるメソッドとして使えるようになるということです。


オーバーライドの場合は、親クラスのメソッドの機能を拡張したりするような形で使うのが普通です。その際、親クラスからメソッドの部分をコピーしてくるのは面倒なので、super()というメソッドを使うことで再定義前の親クラスのメソッドを今のクラスのオーバーライド部分で呼び出すのが普通です。

Javaの勉強で「クラス」と「インスタンス」の違いに最初につまづくひとがいます。よくある説明として、『「クラス」というのは「変数(フィールド)」や「メソッド」をひとまとめにした、設計書のようなもので、「インスタンス」というのは、「クラス」に実際の値などを入れて、実体化したものである。』という事がいわれます。しかし、以上の説明だけだと少々想像しづらい部分もあるので、ここではクラスやインスタンスを擬人化して考えてみましょう。


クラス君は現場監督でその現場には一人しかいません。インスタンス君たちは新人で何も分かりません。ソースファイルにしたがって、現場監督のクラス君は、何も知らないインスタンス君の一人に名前をつけて「覚えて欲しいもの(フィールド)」と「こう言われたら、やって欲しい仕事(メソッド)」「仕事を始める前にまずやって欲しいこと(コンストラクタ:初期化メソッド)」のメモを渡します。これがいわゆるインスタンスの生成です。


インスタンス君たちはそのメモにしたがって、ソースファイル上でメソッドなどを指示されるたびに、それぞれ個別に仕事を行います。クラス君は、監督業務なので、「現場をまとめる為に覚えておくこと(static修飾子つきのフィールド:クラス変数)」や「インスタンス君たちにメモを渡してやらせるまでもない仕事(static修飾子つきのメソッド:クラス・メソッド)」を覚えており、それしか基本的にやりません。

環境変数の設定ですが、これはOSによって異なります。ここではWindowsでの設定方法を書いておきます。Linuxその他のOSでの環境変数の設定は"Java 環境変数 Linux"等で検索すれば出てくることかと思います。


さて、Windowsユーザーの方は、「コントロールパネル」の中にある「システム」をクリックして開き(Vistaの場合はさらに「システムの詳細設定」をクリックしてください)、そして「詳細設定」→「環境変数」の順にクリックしてください。システム環境変数の中で「変数」が「PATH」と書かれたものがあるかどうかを探します。見つかった場合には「PATH」と書かれた箇所を一度クリックして選択してから「編集」ボタンをクリックして下さい。


さらに「システム変数の編集」ダイアログが表示されますので「変数値」の最後に「C:\Program Files\java\jdk1.6.0_03\bin;」を追加して下さい(インストール時の設定にあわせてください。)。もし既存の値の最後がセミコロンで無かった場合はセミコロンを付けてから先ほどの値を入力して下さい。ただし、「PATH」に何か設定されていた場合は、その値を消さずに必ず最後に追加することに注意して下さい。


セミコロンは複数の値を設定する場合の区切り文字として使われています。システム環境変数の中で「変数」が「PATH」と書かれたものが無かった場合には「新規」ボタンをクリックして追加して下さい。コマンドプロンプトから「java」とだけ打ち込んで、ズラズラとコマンドのヘルプが出てくれば設定完了です。

Javaを勉強するときは、大抵の場合は1.CUIプログラミング、2.GUIプログラミング又はネットワークプログラミング、という順番で勉強していきます。この初心者編ではとりあえず1.のCUIプログラミングの勉強方法をお教えします。もしあなたがプログラミングそのものを全くやった経験がない(if文、for文などが理解できていない)、というのであれば、インターネットで"Java 入門"と検索することをオススメします。


ネット上にはJava開発環境のインストールからfor文などの書き方まで丁寧に解説してあるページがいくつもあるので、そちらを教科書がわりにするといいでしょう。インターフェース、入出力、スレッドあたりまで理解すれば、CUIの範囲内では大抵のことができると思います。


また、CやPearl等である程度プログラミングの作法が分かっている人にとっては、Java言語の仕様は、最初は冗長に感じるかもしれません(例:System.out.println())。しかし、「クラス」や「メソッド(Cの関数に相当)」「フィールド(Cの変数に相当)」といった概念を理解すれば、その冗長性のお陰で随分ファイルやクラスの管理がしやすいことに気がつくでしょう。とりあえず他言語既習者の方は、"Java 入門"で検索した後、for文などのプログラミング作法の基礎的な部分を斜め読みして、「クラス」の概念を理解するところから始めると良いでしょう。


初心者の勉強方法はこんなところですが、もし、お金に余裕があって、本でないと嫌だ!、ネットの解説じゃサンプルコードが少なすぎて分からない!という人は、入門者向けのJava解説本がいくつも出ていますので、それらの中で自分に合いそうなものを購入してください。

Java開発環境のインストールの手順は次のとおりです。


1.JDK6のダウンロード
2.JDK6のインストール
3.ドキュメントのダウンロード
4.PATHの設定
5.JAVA_HOMEの設定


上記の順番です。まず、1.JDK6のダウンロードとインストールですが、http://java.sun.com/javase/ja/6/download.html にて、「Java SE Development Kit (JDK) ・・・」というのをクリックすると、ライセンスに同意するかのチェックがでてきます。


そこで「Accept License Agreement 」にチェックをし、プラットフォームを選択してダウンロードを開始します。Windowsユーザーの方は「Windows Platform - Java(TM) SE Development Kit 6 Update 3」の「Windows Offline Installation, Multi-language」をクリックしてダウンロードしてください。保存場所は適当で大丈夫です。


インストールについては、基本的に「同意」「はい」等を選んで行けば普通にインストールされるはずです。インストールする場所は基本的にどこでもいいですが、JREのインストール場所に関してはデフォルトの場所にすることをオススメします。


次に、ドキュメントのダウンロードですが、JDK6をダウンロードしたページと同じページ http://java.sun.com/javase/ja/6/download.html に「Java SE 6 ドキュメント」というのが有るので、同様な方法でダウンロードしてください。


解凍して出来たフォルダをJDKをインストールしたフォルダ(例:C:\Program Files\java\jdk1.6.0_03)の中に入れれば大丈夫です。ただし、これだけではまだプロンプトからJavaを使うことができません。環境変数の設定というのが必要になります。その解説は、当サイトの「Windowsでの環境変数の設定方法」にて続きを詳しく書いておきます。

SWTはよくAWTやSwing等と混同されますが、AWTやSwing等がサン・マイクロシステムズにより提供されているのに対し、SWTはEclipse Foundation が Eclipse IDE と共に提供している"非公式な"Java用GUIツールキットのことです。


AWTはOS固有のラッパーとしては非常に薄く、プラットフォーム固有のコードが開発者に透けて見え、バグやOS固有の癖がそのままさらけ出されているため、異なるプラットフォーム間で移植性のあるアプリケーションを作成するには限界があり、かといって、SwingはGUI部品を自前で描画するため、Windows風やMac OS風の見た目にする事は出来ても、操作感は大分異なる(例えばMac OS Xのアニメーション等)という問題がありました。


そこで、AWTより高性能で、かつSwingよりもよりプラットフォーム固有のデザインに近いものを提供する為、SWTが開発されました。SWTは「高性能」GUIツールキットとして、Swingよりもシステムリソースを浪費しないよう設計されており、SWTとSwingのベンチマーク比較ではSWTがSwingより効率がよいことが示されているようです。


デザイン的な面、速度的な面でSWTを使ったアプリケーションは使用者にとって非常にストレスの少ない操作感を実現でき、そのためか、Eclipse IDEをはじめ、BittorrentクライアントであるVuze(旧 Azureus)、科学計算ソフトGumTree Platformなど、様々なアプリケーションに使用されており、現在ではSwingとSWTとの統合しようとする活動も存在します。

Swingは、プログラミング言語Javaのグラフィカルユーザーインターフェース (GUI) を構築するためのツールキットで、同じくJavaのGUIツールキットであるAWTを拡張したもののことを指します。Javaの思想はCPUやプラットフォームに依存しない「どこでも動くプログラム」をであり、AWT もこれを守っていましたが、AWTはそれぞれOS固有の描画機能に依存したため、動作が同じでも、見た目が環境によって異なっていました。


AWTはOSのウィンドウシステムに準じたOS固有のデザインになるのに対し、一方、Swingで作成したGUIはJavaプログラム上で描画されるので、どのOSで実行してもデザインが変わらないという、より柔軟なデザインが可能となります。また、Javaプログラムのみで描画されるために、動作が非常に軽いので、AWTに対しSwingのようなコンポーネントを軽量コンポーネント (Light Weight Component) と呼びます。


Swing の最大の特長は「Look&Feel」です。これは、簡単に言うならばウィンドウやボタンなどの見た目と操作感のことで、SwingではPluggable Look&Feel(プラグイン可能なLook&Feel)機能によって見た目や操作感を自由に変更することができます。例えば、プログラムのGUIの見た目をクリック一つでWindows風やMac OS風、もちろんSwing固有のデザインに切り替えることが出来るようになるわけです。またAWTには無かった、スライダーやスピナ、ツリー表示をするコンポーネントなど高度なコンポーネントが用意されているため、これらを用いることでさらに豊かなプログラミングが可能となりました。

Abstract Window Toolkit (AWT)とはJava独自のプラットフォーム非依存のウィンドウシステム、グラフィックス、ユーザインタフェース(UI)、ウィジェット・ツールキット、等の総称で、具体的にはウィンドウやテキストボックス、ボタン等といった部品とその関連技術のことを指します。


AWTは現在はJava Foundation Classes (JFC)に含まれ、Javaプログラム用グラフィカルユーザインタフェース(GUI)を提供する標準APIの一部となっています。AWTを使って書かれたGUIプログラムはWindows上で動くネイティブなMicrosoft Windowsアプリケーションにそっくりになり、Macなどの他のOSではネイティブな Apple Macintoshのようにそっくりになります。


しかし、アプリケーション開発者の中には、全てのプラットフォーム上で開発したアプリケーションが厳密に同じものであることを好んで、このモデルを嫌う人も居たようです。そのため、J2SE 1.2から、大部分のAWTの部品は後述のSwingツールキットの部品に取って代わりました。


しかし、AWTの技術はGUIイベントサブシステム(ボタンのクリックなどを認識するシステム)とOS固有のウィンドウシステムと、Swingが頼る構造的な土台を提供するJavaアプリケーションとの間のインターフェースの中核として使われており、そのおかげで、サポートしているシステム上でシステムトレイ(タスクトレイ)にアクセスできるだけでなく、クリップボードやウィンドウへのドラッグアンドドロップ、マウスやキーボードのような入力デバイスを使用可能にしています。

サン・マイクロシステムズとJCPは、さまざまな環境に対応するため、Java SE、Java EE、Java MEという3つのJavaプラットフォームのエディションを規定しています。Javaはエディションごとに実行環境と開発環境があり、JavaのAPIの多くは分類され各エディションに割り当てられています。JDK 1.1 のバージョンまでは、Java SE に相当するエディションのみが提供されており、3つのエディションが規定されたのは、JDK 1.1 の次のバージョンからです。


Java SE(Java Platform, Standard Edition)は、ワークステーション、パーソナルコンピュータやサーバなどの機器で、汎用的な用途に使われ、それに対し、Java EE(Java Platform, Enterprise Edition)は、Java SE に加え、多層クライアントサーバの大規模システムを開発するための、さまざまな API が追加されています。


また、Java ME(Java Platform, Micro Edition)は、逆にコンピュータ資源が限られている、組み込みシステムなどを用途として想定したエディションで、携帯電話や自動販売機などの機器の種類に応じた、ライブラリのいくつかの異なるプロファイルを規定しています。Java MEは完全な Java SE のライブラリを使うには、このエディションで対象とする用途では記憶装置の容量が足りないため、Java SE のいくつかのAPIは省略していますが、このエディションで対象とする用途には十分な機能をもっています。Java API に含まれるクラスは、パッケージと呼ばれるグループに分類され、各パッケージは、相互に関連するインタフェース、クラス、例外を含んでいます。

名前空間はNamespaceの訳語で、名前の集合を分割することで衝突の可能性を低減しつつ参照を容易にする概念のことを指します。普通、一つのプログラムにおいては関数、メソッドや変数などの名前が被らないようにしなければなりません。例えばhogeという名前のクラスがいくつもあった場合にhogeとソースコードに書かれていると、コンピューターから見たらどのhogeクラスを指しているのかが分からなくなる為です。


これを回避する為に、古い言語の場合だとA_hoge、B_hogeなどと名前を書き分ける必要があり、非常に煩雑なソースコードになりがちでした。しかし、Javaは、パッケージという名前空間の機構をもつ言語であるため、ライブラリやアプリケーションソフトウェアに含まれるたくさんのクラスやインタフェースを、コンピューターのディレクトリのように、階層構造に分類したり整理したりすることができます。


これにより、コンピューターは「どこどこのパッケージにあるhogeクラス」というように判別できるため、それぞれのhogeクラスの判別がつくようになります。ちょうど郵便における「何県何市何町何丁目にすむ山田太郎さん」というような判別方法ですね。


このように、Javaは名前空間の機構をもたない言語と比べて、多数のクラスとインタフェースの管理が簡単にできるようになり、クラスとインタフェースの命名についても、既存のクラス/インタフェースとの名前の衝突回避を考える労力が、非常に少なくてすむのです。

Javaでは初期のバージョンから遠隔のコンピュータ上にある実行コード(Javaアプレット)を安全に実行できるよう設計されていました。具体的な機能としては、次のようなものがあります。


Javaの実行コードであるバイトコードの文法などが正しいかどうかを検査するJava仮想マシンのバイトコード検証機能。クラス(バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査するJava実行環境のクラスローダ機能。Javaアプレットが、ユーザによって許可された資源以外の資源(例えばコンピューター内の任意のファイル)に不正にアクセスすることを防ぐJava実行環境のセキュリティマネージャ機能(サンドボックス)。


Java実行環境の既定の設定では、遠隔のコンピュータ上にある実行コード(Javaアプレット)に対して、ローカルにあるファイル等へのアクセスや、アプレットのダウンロード元以外の遠隔コンピュータとの通信を禁止しています。


このサンドボックス機能により、アプレットではかなり実行できることが限られてしまうので、もしローカルファイルとの連携や他ネットワークとの連携を行うプログラムをJavaで書くなら、実行可能なjarファイルを配布する事が望ましいとされています。


また、大規模なサーバーサイドプログラムを書く場合は、Java のサーバサイドで実行される規格である、サーブレット、JSP (Java ServerPages)を用いることでアプレットの制限を回避できることでしょう。

Javaは初期のバージョンから、標準ライブラリとしてTCP/IP(IPv4)のライブラリを備えており、ネットワークでソケット通信を行うソフトウェアを簡単に実装することができました。分散オブジェクト環境のソフトウェアの開発も早い時期からできるようになっており、Java RMI もしくは CORBA の分散オブジェクト技術を標準で使うことができます。


近年では、標準、拡張その他のライブラリにより、さまざまなネットワークプロトコルを高水準で扱えるようになっています。また前述のプラットフォーム非依存という特長により、Java 言語を使えば極めてネットワークに強いアプリケーションを建築できるというメリットがあります。プラットフォームに依存しないという言語の性質から、ネットワーク接続の為に逐一手続きをすることはなく、他の手法に比べて極めて簡単に、そして強力にネットワークを利用できます。このようなことから、Java は極めてネットワークに適した言語といえるでしょう。


現在ではFTP(ファイル送受信)、HTTP(ウェブによるデータ送受信)、SMTP/POP/IMAP、NNTP(電子メール送受信、ネットニュース)SSH、TLS/SSL(セキュアな通信により盗聴やなりすましを防ぐ)、SMB(ファイルサーバへのアクセス)などの基本的なプロトコルは扱えるようになっており、さらに IPv6 も扱えるようになりつつあります。また、ネットワーク機能だけでなく、XML文書を扱うライブラリも備えているので、これとネットワーク機能を有効に組み合わせることにより、高度なシステムやサービスを構築できるようになっています。

ガベージコレクションとは、プログラムが確保したメモリ領域のうち、不要になった部分を自動的に解放する機能の事を指します。Javaではガベージコレクションを備えているので、この機能を備えていない従来の多くの言語と比べてプログラム開発の生産性と安定性が高いといえます。


このガベージコレクションにより、プログラマの負担はかなり軽減されます。ガベージコレクションを備えていない言語例えばC++の場合、プログラマは自分自身でメモリの管理をしなければならず、メモリ管理に関連するバグに陥りやすいと言われています。


実際、C++では、Javaと同様にメモリ内のヒープという領域に生成するオブジェクトを格納する領域を割り当て、後にそれが必要なくなった場合には、必ずオブジェクトを削除する指示を適切に記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならないのですが、メモリ領域の解放が必要な時にプログラマが領域の解放を忘れたりした場合には、メモリリークが発生してしまう可能性があります。


メモリリークとは、解放し忘れた未解放メモリが累積していく現象で、利用できるメモリの量が減ってゆきます。Javaの場合、オブジェクトがどこからも参照されなくなった場合、Javaのガベージコレクション機能が自動的にその「到達不可能なオブジェクト」を削除し、そのメモリ領域を解放することで、解放し忘れた未解放メモリが累積していき利用できるメモリの量が減ってゆくメモリリークを防ぎます。

javaはプラットフォームに依存していないので、JavaのプログラムはさまざまなハードウェアやOS上で必ず同じように動きます。このJavaのプラットフォーム非依存は、次のようにして実現されています。ほとんどのJavaのコンパイラ(Javaコンパイラ)は、Javaのソースコードをバイトコード(と呼ばれる、ソースコードと機械語の中間の言語のようなもの)に一旦コンパイルして、Javaプログラムを実行する際にこのバイトコードをJava仮想マシン(Java VM、仮想マシンの一種で、実行するハードウェアにネイティブなソフトウェア)上で機械語に翻訳して実行します。


このバイトコードから機械語への変換は、Java仮想マシンがBasicなどのようにインタプリタとして行う場合と、Java仮想マシンがリアルタイムで動くコンパイラを使って行う場合とがあります。以前までは、前者のインタプリタとしてしか動かすことが出来ず、それゆえJavaで作ったプログラムは遅い、といわれていましたが、リアルタイムで動くコンパイラの機能を備えたお陰でその他のコンパイル言語で作られたプログラムと同レベルの実行速度を実現しています。


Java実行環境(JRE)は、Java仮想マシンの他に、標準ライブラリを備えており、この標準ライブラリを利用することにより、Javaプログラムは、グラフィクス、スレッド、ネットワーク など実行するマシンのさまざまな機能を、プラットフォームごとにソースコードを書き分けることなく使用することが出来ます。

Javaの特徴の一つであるオブジェクト指向プログラミングは、プログラミングおよびプログラミング言語設計の手法を指します。オブジェクト指向の概念には、多くの解釈があるのですが、 一般的にオブジェクト指向とは、ソフトウェアで扱うさまざまな種類のデータについて、データとそのデータに関連する手続きをまとめて一つにするように、ソフトウェアを設計することです。


こうして、データとコードは、オブジェクトと呼ばれる実体に一体化されます。つまり、オブジェクトとは、状態(データ:例えば「変数」)と振る舞い(コード:例えば関数)がひとかたまりとなったものと考えることができます。


Java では、オブジェクトの設計図である"クラス"に定義する振る舞いを「メソッド」、状態のことを「フィールド」(インスタンス変数)と呼びます。オブジェクト指向が導入される以前は、プログラムにおいてこれらの状態と振る舞いが分離されていましたが、オブジェクト指向に基づいて、これまで分離されていた状態と振る舞いをオブジェクトに一体化することによって、大規模なソフトウェア開発の管理が楽になり、ソフトウェアの品質が向上し、失敗するプロジェクトの数を減らすことができるようになりました。


また、オブジェクト指向のもう一つの特徴として、汎用的なオブジェクトを開発することで、プロジェクトをまたがってソフトウェアをより再利用可能にしてゆくことが可能になり、開発期間を大幅に短縮し、安定したソフトの開発ができるようになりました。

java言語の基礎知識

Java言語の基礎知識や学習方法、およびその周辺ソフト・周辺技術についての解説しています。ジャバ言語を完全マスターして徹底活用する際のご参考にして下さい。