SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Cでわかるオブジェクト指向

【第1回】オブジェクトとクラス


オブジェクト指向の基本−オブジェクト

オブジェクトとメッセージ

 まず、オブジェクト指向の基本は何と言っても「オブジェクト(object)」です。オブジェクトは、オブジェクト指向における中心的な概念です。では、オブジェクトとは一体どのようなものでしょうか。その特徴を簡単にまとめると次のようになります。

  1. すべての情報はオブジェクトによって表現される
  2. オブジェクトは「自身に関する独自の情報(属性)」と「機能(振る舞い)」から構成され、それらをオブジェクト自身で管理する
  3. オブジェクト間の相互作用はメッセージによって実現する

 そんなに難しくないですね。メッセージという新しい概念が出てきましたが、メッセージとは、オブジェクト同士のコミュニケーションの手段を抽象化した概念です。また、メッセージを受け取ってオブジェクトが行う処理の実体のことを「メソッド(method)」と呼びます。オブジェクトとメッセージにとって構成されるシステムのイメージを図2に示します。

図2:オブジェクト指向の概念イメージ
図2:オブジェクト指向の概念イメージ

 このような考え方に基づいてプログラミングするメリットとは何でしょうか。オブジェクト指向の説明は現実世界の比喩から始まることが多いようですが、OOPで考えた場合には非常にシンプルになります。「プログラムとは処理とデータの組み合わせなのだから、それらの関連を明示的に示し、かつそれらへのアクセスを限定的にすることで、より安全にプログラムを取り扱おう」ということです。C言語でプログラミングする際には、普通に考慮することですね。例えば、ファイルスコープを利用して、処理とデータを1つの固まりとする方法などはよく行われているかもしれません。これを、オブジェクトとメッセージによって実現していくプログラミング手法がOOPなのです。

 それではさっそく、オブジェクトとメッセージの概念をC言語を使って表現してみましょう(リスト1)。

リスト1:オブジェクトとメッセージの概念をC言語を使って表現(oop1.c)
#include <stdio.h>

/* Objectオブジェクトの定義・生成 */
int Object_method(void);
struct _object{
    char *name;
    int status;
    int (*message)(void);
}obj = {"obj", 10, Object_method};

/* メソッドの実装 */
int Object_method(void)
{
    printf("%s.status = %d\n", obj.name, obj.status);
    return 1;
}

/* エントリポイント */
int main(int argc, char *argv[])
{
    /* オブジェクトにメッセージを送信 */
    obj.message();
    return 1;
}

 まず、objという名前のオブジェクトを、_object構造体を利用して定義・生成しています。次に、objオブジェクトが受け取ることができるメッセージmessageを、_object構造体のメンバの関数ポインタとして定義しています。また、メッセージを受け取って実際に行う処理をObject_method関数として定義し、オブジェクトの生成時にmessageにこのObject_method関数を指定することで、メッセージとメソッドの対応付けを行っています。最後に、main関数から、生成したオブジェクトにメッセージを送信しています。

 このコードでのポイントは、以下の3点です。

  1. オブジェクトを構造体として表現している
  2. メッセージを関数ポインタとして定義している
  3. オブジェクトの生成時に具体的なオブジェクトの情報(データの値やメッセージに対応するメソッド)がセットされている

 つまり、OOPにおけるオブジェクトとは、データと処理が格納されたメモリ領域に名前を付けたものなのです。リスト1では、データ(*name、status)と処理(Object_methodへの参照)を持つオブジェクト(obj)を構造体(_object)として表現することで、1.を実現しています。また2.のように、関数ポインタ(*message)を用いることでメッセージとメソッドの関係を表現しています。

 リスト1の実行結果は、次のようになります。

>gcc oop1.c
>./a.out
obj.status = 10

 簡単なコードではありますが、OOPの基本的な概念を実装するとどのようなものになるのかが確認できたかと思います。

次のページ
オブジェクト指向の基本−クラス

この記事は参考になりましたか?

Cでわかるオブジェクト指向連載記事一覧

もっと読む

この記事の著者

島田 浩二(Ruby札幌)(シマダ コウジ)

1978年生まれ。電気通信大学電気通信学部情報工学科卒業後、メーカ系ソフトウェア会社にて携帯電話の開発業務に従事した後、2006年より札幌にてフリーのプログラマとして活動。2009年7月に株式会社えにしテックを設立し、同社代表取締役に就任。 日本Rubyの会理事、一般社団法人LOCAL理事、Ruby札幌主宰。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3706 2009/03/17 12:59

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー