クラスとメソッド

メソッド < オブジェクト < クラス

前回演算子式を学んだ際、気になる部分を残していました。

ほとんどの演算子は特別な形式のメソッド呼び出しですが、一部のものは言語に組み込みで、再定義できません。

さて、演算子の正体は特別な形式のメソッドだと云われています。そのあたりについて突っ込んでみてみましょう。


まずは、メソッドとはそもそもなんだったでしょうか。
メソッドとは 【method】 - 意味・解説 : IT用語辞典 e-Words

 オブジェクト指向プログラミングにおいて、各オブジェクトが持っている自身に対する操作。オブジェクトは「データ」と「手続き」から成っているが、その「手続き」の部分に当たる。プログラミング言語によっては「メンバ関数」と呼ばれることもある。

 オブジェクト指向では、オブジェクトの持つデータを操作する方法はオブジェクト自身がメソッドとして内蔵しており、これを外部から呼び出すことによって操作を行なう。こうすることにより、操作の詳細をオブジェクト内部に隠蔽することができ、プログラムの再利用性や生産性を高めやすくなると言われている。

むむ。
『オブジェクトが持っている自身に対する操作』だそうですね。
それなら“オブジェクト”とは何なのでしょうか。
オブジェクトとは 【object】 - 意味・解説 : IT用語辞典 e-Words

 オブジェクト指向プログラミングにおいては、ソフトウェアが扱おうとしている現実世界に存在する物理的あるいは抽象的な実体を、属性(データ)と操作(メソッド)の集合としてモデル化し、コンピュータ上に再現したもの。オブジェクトを定義するモデルはクラスと呼ばれる。クラスに基づいて実際にコンピュータのメモリ上に展開されたオブジェクトのことをインスタンス(実体)と言うが、このインスタンスの意味でオブジェクトと呼ぶ場合も多い。

くらくらしてきました。カタカナと漢字の多い解説で涙が出ます。
順番に考えてみます。

  1. オブジェクトとは、現実世界に存在する実体をモデル化し、コンピュータ上に再現したもの
  2. そのモデルはクラスと呼ばれる
  3. クラスに基づいて実際に展開されたオブジェクトをインスタンス(実体)と云う
  4. オブジェクト≒インスタンス


……という感じでしょうか。
取り敢えず“クラス”とやらも調べてみてから考えましょう……
クラスとは 【class】 - 意味・解説 : IT用語辞典 e-Words

 オブジェクト指向プログラミングにおいて、データとその操作手順であるメソッドをまとめたオブジェクトの雛型を定義したもの。これを定義することで、同種のオブジェクトをまとめて扱うことができるようになる。クラスに対して、具体的なデータを持つ個々のオブジェクトは「インスタンス」と呼ばれる。なお、クラスの定義を他のクラスに受け継がせることを「継承」と言う。その際、元になるクラスを「スーパークラス」(super class)、あるいは「基底クラス」「基本クラス」(base class)などと呼び、新たに定義されたクラスを「サブクラス」(subclass)、あるいは「派生クラス」(derived class)と呼ぶ。

orz


これらの説明から、なんとか糸口を見つけなければなりません。
ぼーっと眺めてみると、3つの説明文に共通する記述があることに気が付きました。
・メソッドの説明文

オブジェクトは「データ」と「手続き」から成っている


・オブジェクトの説明文

属性(データ)と操作(メソッド)の集合としてモデル化


・クラスの説明文

データとその操作手順であるメソッドをまとめたオブジェクトの雛型


……と。
言い回しは少しずつ違いますが、

  • データ(属性)
  • メソッド(操作)

という2点が繰り返し出てきていますので、これが重要なポイントなのではないかと思いました。

データとメソッド

