iOSアプリ開発初心者のためのオブジェクト指向の基本iOS SDKで始めるObjective-C入門(6)(2/4 ページ)

» 2014年03月17日 18時00分 公開
[平井祐樹,クラスメソッド]

「属性」(メンバー変数)を定義してみよう

 Personクラスに「属性」(状態)を定義しましょう。

オブジェクトの「属性」(状態)と「操作」(振る舞い)(記事「オブジェクトに必要な4つの特性とは?」より引用)

 ここでいう「属性」のことをObjective-Cでは、「メンバー変数」といいます。ここでは、名前と年齢を定義します。Person.hを開き、以下のように記述します。

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
    // 名前
    NSString *_name;
    
    // 年齢
    NSInteger _age;
}
@end
リスト1 Person.h

 説明するまでもないですが、変数「_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
リスト2 Person.h
#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
リスト3 Person.m

 これでメソッドの定義は完了です。

作成したクラスを使って「アイデンティティ」を表現する

 それでは、このクラスを使ってみましょう。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 ViewController.m

 実行すると、コンソールに下記のように表示されます。

 実は、ここでオブジェクトの4つの特性の1つである「アイデンティティ」が表現されていました。13行目の「Person *person = [[Person alloc] init];」です。

 このプログラムは「メモリに領域を確保して、初期化したPersonクラスのインスタンスを保持する」ということを行っています。これにより、オブジェクトは「メモリ上のアドレス」というアイデンティティを得ることができたのです。

 また、16行目に[yuki setName:@"平井祐樹"]、22行目に[yuki name]とあります。このことを「ViewControllerクラスのインスタンスからPersonのインスタンスにメッセージを送信する」と表現します。

「関係」を定義しよう

 オブジェクトの4つの特性の最後の1つである「関係」を定義してみましょう。

オブジェクトの関係(記事「オブジェクトに必要な4つの特性とは?」より引用)

 ここでは、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
リスト5 Person.h
#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
リスト6 Person.m

 最後に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
リスト7 ViewController.m

 実行すると、コンソールに以下のように表示されます。

 このようにObjective-Cでは、オブジェクトの4つの特性を表現できることが分かります。

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。