Objective-Cのお勉強 #1 簡単なクラスとメソッドの説明


今回は「クラス」と「メソッド」と言うものについて勉強して行こうじゃないですか、と。
まず、クラスと言うものは、プログラムの部品だと思って下さい。
オイラは自動車が好きなのでそれで例える。

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!

くだらないとか言わないで下さい。。

今回はそんな感じ。

では〜。

Post to Twitter

, , , ,

  1. No comments yet.
(will not be published)