BLOG

JAVAの言語仕様の再確認

こんにちわ。開発エンジニアのN・Yと申します。50代のエンジニアです。

JAVAでの開発経験はあるが、しばらく開発から遠ざかっていたため、初心にかえり、言語仕様や特徴、注意点などについて確認を行う。

JAVAについては書籍やネット上に多くの記事が掲載されているが、2日間の短期間での確認のため、ネット上にある記事を元にして確認を行うこととした。

 

まず、JAVAについての検索であるが、前出の通り「初心にかえり、言語仕様や特徴、注意点などについて確認」の目的があるため、初心者レベルのページから紐解くととした。

 

JAVAなどの言語において、キーワードとなる言葉は

などがある。

これらについて、用語の確認を行い、今までの経験で培った知識との乖離がないかを確認する。

 

「オブジェクト」という言葉には、「モノ」という意味がある。

オブジェクト指向のプログラミングとは、プログラムの機能や役割を区別し、それらを構成する部品(オブジェクト)を組み合わせることを指す。

オブジェクト指向で作成するメリットは、既存プログラムを部品として活用(再利用)できることになる。要件が確定後、それを実現するためにプログラムを作成するが、毎回新規に作成したのでは期間やコストなどがかかる。しかし過去に作成したプログラムをそのまま、もしくは修正を加えて再利用すれば、プログラムを一から書くよりも効率的で、短期間、高品質の物を安価に作成することができる。

 

クラスはオブジェクトの設計図となる物である。

オブジェクトの属性(プロパティ)や振る舞い(メソッド)を記述し、オブジェクトのひな形としての役割を果たす。

プロパティはオブジェクトが持つデータ、メソッドはオブジェクトが持つ機能を指す。

例えるなら、オブジェクトを自動車、クラスを自動車の設計図と考えた場合、自動車の走る・曲がる・止まるといった機能がメソッド、車体サイズや色、排気量といったスペックがプロパティに対応する。

 

共通処理が複数のクラスに分散していた場合で、かつ、個々の処理にバリエーションがある場合、仕様変更などを行う際、共通処理部分の修正の他、個々の処理に影響が及んでいないかなどの設計時の確認やテスト工数に多くの時間とコストを割くことになる。

そこで、共通するメンバはそのまま使用しつつも個々の処理については新たな属性や処理(メンバ)を加えることで処理をまとめる手段としてクラスの継承という機能を利用する。

共通するメンバを集めた継承元のクラスのことを「基底クラス」、「スーパークラス」、「親クラス」などと呼ぶ。また基底クラスを継承したクラスのことを「派生クラス」、「サブクラス」、「子クラス」などと呼ぶ。

派生クラスでは、基底クラスの処理を変えたい場合にその処理のメソッド名や引数を変えることなく、別の処理を記述することができ、これをメソッドのオーバーライドと呼ぶ。

 

抽象化とは実態を持たない、シグネチャ(メソッド名、引数の型、引数の数)と戻り値の型のみを定義することです。

実態がないので、それ自身では処理を行うことはできません。

では、なぜ、抽象化を行うのでしょうか。

抽象クラスでは処理の実態がないためメソッドのオーバーライドを強制することになります。そして、抽象クラスを継承したサブクラスごとに抽象メソッドをオーバーライドして処理内容を記述する必要があります。

つまり、サブクラスごとに必ず処理内容を記述しなければならないということなり、処理の実装漏れやテスト時のスタブなどへの活用が容易になる。

 

簡単か用語の確認を行ったが、実際にはどのように記述を行い、どのように動作するかを確認する要がある。

 

今のPC環境ではJAVAを実行することが出来ないため、JAVAの開発環境のインストールを行う必要がある。

そこで、まずは JDK 開発キット をダウンロード、インストールを行った。

これで、コンソールからのコマンドにてコンパイル、実行が可能となったが、JAVAの開発には、原始的はコンソールからの指示で行うのではなく、統合環境にて行う事がほとんどであるため、JAVAなどの開発によく使われている Eclipse のインストールを行う。

このインストールは Eclipse のサイトからダウンロードを行い、日本語化する手順となるが、これらを一つにまとめた「Pleiades All in One」という無料の統合開発環境があるので、パッケージの圧縮ファイルをダウンロードし、その圧縮ファイルを解凍するだけで、JDKのインストールや環境変数の設定、Eclipseのダウンロード、日本語化全てが実施済みの開発環境が立ち上がる優れものである。

解凍を行い、Eclipseを実行すると、以下のオープニング画像が表示される

 

その後、以下のようが統合開発環境の画面が表示される

このままでテスト実行などは行えるが、GUIを備えたアプリケーションは出来たいため、SceneBuilder のインストールを行う

インストール後、Eclipseから起動が行えるように設定を行う。

設定は、Eclipse にあるメニューバー の ウィンドウ > 設定 で設定ダイアログを表示し、左側のリストから「JavaFX」を選択し、SceneBuilder.exe が格納されているフルパスを設定する。

これで、開発環境の構築は完了

その後、ネットからクラスや継承、抽象化クラス、インタフェースなどのサンプル記事を見ながら、ソースを開発環境にて入力し、実行結果を確認した。

 

その際に int とInteger の違いについて認識齟齬があった事が分かった。

byte , int などは基本的なデータを格納するための値型(プリミティブ型)であり、

Integer , Float はラッパークラスであり、値型では単にその値に対して演算子にて操作することは可能であるが、他のクラスのようなメソッドによる操作は行えない。

そして、一番の違いは比較演算子での結果となる。

int で定義した値を 「==」にて比較した場合、左右が同じ値であれば、結果はtrue となる。これが Integer で行った場合は、false という結果が返ってくる。

この原因は、Integer の値比較は、中身ではなく、オブジェクト(アドレス)の比較となるため、期待した結果が得られないというものである。

正しい結果を得るには String での文字比較のように equalsメソッド を使用しての比較を行わなければならない。

この点については、当時は無意識でそのように設計、コーディングを行っていたかと思うが、すっかり忘れていた事項となる。

 

初心にかえって、言語仕様を見直しことは必要であると痛感した。

 

BLOGトップへ戻る