About
About Objective-C Dev Guide
 
オブジェクト指向とは

Objective-Cを一言で言えば、オブジェクト指向を取り入れた、C言語ベースのプログラミング言語です。C言語をベースに作られているので、Objective-Cでコーティングを行う際はC言語をそのまま使うことができます。しかし、Objective-Cはオブジェクト指向の言語なので、実際にコーティングを行う前にオブジェクト指向について理解しておかなければ、本格的なプログラミングを行う前から躓いてしまいます。

この章を読み進める前に、まだCocoaフレームワークについて理解していない方は、予め「Cocoaフレームワークを使ったプログラミング」を読んでおく事をお勧めします。

Objective-Cはオブジェクト指向
従来のプログラミングでは、C言語に代表されるように、手続き型言語が主流でした。手続き型言語とは、与えられた処理に対してフローチャート形式でプログラミングを行っていく手法です。手続き型言語を使用してプログラミングを行うことを手続き型プログラミングと言います。ちなみに、今から学ぼうとしているObjective-Cはオブジェクト指向を取り入れたプログラミング言語ですので、オブジェクト指向プログラミングという事になりますね。

オブジェクトという考え方
言葉だけではわかりにくいので、実際に例を出してみます。例えば、一つのウィンドウがあったとします。プログラムの途中でこのウィンドウを閉じようと思った場合、手続き型言語では「閉じる」ボタンを押した時にどのような処理を行うかを、時間軸に沿って記述しなくてはなりませんでした。つまり「閉じる」ボタンを押した時の処理は、そのコードを最初から最後まで読まなければどのような振る舞いをするか理解できなかったのです。大規模なアプリケーションになればなるほど、これではプログラマーに大きな負担がかかりますし、ソースコードを修正しようと思った時もどこをどうすれば良いのか、その見極めが難しくなってしまいます。

オブジェクト指向では、一つにまとめる事が出来る手続きを一体化してオブジェクトとして定義します。一つの処理として定義できる手続き、例えば「閉じる」為に必要な処理をひとまとめにしておき、ソースコード上では「ウィンドウを閉じる」というメッセージを送るだけで処理されればわかりやすいですよね。このように、必要な処理をソースコードの外側にまとめる事をカプセル化と言い、そのオブジェクトに対して、実行に必要なメッセージを送るような処理の方式をメッセージ式と言います。また、この時にメッセージを送る側をセンダ、メッセージを受け取る側をレシーバと呼びます。


オブジェクト指向は、互いにメッセージを送り合うメッセージ式によって成り立っている

カプセル化を行う際、外部に公開する必要のある情報以外隠すことにより、(これを情報隠蔽と言います)プログラマーは一度に把握しなければならない情報量が減るのでソースの全容が理解しやすくなります。また、「見えない」という事は、オブジェクト内部の処理が外部に影響しなくなる為、仕様の変更も容易に行え、保守性が高くなります。一つのカテゴリとして関連するメソッドの集合体をカプセル化したもの、それがオブジェクトの正体です。


オブジェクトの内部からはAPI(メソッド)しか見えない(情報隠蔽)

クラスとインスタンス
オブジェクトの中で定義されているのはメソッドだけではなく、扱えるデータの型も定義しています。オブジェクトでウィンドウを扱いたいとなった場合、今扱っているウィンドウのサイズ(縦幅や横幅)・色・ウィンドウの種類等も定義し、必要に応じてデータを格納しておく必要があります。ここで問題になってくるのが複数のウィンドウを扱いたい場合です。ウィンドウをひとつしか扱わない場合は問題ありませんが、ドキュメントベースのアプリケーション、例えばWordやExcel等のアプリケーションでは複数のウィンドウを同時に表示できます。オブジェクトでは既にウィンドウのデータは格納されていますので、2つ目以降のウィンドウのデータを格納する場所がありません。かといって、オブジェクトを改めて記述・定義し直すのでは効率が悪すぎますし、いくつウィンドウを開くかどうかはユーザの使用状況によって異なります。

そこで、「オブジェクトのテンプレート(設計図)のようなものを用意しておき、必要に応じて必要な数だけオブジェクトを作る」これがオブジェクト指向の基本概念です。この設計図のことをクラスと言い、クラスを元に作ったオブジェクトの事をインスタンスと言います。そしてインスタンスの中に格納されているデータの事をインスタンス変数と言います。今回の例ではクラスを元に作ったウィンドウがインスタンスで、インスタンスの中に格納されているウィンドウの情報がインスタンス変数となります。


クラスで定義したデータの型にインスタンス変数を格納する。クラスをもとにインスタンスを作ることをインスタンス化、または実体化と呼びます。

「じゃあオブジェクトって何?」となりますが、オブジェクトの位置づけはプログラミング言語によって異なります。Objective-Cではインスタンス=オブジェクトです。クラスからインスタンス化したものをインスタンスとも言いますし、オブジェクトとも言います。Objective-Cではオブジェクトを使わなくても説明ができるので、初めてプログラミングを行う人がObjective-Cから入ると「オブジェクト指向のオブジェクトって何!?」と混乱してしまうわけです。

クラスの継承
クラスは関連する処理をひとまとめにしたものなので、文字列を扱うクラスやウィンドウを扱うクラス、データベースを扱うクラスなど、数多くのクラスが存在しています。その中には多種多様なAPI(メソッド)が存在し、必要に応じてオブジェクト(クラス)の機能を呼び出すことができるのです。しかし、状況によってはクラスによって提供されている機能に、多少変更を加えたい事があります。Objective-Cでは既に存在しているクラスの機能を引き継いでクラスを生成・拡張機能が提供されています。これをクラスの継承と言い、元にしたクラスのことをスーパークラス、スーパークラスを元にして作ったクラスのことをサブクラスと呼びます。

クラスの継承によって作られたサブクラスでは、スーパークラスが提供している機能に対し
・新規メソッドの追加
・インスタンス変数の追加
・スーパークラスで既に定義されているメソッドの置き換え
を行えるのが特徴です。クラスの継承により、プログラマーはクラスで定められたメソッド、インスタンス変数だけに縛られることなく柔軟なプログラミングが可能になります。ちなみに、スーパークラスで既に定義されているメソッドの置き換えを行うことを、オーバーライドと言います。インスタンス変数の追加に関しては、あくまでサブクラスで使用するインスタンス変数を追加できるだけなので、スーパークラスで定義されているインスタンス変数を編集・削除する事はできません。これはシステムの保守性を高める為、情報隠蔽を行っているからです。


サブクラスではスーパークラスのメソッドをそのまま使用することができる。ただし、サブクラスからスーパークラスの変数にはアクセスできない。

まとめ
フレームワークとは、一つにまとめることができる手続きを一体化したクラスの集合体です。この機能を呼び出す為にはAPIと呼ばれる、クラスの中で定義されている窓口(メソッド)を使うのでした。次の章では実際にAPIを使った簡単なプログラムを作成し、プログラミングの手法を学んでいきます。

無料でダウンロードできるApple社純正統合開発ツール(IDE)
 
inserted by FC2 system