クラスを理解する

クラスとは

Javaでデータを扱う入れ物としては,「データ型」と「クラス」の2種類が存在しま す.前者は,C言語などで見られるデータ型の使い方そのものです.後 者は,オブジェクト指向特有です.

クラスとは,変数とその操作手順であるメソッド(関数)をまとめたオブジェクトの雛型を定義したものです.

C言語の構造体に似ていますが,違う のは,

構造体

クラス

変数のみメンバーとして持つ

変数と関数をメンバーとして持つ

というところです

クラスの生成とインスタンス

クラスを利用する際には,たいていは宣言するだけではだめで,インスタンスを生成する必要があります.

String str = new String();

上記の場合,Stringクラスというのを宣言して生成しています.strはStringクラスのインスタンスであるといいます.

#なお, newしてインスタンスを生成しなくても使えるクラスもあります.

クラスのメンバーへのアクセス制限

C言語の構造体

インスタンス名.変数名

インスタンス名.メソッド名

といった呼び方によりアクセスすることができます.

ただし,Javaではメンバーへのアクセスを制御する修飾子が定義されています.つまり,クラス内で定義された変数や関数(メソッド)は外部から全て利用 できるのではなくて,隠蔽化することができるのです.具体的には次のアクセス制御修飾子が用意されています.

インスタンス名.変数名

インスタンス名.メソッド名

といった呼び方によりアクセスすることができます.

    • public ・・・ 外部からも参照が可能
    • (未記入・未指定) ・・・ 同じパッケージの中で利用可能
    • protected ・・・ 継承したクラス内で利用可能
    • private ・・・ 宣言されたクラス内でのみ参照が可能(完全に隠蔽化

なぜこのようなアクセス制限があるのでしょうか?オブジェクト指向プログラミングにおいてクラスやメソッドを定義するときは,通常次の2つの目的がありま す.

なぜこのようなアクセス制限があるのでしょうか?オブジェクト指向プログラミングにおいてクラスやメソッドを定義するときは,通常次の2つの目的がありま す.

  • 自分(クラスの開発者)自身が,プログラムの見通しをよくするために定義する.
  • 他人につかってもらうため.

重要なのは後者です.オブジェクト指向というのはプログラムの再利用を高めるための手法であり,他人が使ってみて使いやすいクラスを実現することが重要と なります.つまり,

なぜこのようなアクセス制限があるのでしょうか?オブジェクト指向プログラミングにおいてクラスやメソッドを定義するときは,通常次の2つの目的がありま す.

自分(クラスの開発者)自身が,プログラムの見通しをよくするために定義する.

他人につかってもらうため.

重要なのは後者です.オブジェクト指向というのはプログラムの再利用を高めるための手法であり,他人が使ってみて使いやすいクラスを実現することが重要と なります.つまり,

    • クラスの特徴をあらわすわかりやすい関数や定数を提供できる
    • エラーのでにくい関数や定数を提供できる

というクラスです.たとえば,自動車を運転する...というのをイメージしてください.我々は,ハンドルをきったり,ペダルを踏むことで思うように操作で きますよね.実は車の内部では,ペダルを押すことで油圧が変化して,それをセンターが検知し,その変化に応じてエンジン内でガソリンの噴射量を制御 し.....とかさ れています.でも,私たちはそんなことを意識しなくてもいいですよね.車の機能としては,ペダルの油圧検知とかガソリンの噴射制御...などがあるので しょうけど,私たちにとってはそんなことは知る必要もないし,それらを直接操作する必要はないのです.別の見方をすると,私たちみたいな素人が,へたにガ ソリンの噴射制御なんてのを扱うことができたりしたら,エンジンが止まってしまったり暴走してしまうかもしれません.

極論をいえば,アクセス制御修飾子の設定はほとんどは privateにするべきでしょう.で,外部公開したいメソッドや変数についてはpublicにしていけばいいはずです.それ以外の修飾子の使い方は,オ ブジェクト指向のことが理解しだしてからでいいです.

Javaでは,クラス、メソッド、変数に対する修飾子が用意されています.これらを理解することで,オブジェクト指向の理解=真のJavaプログラマーへ の道が開かれます.

クラスの配列宣言

JavaにもC言語と同様に配列の概念がありますが,その宣言の仕方は異なりますので注意しましょう.

配列宣言(String型の場合)

String test[ ] = new String[5];

となります.C言語とはことなりますね.

この時,インスタンスが生成されているわけではありませんので

test[0] = new String("aaaaa");

型変換の必要性

Vector等のList系のクラスは,クラスのみをデータとして格納できます.int型 の数値を格納することはできないのです.もし,1という数値を格納したいのであれば,int型のデータをIntegerクラスに格納するなどの工夫が必要 です.

オートボクシング機 能(JDK5.0以降)

なお,JDK5.0(1.5相当)からは,型変換の手間が省けるようになっています.オートボクシング/アンボクシング機能により,型変換を自動的にして くれます.たとえば,List系クラスにint型を格納することができます.ただし,パフォーマンスの面ではあまりこれに頼ると悪くなくという話もあるよ うです.

キャストによる変換

Vectorなどで格納したデータ(クラス)を取り出すとき,取り出すデータのクラス が実態が何であれ,Objectとして返します.Objectクラスを別の型に強制変換するにはキャストを行います.キャストはC言語にもありますね.

例えば,Stringクラスに変更したい場合は,

String ss = (String)XXX......;

のように,(変換したいクラス名 )というようにします.

型変換のクラスメソッド例

ここでは,典型的な型変換の方法を紹介する.

*→ String型

String.valueOf() メソッドを使うことでほとんど可能です.

String → int型

int = Integer.valueOf(String).intValue();

String → double型

Double.parseDouble()メソッドでOKです.