クラスを更に考える (1/8)
作成:2011-02-08 11:27
更新:2011-11-13 12:13
更新:2011-11-13 12:13
■クラスメソッドとインスタンスメソッド
さて、またもや前回作成した「MyTestClass」に登場してもらい、引き続きクラスについて考えていくことにしましょう。先にMyTestClassを利用したとき、このような形でインスタンスを作成したのを思い出してください。
実は、クラスにあるメソッドは、常にインスタンスから呼び出すというわけではないのです。「クラスから直接呼び出せるメソッド」というのも用意することができます。両者を区別するために、クラスから呼び出すものを「クラスメソッド」、インスタンスから利用するものを「インスタンスメソッド」と呼んだりします。
両者の違いは、メソッドの定義の一番最初にある記号で区別します。「-」で始まるものはインスタンスメソッド、「+」で始まるものがクラスメソッド、というわけです。
クラスメソッドは、クラスから直接利用するため、インスタンスメソッドとはいろいろと性質が違う面があります。なにより重要なのは、「インスタンス変数が使えない」という点でしょう。インスタンス変数は、作成したインスタンスに値を保管するためのものですから、クラスには値を保持できません。したがって、インスタンスに保管されるさまざまな情報にはアクセス出来ません。
また、クラスから直接インスタンスメソッドを呼び出すこともできません。つまりクラスメソッドは、クラスメソッドだけで完結するような形で作成されることになります。そう考えると、用途はだいぶ限定されると言っていいでしょう。
もっとも考えられるのは、保管されるデータなどを必要とせず、渡される引数の値などだけから何かの処理を行わせるようなものです。例えば純粋な計算処理などは、いちいちインスタンスを作ってメソッドを呼び出すより、クラスメソッドとして実装したほうが便利でしょう。
また、クラスメソッドとして用意する、非常に重要な機能として忘れてはならないものがあります。それは「コンビニエンスコンストラクタ」です。
MyTestClass* obj = [[MyTestClassまず最初に、[MyTestClass alloc]を呼び出してインスタンスを作っていました。さあ、ここで質問です。MyTestClassは、インスタンスですか? もちろん違います。これはクラスですね。つまりこのallocは、「クラスからメソッドを呼び出している」ことになります。
alloc] init];
実は、クラスにあるメソッドは、常にインスタンスから呼び出すというわけではないのです。「クラスから直接呼び出せるメソッド」というのも用意することができます。両者を区別するために、クラスから呼び出すものを「クラスメソッド」、インスタンスから利用するものを「インスタンスメソッド」と呼んだりします。
両者の違いは、メソッドの定義の一番最初にある記号で区別します。「-」で始まるものはインスタンスメソッド、「+」で始まるものがクラスメソッド、というわけです。
クラスメソッドは、クラスから直接利用するため、インスタンスメソッドとはいろいろと性質が違う面があります。なにより重要なのは、「インスタンス変数が使えない」という点でしょう。インスタンス変数は、作成したインスタンスに値を保管するためのものですから、クラスには値を保持できません。したがって、インスタンスに保管されるさまざまな情報にはアクセス出来ません。
また、クラスから直接インスタンスメソッドを呼び出すこともできません。つまりクラスメソッドは、クラスメソッドだけで完結するような形で作成されることになります。そう考えると、用途はだいぶ限定されると言っていいでしょう。
もっとも考えられるのは、保管されるデータなどを必要とせず、渡される引数の値などだけから何かの処理を行わせるようなものです。例えば純粋な計算処理などは、いちいちインスタンスを作ってメソッドを呼び出すより、クラスメソッドとして実装したほうが便利でしょう。
また、クラスメソッドとして用意する、非常に重要な機能として忘れてはならないものがあります。それは「コンビニエンスコンストラクタ」です。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
int main (int argc, const char * argv[]) { MyTestClass* obj = [[MyTestClass alloc] init]; [obj setMessage:@"This is First Object!!"]; [obj printMessage]; return 0; }
※関連コンテンツ
「初心者のためのObjective-Cプログラミング入門」に戻る