OOPは,「Object Oriented Programming」すなわち「オブジェクト指向プログラミング」の略語です。OOPは,1970年代に考案されたプログラミング手法ですが,最近になって再び注目を集めています。注目されているだけでなく,OOPを避けて通ることができない状況になっています。なぜなら,今後主流となりそうなプログラミング環境の選択肢が,UNIX系OS上のJavaか,Windows上の .NETのいずれかだからです。

 Java環境でも .NET環境でも,利用できるプログラミング言語はすべてOOP言語です(JavaではJava言語が使われ,.NETではVisual C#,Visual Basic .NET,Visual C++ .NETなどが使われます)。どちらの環境を選んだとしても,OOPがわからないでは済まされません。

 皆さんの中には,OOPに対して「難しくて理解できない」とか「覚えることが多くて面倒」といった印象を持っている人が多いのではないでしょうか。どうぞご心配なく。この連載では,OOPの基本的な考え方を,徹底的に初歩から,できるだけ少ないページ数で提供します。第1回目のテーマは,クラスです。クラスは,OOPの基本中の基本となるものです。クラスがわかれば,OOPが見えてきます。それでは,始めましょう!

そもそもプログラムとは何か?

 クラスの説明をする前に「そもそもプログラムとは何なのか」をハッキリさせておきたいと思います。この疑問への答えが,クラスやOOPを理解するための大前提知識となるからです。答えは,二つあります。

 一つ目の答えは,どのような手法で作成したとしても「プログラムとは,命令とデータの集合体にすぎない」ということです。命令とは「○○せよ」という動作をコンピュータに指示するものです。データとは「△△を」という命令の対象のことです。したがって,プログラムとは「△△を○○せよ」を羅列したものとなります。このことには,納得していただけますね。

リスト1●C 言語で記述したプログラム
図1●クラスは関数と変数をグループ化する
リスト2●Javaで記述したクラスの例
図2●再利用しやすく保守しやすいクラスを作ろう

 C言語は,非OOP言語(言語仕様でOOPをサポートしていない言語)です。C言語の構文では,命令を「関数」で表し,データを「変数」で表します。したがって,C言語を使うプログラマから見れば「プログラムは,関数と変数の集合体にすぎない」ということになります。リスト1[拡大表示]は,C言語のプログラムの例です(このプログラムの内容に意味はありません)。myValueという変数とmyFuncという関数がありますね。

 「そもそもプログラムとは何なのか」という疑問に対する二つ目の答えは「プログラムとは,現実世界の業務や遊びをコンピュータ上に置き換えるものだ」ということです。コンピュータというものは,それ自体に特定の用途があるわけではありません。コンピュータは,現実世界のさまざまな業務や遊びを効率的に処理するための道具なのです。コンピュータを特定の業務や遊びで使うためには,それぞれ専用のプログラムの作成が必要になります。

【ここまでのまとめ】
・プログラムは,関数と変数の集合体である。
・プログラムは,現実世界の業務や遊びをコンピュータ上に置き換えるものである。

OOPの基本はクラス

 大前提となる知識をご理解いただいたところで,いよいよクラスとは何かを説明しましょう。クラスとは「関数と変数をグループにまとめて名前を付けたもの」です。これだけのことなのですが,C言語などの非OOP言語だけを使ってきたプログラマにしてみれば,大きなパラダイム・シフトだと感じるはずです。なぜなら,従来のプログラムの構成要素は関数と変数だけだったのに,突然クラスという新しい概念が追加されたからです。

 クラスによってOOPが実現できます。クラスを定義できる構文を備えたプログラミング言語をOOP言語と呼びます。現在主流となっているJava,Visual C#,Visual Basic .NET,Visual C++ .NETなどは,どれもOOP言語です。それに対して,非OOP言語と呼ばれるものには,C言語,COBOL*1,FORTRANなどがあります。古いプログラミング言語のほとんどが非OOP言語であり,新しいプログラミング言語の多くはOOP言語なのですから,最近の流行はOOP言語だと言えるでしょう。

 ところで,なぜクラスという概念を追加したOOP言語が必要になったのでしょう?それは,コンピュータが高性能化かつ低価格化するのに伴って,より複雑な業務や遊びをコンピュータ上に置き換えるようになり,結果としてプログラムの規模が大きくなってしまったからです。非OOP言語で大規模なプログラムを作ると,膨大な数の関数と変数の集合体になります。

 もし皆さんが「関数500個と変数1000個」というプログラムの設計書を渡されたらどう思いますか? とても複雑そうで,作るのが嫌になってしまうかもしれません。同じ規模のプログラムを50個のクラスでグループ化してみましょう。「クラス50個で,個々のクラスに関数10個と変数20個」という設計書になります。この程度の複雑さなら,作る気にもなれますね。

 OOPは,大規模なプログラムの作成に適したプログラミング手法なのです。雑誌や書籍に掲載されているような短いサンプル・プログラムでOOPのメリットを実感するのは無理なことです。この連載をお読みいただいている間は,常に大規模なプログラムをイメージしてください。クラスによって,大規模なプログラムの複雑さが軽減されるのです。ただし,クラスという概念が追加されても,プログラムが命令とデータの集合体であることに変わりはありません。膨大な数の命令(関数)とデータ(変数)が,クラスというグループで整理されるのです(図1[拡大表示])。

 「いやいや,クラスを定義できない非OOP言語であっても,関数と変数をグループに分けて設計すれば複雑にはならない」とおっしゃる人もいるでしょう。確かにその通りかもしれませんが,それは紙の上の設計時点の話です。プログラムを打ち込む時点では,関数と変数の羅列になってしまいます。OOP言語では,言語構文として関数と変数をグループ化するクラスを定義できることに大きな意味があるのです。人間だけでなく,コンパイラもクラスを認識し,クラスを単位として便利な機能を数多く提供してくれます。どのように便利な機能があるのかは,この連載の第2回で紹介します。

 リスト2[拡大表示]は,OOP言語であるJavaでクラスを定義した例です。classというキーワードに続けてクラスの名前(ここではMyClass)を記述します。クラスの範囲は「{」と「}」で囲んで示し,その中にグループ化される変数と関数(ここではmyValueとmyFunc)を記述します。グループ化された変数と関数のことをまとめて「メンバー(member)*2」と称します。クラスの構成要素というわけです。この連載は,C言語やJavaの言語構文がテーマではありません。何らかのサンプルプログラムが掲載された場合は,雰囲気だけ感じていただければOKです。

【ここまでのまとめ】
・クラスとは,関数と変数をグループにまとめて名前を付けたものである。
・OOPは,大規模なプログラムの作成に適したプログラミング手法である。

OOPのメリット

 OOPのメリットは,大きく分けて二つあります。一つは「大規模なプログラムを効率的に作れること」です。もう一つは「大規模なプログラムを容易に保守(改造や修正)できること」です。もっとわかりやすく言えば,OOPのメリットとは「大規模なプログラムの開発時間と保守時間を短縮できること」です。企業においては,時間=費用です。したがって,企業の特にマネジャ層の人たちは,OOPが何だかわからなくても,経費削減できるとあればOOPを採用したがります。ただし,注意が必要です。OOPのメリットを享受できるのは,クラスの分け方が適切だった場合だけだからです。

 マネジャ層の人たちとは逆に,開発の現場ではOOPが敬遠されている場合が多いようです。なぜでしょうか? クラスを記述するのが面倒だからです。先ほどのC言語とJavaのサンプル・プログラムを見比べればわかると思いますが,クラスを定義する分だけ,OOP言語のJavaの方が非OOP言語のC言語よりプログラムの打ち込み量が多くなります。

 あれあれ,これではOOPによる開発が効率的だということと矛盾しますね。実は,初めてOOPを採用した開発プロジェクトは,効率的とならない場合が多いのです。過去のプロジェクトで作成したクラスを新たなプロジェクトで再利用してこそ,効率的な開発が実現するのです。ただし,初めてのOOPであっても保守性は向上します。クラスの単位で保守ができるからです。OOPと聞くと,ついつい開発効率に注目しがちですが,保守性にも大いに注目してください。

 ここまで説明を読んで,クラスに関してとても重要なポイントが見えてきたでしょう。大規模なプログラムをクラスでグループ化するときには「クラスをほかのプログラムで再利用できること」,そして「クラスの単位で保守できること」を目指すのです。皆さんの多くは,プロのプログラマでしょう。プロなら,OOPのメリットを理解し,仕事で結果を出してください。そのためには,再利用しやすく保守しやすいクラスを作って,経費を削減するのです(図2[拡大表示])。

【ここまでのまとめ】
・OOPのメリットは,プログラミングの効率化と保守性の向上である。
・再利用しやすく保守しやすいようにクラスを分けることが重要である。

【おわびと訂正】
記事掲載当初,「C言語は,非OOP言語(OOPが実現できない言語)」としましたが,正しくは「C言語は,非OOP言語(言語仕様でOOPをサポートしていない言語)」です。おわびして訂正します。