第1回 第2回へ 目次へ
2006 / Aug / 21
はじめに
 このサイトは、プログラミングが始めての方やC言語を学習されていない方を対象に、Macのプログラミングの手法の中から「 Cocoa (ココア)」と呼ばれるものを紹介しています。
 プログラムは、プログラミング言語によって書かれているということはご存知だと思います。Cocoaでは、Objective-C言語というC言語を発展させたプログラミング言語を使用しています。この「Objective-C Primer」では、Objective-C言語を理解する上で必要となるC言語の基礎を学習して、Objective-CとCocoaの入り口までご案内することを目指しています。

ご注意  このサイトに書かれているサンプルコードの実行はあなたの自己責任において行ってください。このサイトおよび私は、このサイトのサンプルコードの実行によって発生するいかなる損害にも責任がなく保証もいたしません。

2006年9月8日修正
2006 / Jul / 12
オブジェクト指向プログラミングの成り立ち
 「オブジェクト指向プログラミング (Object oriented programming)」は、1973年にSmalltalkというプログラミング言語のなかで初めて登場してきました。オブジェクト(object) を辞書で調べますと、
・国語辞典では、(1)英文法で目的語をいう。(2)対象。客観
・英和辞典では、(1)物体、もの、実物。(2)対象。(3)目的(物)
となっています。今回のオブジェクト指向プログラミングの場合は、モノと訳すよりも目的と訳すほうが都合がよいように思います。
具体的に申しますと、コンピュータープログラムには、データとそのデータを処理(操作)する部分(これをコードと言います)があります。例えばデスクトップに表示されるウィンドウは、その大きさや位置の数値データを保持しています。またウィンドウのタイトル名の文字列データも保持しています。そしてクローズボタンやリサイズボタンを押した場合の動き(コード部分)も持っています。これらのデータとコードを一つの「ウィンドウ」オブジェクトという単位にまとめてプログラミングしようというのがオブジェクト指向プログラミングです。また、これらのオブジェクトは互いにメッセージをやり取りすることで協調的に動作することができます。
文章で読んでもいても、いまひとつ理解しにくいと思いますので以下に図示してみます(図1)。なお、オブジェクト指向でない言語のことを手続き型言語と言います。

図1


実際にはデータとコードがまったくのバラバラの状態から、一気にオブジェクトとしてまとまったのではなく、データだけをまとめたレコード(C言語やObjective-C言語では構造体と呼ばれます)というデータ型にコードを追加する形でオブジェクトが生まれたと考えられています(図2)。

図2



これから学ぼうとしている Cocoaフレームワークで採用されている Objective-C言語は、C言語に Smalltalk のオブジェクト指向プログラミングの仕様を追加した言語です。

「オブジェクト指向は、GUIアプリケーション用に登場したものではない」と言われていますが、GUIアプリケーションを作るうえで非常に便利です。
また、
「オブジェクト指向は、大規模アプリケーション向き」と言われますが、小規模なアプリケーションでも充分に便利で、特に Cocoaフレームワークは現在もっとも生産性の高い(要するに短期間で開発ができる)開発環境だと言われています。

註1. オブジェクト指向型言語、手続き型言語のほかには関数型言語、論理型言語などもございます。
2006 / Jul / 16
オブジェクト指向プログラミングの特徴
2006年7月18日修正

次にオブジェクト指向プログラミングの特徴をあげてみます。ただし、オブジェクト指向プログラミングの概念は言葉で説明するのは難しいですが、ある意味、自転車に乗れるようになるのと似ていています。使っていくうちに自然と覚えていくという面がございます。また入門者に最初に説明するには十分に難しいデーマでもあります。ですのでこの段階で理解できなくても一向に差し支えありません。取りあえず先に進めて、後から読み直す、というのも良いのではないかと思います。
また、オブジェクト指向の実際の使われ方は言語によって少しずつ違います。ですので以下にはさまざまなオブジェクト指向言語で共通していると思われるオブジェクトの特徴を列挙しようと思います。

オブジェクト指向プログラミングの特徴

1. ある物(目的)のためのデータと、そのデータを操作・処理する部分(コード)がひとつにまとまり、自己完結的である。
2. オブジェクトにはクラスインスタンス(実体)があり、クラスがオブジェクトの仕様書(設計図)にあたり、その設計図を元にメモリーにロードされた実体がインスタンスである。
3. あるクラスを親として、そのクラスの子供を作ることができる。その子供のクラスは親の性質(データと、その処理・操作)のすべてを引き継ぎ、さらに新しいデータや処理を追加したり、親から引き継いだ処理の1部を改変することができる。

#1は、前回で説明したことにあたります。
#2は、メモリー上にクラスのインスタンスをいくらでも作れることを意味します。
#3は、継承(inheritance)と呼ばれる機能です。親クラスのことをスーパークラス、子クラスのことをサブクラスと呼びます。この継承については生物図鑑などに良く喩えられます。まず生物というクラスを作り、そのサブクラスに植物と動物を作ります、そしてその動物のサブクラスに魚類・両生類・鳥類・哺乳類などを作り、最後に犬・猫・人などに至るというものです。
このあたりからもオブジェクト指向が大規模なプログラムに向いていると言われている点です。
なお、サブクラスもクラスですのでインスタンスをメモリー上にいくつでもロード(実体化)することができます。