そもそもプログラミングというものは、実際に存在している解決すべき問題を“プログラミング言語”によって表現し、コンピュータにその解決を依頼する行為だと云えます。
その際には、現実世界に存在する(物理的・抽象的な)モノが関わってきます。
このような“モノ”のことを、オブジェクト(インスタンス)と呼んでいるようです。
オブジェクトはクラスと呼ばれるモデルに基づいて作られる実体、でした。逆に言うと、クラスはオブジェクトの雛型です。
つまり、オブジェクトがどのような特性を持っているのかは、クラスが知っているということです。
それではクラスはどのような存在かというと、『データと、その操作手順(メソッド)をまとめて定義したもの』だという話でした。


実例で考えてみましょう。せっかくなので、以前利用した自動販売機さんに再度登場願いましょう。

自動販売機プログラム

自動販売機をシミュレートするプログラムを考えてみます。まずは、その中に登場するモノを検討します。

簡単に思いつくのはこんなとこでした。
これらは実際に存在するもの(実体)ですので、オブジェクト(インスタンス)ということになりそうです。
ということは、これらを定義するクラスが必要だ、ということです。

  • 自動販売機クラス
  • お金クラス
  • 飲み物クラス

ということで良いのでしょうか。*1


さて、クラスは「データとその操作手順(メソッド)」を持つのでした。
それでは自動販売機クラスを例にとって、データとメソッドを検討してみます。
まず簡単にわかりそうなデータは、

  • 飲み物(複数)

ではないでしょうか。
自動販売機ですから、飲み物を持っててくれないと困ります。
続いて自動販売機の操作ですが、

  • お金を入れる(というか入れられる?)
  • ボタンを押す(押される?)
  • 飲み物を出す
  • お金を返す

とかこんな感じでしょうか。自動販売機の立場に立って考えるところなのかどうかわからなくて、言い回しが微妙です。


とりあえず、ここまで検討した内容でシミュレートしてみます。

  1. まず、お金を入れます
  2. 次に、欲しい飲み物のボタンを押……

いきなり躓きました。何と見通しの甘いことでしょう。
冷静に考えてみると、ちょっと情報が少なすぎるような気がします。

  • 今現在、いくら自動販売機に入れてあるのかわからない
  • どの飲み物を買える状態にあるのかわからない

これでは使い勝手が悪すぎます。この二つの情報を自動販売機が管理していなければいけません。
今一度考え直してみると、自動販売機クラスが持つデータは、

  • 飲み物(複数)
  • 現在投入済みのお金

となります。


あれ、「どの飲み物が買えるかどうか」はデータとして持たなくて良いのでしょうか?


色々と考えてみたのですが、どの飲み物が買えるかという情報は、既に自動販売機が持っている「飲み物(複数)」と「現在投入済みのお金」から自動的に計算されるような気がしたのです。
必要であれば計算で求められるので、わざわざ計算結果を自動販売機が常に持っていなくてもよさそうです。
そのかわり、「現在買える飲み物はどれかを知らせる機能」を自動販売機に持たせてあげようと思います。


ということで自動販売機の機能(操作、メソッド)は、

  • お金を入れられる
  • ボタンを押される
  • 飲み物を出す
  • お金を返す
  • 現在投入済みの金額を表示する
  • 現在購入可能な飲み物を知らせる

という感じに増えました。
投入済み金額をデータとして管理することにしたので、それを表示する機能もついでに追加しています。



うーん、これだけ用意してあればなんとなくそれなりのシミュレーションはできそうです。

まとめ

  • オブジェクトはデータ(属性)とメソッド(操作)を持ちます
  • クラスはオブジェクト(≒インスタンス)の定義モデルです
  • つまり、クラスはオブジェクトが持つべきデータとメソッドを定義します
  • 属性はオブジェクトの内部情報を表します
  • 操作はオブジェクトが持つ機能、処理、振る舞い、メッセージといったものを表します

*1:そういえば以前は自動販売機は『関数』として考えたのでした。しかし、実はあれはクラスとして考えるともっとしっくりくる、という事だったのです……