このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

目次

オブジェクト指向

 オブジェクト指向(object oriented)はシステムの提供する多くオブジェクトでアプリケーションなどを効率良く動かすという概念である。

 現在はJava、C++、PHPなどの多くのプログラミング言語で採用されている概念です。

オブジェクト

 オブジェクト指向とはオブジェクト単位で扱う。ただし、オブジェクト指向はまだ発展途上であり、厳密な定義がない。

 BASIC/C言語/Javaにおいて、「hello,world」を画面出力する部分を抜き出して、説明する。

○BASICの場合

  1
  2
10 PRINT "hello,world"
20 END

○C言語の場合

Everything is expanded.Everything is shortened.
  1
  2
  3
-
|
!
int main(void){
 printf("Hello World\n");
}

○JAVAの場合

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
-
-
|
!
!
public class Hello {
 public static void main(String argv[ ]) {
  System.out.println("Hello World");
 }
}

 プログラムだけを見るとBASICでは短いコードであり、Javaでは長いコードになっている。しかし、大きいプログラムの場合、Javaの方が効率的になる。というのも、BASICにはサブルーチンの非独立性があるからである。簡単に言えば、BASICはサブルーチンの効率が悪いのである。また、C言語は関数という考え方によりプログラムを分割して構築できる。JavaはC言語の作業効率をさらに進化させたオブジェクト指向が利用できるのである。

 クラスやオブジェクトの概念はオブジェクト指向プログラミングのミソとなる概念である。オブジェクトの中にはプログラムの基礎となる関数(またはメソッド)と変数(またはフィールド)が入っている。オブジェクトに含まれるこれらメソッドやフィールドは他のオブジェクトからは影響されない。即ち、変数名や関数名のスコープも切り離されるし、許されたメソッド以外からは外からアクセスできないのである。例えるならば、ICに似ている。なぜならば、ICは直接中身をいじることができなく、ICの足のピンを通して制御するからである。

例:ドロー系ソフトウェアをオブジェクト指向で作ったとする。画面に描画することができる図形には線や多角形がある。ここに出てきた線や多角形がオブジェクトとして扱う。 ◇

オブジェクト比較

 Javaにおいて文字列比較したい場合がある。このとき、他のプログラミング言語に慣れてしまっている方は次のように「==」を使って比較演算式を書いてしまうかもしれない。しかし、これでは正しい結果を得ることができない。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
 
 
-
|
-
|
!
String str = new String("ABCD");
 
if(str=="ABCD"){
//strが"ABCD"の時の処理
}else{
//strが"ABCD"以外の時の処理
}

 なぜならば、これだとstrと"ABCD"が同じオブジェクトであるかどうかを比較してしまうからである。実際、strと"ABCD"はどちらも同じ文字列を保持しているString型のオブジェクトであるが、異なるオブジェクトである。

 Javaで文字列自体を正しく比較するには次のようにequals()メソッドを用いればよい。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
 
 
-
|
-
|
!
String str = new String("ABCD");
 
if(str.equals("ABCD")){
//strが"ABCD"の時の処理
}else{
//strが"ABCD"以外の時の処理
}

オブジェクト生成

 クラスはクッキーの型、オブジェクトは焼きあがったクッキーのようなものである。このクッキーを作ることをオブジェクト生成という。

 オブジェクトは焼き加減、どのくらい食べられるのかなど、個々のオブジェクトに個別に反映される。

フィールドとメソッド

 オブジェクト指向ではオブジェクトは性質(状態)と振る舞い(動作)の2つの要素で構成されている。前者の「状態」の要素をJavaではフィールド、後者の「振る舞い」の要素をメソッドと呼ぶ。

 例えば、「携帯電話」というオブジェクト(物)は「カラー表示ができる」「電池持ちがよい」などという性質(状態)、「ダイヤル先のベルを鳴らす」「相手にメールを送る」「アラームを鳴らす」などという振る舞い(動作)を持っている。即ち、携帯電話のフィールドが「カラー表示ができる」「電池持ちがよい」など、メソッドが「ダイヤル先のベルを鳴らす」「相手にメールを送る」「アラームを鳴らす」などになる。

  • Javaの場合のSystem.out.println
    • Systemはクラス名、outはフィールド名、printlnはメソッド名である。
    • SystemクラスのoutフィールドはPrintStreamクラスのオブジェクトである。これは文字列を出力するために使われる。ちなみに、ストリームとはキーボードから入力される文字の列や画面へ出力される文字の列をデータの流れる通路の意味を持っている。
    • 次に、printlnメソッドはSystemクラスのメソッドではなくて、java.ioパッケージのPrintStreamクラスのメソッドである。この場合、outフィールドがPrintStreamクラスのオブジェクトになるわけなので、printlnメソッドはoutフィールドの持っているメソッドに当たる。
      • このことから、outが二重の意味を持っていることに注意すること。

メッセージ

 オブジェクトのメソッドを引き出すものをオブジェクト用語でメッセージと呼ぶ。様々なオブジェクトが互いにメッセージを交わしながらプログラムが進行していくのがオブジェクト指向の考え方である。

プログラミング言語とオブジェクト

 プログラミング言語でオブジェクトを扱うにはクラス(設計図)を元にオブジェクトの実体を作る。この作られた実体をインスタンス(instance:事実)と呼ぶ。同一クラスから作られたインスタンスは同じフィールドとメソッドを持っている。

 よって、オブジェクト指向プログラミングの際にはクラスの定義、インスタンスの作成が行われる。

継承

 オブジェクト指向言語の場合、新しいクラスを定義するときに別のクラスの性質(フィールド)や振る舞い(メソッド)をそっくりそのまま受け継がせることができる。この機能を継承(inheritance)という。このとき、継承された方のクラスをスーパークラスといい、継承した方をサブクラスという。

 JavaやPHPで既存のクラスを継承して新規クラスを作成するときは次のような書式で書く。

class クラス名 extends スーパークラス名{

 公式のように次を覚えればよい。

A extends B

 AはBを継承でき、このときAから見てBがスーパークラス、BからみてAがサブクラスになる。

継承の利点

 継承によって、複数で分担開発を行っている際に間違えて重要なデータを消してしまうというトラブルを少なくさせることができる。なぜならば、重要なデータほどスーパークラスだからである。

参考文献

  • 『一週間でマスターする Javaプログラミング for Windows』
  • 『図解でわかるiアプリプログラミング』