註2. 次からはオブジェクトを物と訳すことに統一します。またソースコードと混同しないために処理・操作はあくまでも処理・操作と呼び、コードと呼ぶことをやめます。

用語辞典などでみられる「オブジェクト指向プログラミング」の定義

「オブジェクト指向プログラミング」を用語辞典などで調べますと、「データとそれを操作するプログラムをひとつのオブジェクトという単位にまとめ、各オブジェクトが相互に通信し合うプログラミング手法」(デジタル用語辞典/PC EXPLORERより)。などの説明が多いみたいです。
「あれー?、それじゃクラスとインスタンスや、継承はどうなるの?、それに通信って何?」ということになります。 ここで言われている通信とは、オブジェクトの処理・操作の部分を呼び出すことで、C++というオブジェクト指向言語では「メンバ関数の呼び出し」と呼びます。しかしObjective-Cでは明確に通信(メッセージ)と言われています。少し込み入った話しになりますが、関数呼び出しと通信は厳密には違います。C++の関数呼び出しの場合は、プログラムの実行前から呼び出す関数が間違いなく存在しているかどうかチェックされます。そしてもし存在していなければプログラムは元から完成されません。ですが、Objective-Cのメッセージの場合は、そのメッセージを受けるオブジェクトに、対応する処理や操作(Objective-Cの場合にはこれをメソッドと呼びます)が存在するかどうかはチェックされていません。
プログラム実行時にメッセージを受けたオブジェクトに対応するメソッドが存在しなくてもエラーにもならず単に無視されるだけです。

 上記の赤字部分は間違いでした。正しくは、
プログラム実行時にメッセージを受けたオブジェクトに対応するメソッドが存在しない場合は、そのプラグラムは強制終了してしまいます。
 これはもう実質上ザル状態です。もしメッセージ名(メソッド名)を間違えてコードを書いてしまうと実行時までエラーを含んでいるかどうか分からないということです。これがCやC++ならコンパイル時(プログラミング言語で書かれたテキストファイルからコンピューターが理解できる機械語に変換する作業)に記述のミスを探し出してコンパイルは中止されます。
2006年11月2日修正

話しが少し飛躍しましたが、ここで言いたいことは「オブジェクトを定義する場合に、クラス、インスタンス、継承というキーワードは絶対条件ではないらしい」ということです。ただし、クラス、インスタンス、継承がオブジェクト指向プログラミングの重要な特徴であることには変わりはありません。
2006 / Jul / 17
オブジェクトの定義
では、オブジェクトの定義をもう1度行ってみましょう。

図3



左の図が最初に説明したウィンドウ・オブジェクトのイメージ図です。そして右の図がオブジェクトの定義をイメージにした図です。

ここで、このサイトの「Book review」でも紹介している「Happy Macintosh Developing Time Second Edition」でのオブジェクトの定義を見てみますと。

1. 属性を持ち、メッセージを受け取れるもの
2. そしてメッセージを送信できるもの

となっています。

註3. この定義は前述の用語辞典の説明とも完全に一致しています。

右の図を見て頂ければ分かるように「インスタンス変数」というところが属性になっています。そしてメソッドというところでメッセージを受け取れます。メソッドはなにがしかの処理・操作を行うところです。
インスタンス変数については後の回で説明しますが、属性(データ)を入れておくための場所です。これで、
1.の「属性を持ち、メッセージを受け取れるもの」については説明がつきました。では、
2.の「メッセージを送れる」とはどういうことでしょうか?
実は Objective-C ではすでにメッセージを送る能力を持っています。この事については後の回で説明できる機会もあるかもしれませんが、もともとこのドキュメントが「初めてプログラミングを勉強される方、もしくはC言語を勉強されていない方」を対象にしていますので、詳しい説明はいったん省略いたします。今は「メッセージ式」というものを書けば、プログラムのどこからでもオブジェクト(クラスおよびインスタンス)にメッセージを送れると覚えて頂ければ結構です。

注4. 上記のオブジェクトの定義は、あくまでも Objective-C言語においてのみ通用するものであると思ってください。もともとオブジェクト指向という言葉は smalltalk のプログラミング手法を説明するために創られた言葉です。ですからその smalltalk の直系の子孫とも言われている Objective-Cの中でその定義が忠実に再現されていてもなんら不思議はありません。
2006 / Jul / 18
Column
2006年7月22日修正

1973年 米国Xerox(ゼロックス)社のPaloAlto研究所で世界初の GUI OS である Altoワークステーションが誕生しました。GUI だけではなくマウスも備えていました。このコンピューターシステムは一説によると約10万ドルで市販されたとも、まったく市販されなかったとも言われています。もし市販されていたら当時のレートで日本円に換算して2500〜3600万円ほどの値段になります。
そしてこのAltoワークステーションに搭載された、世界初のオブジェクト指向言語が、smalltalk でした(米国のATTベル研究所で C言語が生まれる5年ほど前のことでした)。
オブジェクト指向というのはこのsmalltalkを説明するために創られた言葉です。そしてまた、Model(モデル)、View(ヴュー)、Controller(コントローラ)というGUI設計のための新しいコンピュータ・スタイルを模索しました。
MVC (Model-View-Controller) については、また後の回で説明いたします。
第2回へ 目次へ