今回は「クラス」と「メソッド」と言うものについて勉強して行こうじゃないですか、と。
まず、クラスと言うものは、プログラムの部品だと思って下さい。
オイラは自動車が好きなのでそれで例える。
1つのプログラムが自動車そのものだとしたら、クラスとはなでしょ?
答えは簡単で、それはボディーであったり、エンジンであったり、タイヤであったり、サスペンションであったりする。
エンジンも細かく分けて行けばカムシャフトやら、ピストンやら、ブロックやらたくさんある。
それがプログラムで言うところの「メソッド」。
では、実際のコードでエンジンクラスを作っていきましょうかね。
engine.mと言うファイルを用意。
まず、Engineクラスを定義。
クラスの定義方法は
@interface 今回作るクラス名 : 親クラス @end
となる。
他の言語では親クラスを作ることも可能だけど、Objective-Cでは必ずNSObjectと言うクラスから読みに行かないといけないらしい。
なので、
@interface Engine : NSObject @end
と言う感じでいかがでしょうか?
次に、エンジンをスタートさせるstartEngineメソッドを定義。
メソッドの定義方法は
@interface 今回作るクラス名 : 親クラス - (型) 今回作るメソッド名; @end
と言った感じ。
なので、
@interface Engine : NSObject - (void) startEngine; @end
とでもしておきましょう。
実際に中身を書いてみることに。
中身を書く場所は
@implementation クラス名
- (型) メソッド名
{
プログラム...
}
@end
と言った感じ。
しょぼいけど、「エンジンがついたー」とだけメッセージを出す。。
@implementation Engine
- (void) startEngine
{
printf( "Start my engine!\n" );
}
@end
printfについてはCで使うやつと全く同じもので、コマンドラインに(正確には標準出力に?)文字をプリントする関数。
また、main関数はCやそれに影響を受けたC++、Java、Dなどと同様、ここがエントリーポイント(一番最初に読まれるところ)になる。
なので、main関数からこれらのクラスとメソッドを呼び出しましょう、と。
int main()
{
// idと言う型の変数を定義します
id obj;
// クラスのインスタンス化
obj = [[Engine alloc] init];
// EngineクラスのstartEngineメソッドを呼び出します
[obj startEngine];
return 0;
}
クラスを使えるようにすることをインスタンス化と言う。
このインスタンス化するためには入れ物、つまり変数が必要。
これをインスタンス変数と言う。
今のコードで言えば、id obj;と言うところ。
インスタンス変数は基本idと言う型なんだとか。
なので、なんにも考えず、id型で宣言しておく。
objはタダの変数なので、テキトーに名前を付けてもらってもOK。
まぁ、ルールはあるので数字で始まらない英数字程度にしておいて下さい、と。
// engine.m
#import <Foundation/NSObject.h>
#import <stdio.h>
@interface Engine : NSObject
- (void) startEngine;
@end
@implementation Engine
- (void) startEngine
{
printf( "Start my engine!\n" );
}
@end
int main()
{
// idと言う型の変数を定義します
id obj;
// クラスのインスタンス化
obj = [[Engine alloc] init];
// EngineクラスのstartEngineメソッドを呼び出します
[obj startEngine];
return 0;
}
以前に説明したかもしれないけど、#importで始まる2行はとても重要。
1行目はObjective-CがObjective-Cでいるために必要なコードを読み込んでいる。
2行目はCでよく使う標準I/Oと呼ばれるライブラリ。
printfと言う関数はまさにCのものなので、2行目が無いとエラーが出るはず。
結果はこんな感じ。
McLaren% gcc -o ../exe/engine engine.m -framework Foundation McLaren% ../exe/engine Start my engine!
くだらないとか言わないで下さい。。
今回はそんな感じ。
では〜。