Personクラスに「属性」(状態)を定義しましょう。
ここでいう「属性」のことをObjective-Cでは、「メンバー変数」といいます。ここでは、名前と年齢を定義します。Person.hを開き、以下のように記述します。
#import <Foundation/Foundation.h> @interface Person : NSObject { // 名前 NSString *_name; // 年齢 NSInteger _age; } @end
説明するまでもないですが、変数「_name」は名前、変数「_age」は年齢を表しています。名前は文字列ですからNSString型、年齢は整数ですからNSInteger型です。なぜ「_」が付いているかについては、後で説明しますので、今は気にしないでください。
これでメンバー変数の定義は完了です。
Objective-Cでは、「操作」(振る舞い)のことを「メソッド」と呼びます。Personクラスにメソッドを定義しましょう。ここでは、自分の名前と年齢を設定・取得するメソッドを定義します。Person.hとPerson.mを以下のように記述します。
#import <Foundation/Foundation.h> @interface Person : NSObject { // 名前 NSString *_name; // 年齢 NSInteger _age; } // 名前を取得する - (NSString *)name; // 名前を設定する - (void)setName:(NSString *)name; // 年齢を取得する - (NSInteger)age; // 年齢を設定する - (void)setAge:(NSInteger)age; @end
#import "Person.h" @implementation Person // 名前を取得する - (NSString *)name { return _name; } // 名前を設定する - (void)setName:(NSString *)name { _name = name; } // 年齢を取得する - (NSInteger)age { return _age; } // 年齢を設定する - (void)setAge:(NSInteger)age { _age = age; } @end
これでメソッドの定義は完了です。
それでは、このクラスを使ってみましょう。ViewController.mを開き、以下のように書き換えます。
#import "ViewController.h" // Personクラスをインポートする #import "Person.h" @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Personクラスのインスタンスを生成する Person *yuki = [[Person alloc] init]; // 名前を設定する [yuki setName:@"平井祐樹"]; // 年齢を設定する [yuki setAge:28]; // 名前と年齢をコンソールに表示する NSLog(@"こんにちは、私の名前は%@です。年齢は%d歳です。", [yuki name], [yuki age]); } @end
実行すると、コンソールに下記のように表示されます。
実は、ここでオブジェクトの4つの特性の1つである「アイデンティティ」が表現されていました。13行目の「Person *person = [[Person alloc] init];」です。
このプログラムは「メモリに領域を確保して、初期化したPersonクラスのインスタンスを保持する」ということを行っています。これにより、オブジェクトは「メモリ上のアドレス」というアイデンティティを得ることができたのです。
また、16行目に[yuki setName:@"平井祐樹"]、22行目に[yuki name]とあります。このことを「ViewControllerクラスのインスタンスからPersonのインスタンスにメッセージを送信する」と表現します。
オブジェクトの4つの特性の最後の1つである「関係」を定義してみましょう。
ここでは、Personクラスに父親を表すメンバー変数「father」を追加します。父親は当然人間ですから、fatherはPersonクラスです。
Person.hとPerson.mを以下のように変更します。
#import <Foundation/Foundation.h> @interface Person : NSObject { // 名前 NSString *_name; // 年齢 NSInteger _age; // 父親 Person *_father; } // 名前を取得する - (NSString *)name; // 名前を設定する - (void)setName:(NSString *)name; // 年齢を取得する - (NSInteger)age; // 年齢を設定する - (void)setAge:(NSInteger)age; // 父親を取得する - (Person *)father; // 父親を設定する - (void)setFather:(Person *)father; @end
#import "Person.h" @implementation Person // 名前を取得する - (NSString *)name { return _name; } // 名前を設定する - (void)setName:(NSString *)name { _name = name; } // 年齢を取得する - (NSInteger)age { return _age; } // 年齢を設定する - (void)setAge:(NSInteger)age { _age = age; } // 父親を取得する - (Person *)father { return _father; } // 父親を設定する - (void)setFather:(Person *)father { _father = father; } @end
最後にViewController.mを以下のように変更します。
#import "ViewController.h" // Personクラスをインポートする #import "Person.h" @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Personクラスのインスタンスを生成する Person * yuki = [[Person alloc] init]; // 名前を設定する [yuki setName:@"平井祐樹"]; // 年齢を設定する [yuki setAge:28]; // 父親インスタンスを作成する Person *father = [[Person alloc] init]; // 名前を設定する [father setName:@"平井太郎"]; // 年齢を設定する [father setAge:56]; // fatherインスタンスをyukiインスタンスに設定する [yuki setFather:father]; // 名前と年齢と父親の名前をコンソールに表示する NSLog(@"こんにちは、私の名前は%@です。年齢は%d歳です。父親の名前は%@です。", [yuki name], [yuki age], [[yuki father] name]); } @end
実行すると、コンソールに以下のように表示されます。
このようにObjective-Cでは、オブジェクトの4つの特性を表現できることが分かります。
Copyright © ITmedia, Inc. All Rights Reserved.