連載:VB 6ユーザーのための
これならマスターできるVB 2005超入門

第9回 そろそろまじめにクラスに取り組んでみようか

羽山 博
2007/06/06
Page1 Page2 Page3 Page4

おまじないが多すぎる!

Back Issue
1
VB 6の皆さん、これはもうVB 2005使うしかないでしょ
2 コントロール配列がなくても大丈夫!
3 VB 2005の“My”の便利さに脱帽!
4 トラブルは水際で防げ〜入力時のチェックとエラー処理
5 データベースはじめの一歩
6 配列ってこんなに便利だったの!?
7 リソースを使ったマルチ・リンガルなVBアプリケーション
8 ファイル入出力をマスターしよう

 プログラミングの学習といえば、まず変数から始まって、演算や条件分岐、繰り返し処理、配列……と進むのが一般的。Visual Basicではフォームにコントロールを配置するだけでWindowsアプリーションが簡単に作成できるので、コントロールの配置やプロパティの設定などについても、初歩の段階で学ぶはずだ。Visual Basic 6までは、そういった知識を手に入れれば、曲がりなりにもプログラムが書けた。

 ところが、Visual Basic 2005(と.NET Frameworkのクラス・ライブラリ)を使ったプログラミングでは、そうはいかないこともある。確かに、簡単なプログラムならこれまでの延長で何とかなる。だが、ちょっと複雑なことをやろうとすると、いろんな「おまじない」が必要になってくる。

 例えば、Newキーワードがその1つ。この連載でも以前に取り上げたが、XMLドキュメントを扱うためには、

Dim doc As New XmlDocument

といった宣言が必要になる。教える方の立場からすると、この段階で「New」の説明をするのは大変なので「『おまじない』だと思って書いておくこと」と、できるだけさらっと流して済ませたいところだが、教わる方の立場からすると「Newを付けたり付けなかったりするのはなぜ?」とか「どんな場合にNewを付けるの」とか「そもそもNewって何?」という疑問が次々と浮かんできて、簡単に右から左へと受け流すわけにはいかないものだ。

 そういった問題が気になりだすともう止まらない。クラスからオブジェクトを作成し、プロパティやメソッドを利用する……といったことがおぼろげながらにも分かったら、今度は、作成したオブジェクトの名前を使う場合と、クラスの名前を使う場合があることに戸惑ってしまう。例えば、上のXmlDocumentクラスの場合は、

doc.GetElementsByTagName(……)

のように、「オブジェクト名.メソッド名」の形式で書くのに、Stringクラスの場合は、

String.Format(……)

のように「クラス名.メソッド名」と書くことがある。おまじないだと思って、場当たり的に「これはこうするもの」と覚えようとしても、早晩、胸のモヤモヤに耐えられなくなるだろう。

 今回は、そういったモヤモヤを解消して、気持ちよくコードが書けるようにしたい。そのためには、これまでできるだけ避けていた「クラス」の考え方に正面から取り組む必要がある。クラスが気になって、少しばかり勉強してみた人は「継承」だとか「抽象クラス」だとか「インターフェイス」といった用語に出合ったことがあると思う。そして、たいていの場合、考え方の複雑さにうんざりしたことと思う。

 だが、今回はそういう話はしないので安心してほしい。それ以前に、解消しておくべきモヤモヤの部分をきちんとクリアしておきたいと思う。クラスというのは、栄養価は極めて高いが、消化のすこぶる悪い食べ物のようなものだ。最初に、十分かみ砕いておかなければ、消化不良を起こして胃や腸を痛めてしまう。そうなると、先に進もうにも進めない(あるいは身に付く前に、素通りしてしまったりするかもしれない)。というわけで、できる限りゆっくりと進めたい。

値型と参照型の違いを知ろう

 多くのプログラミング言語では、オブジェクト指向の考え方や機能が、伝統的なプログラミング言語に追加されるような形で導入されてきたので、説明するときにも、一通りの言語要素を紹介した後、やおら「クラスとは……」「オブジェクトとは……」という流れになることが多い。だが、どうやらそういう説明の方法は実情にそぐわなくなってきたようだ。

 四則演算のプログラムだとか、数字を1から10まで足すプログラムだとか、いかにも勉強のためといった感じのプログラムであればそれでもいいのだが、少しばかり使えるプログラムを作ろうとすると、いきなりクラスやオブジェクトという用語に遭遇するのが普通だ。もしかすると、変数の説明をする段階で、「値型」と「参照型」について簡単に触れ、簡単なクラスについて知っておいた方が、後で感じるモヤモヤが少ないのではないかと最近は思っていたりする。

 そんなわけで、まずは変数に戻って、値型と参照型についての理解を深めたいと思う。

 「値型の変数」というのは、データを保持するための変数のことで、整数や構造体などがこれに当たる。イメージとしては図1のような感じになる。この型の変数については、以前からも使っているものなので、違和感を覚えることはないだろう。


図1 値型の変数
整数や構造体などは「値型の変数」と呼ばれ、その記憶域にはデータそのものが保持される。

 一方、「参照型の変数」には、データそのものではなく、データがどこにあるかという情報が保持される。文字列(String)や配列、クラス型などがこれに当たる。

 例えば、String型の変数を宣言すると、文字列データを入れるための領域が確保されるのではなく、文字列がどこにあるかという情報を保持するための領域が確保される(図2)。


図2 参照型の変数
文字列やクラスなどは参照型の変数と呼ばれ、その記憶域にはデータがどこにあるかという情報が保持される。そのような情報のことを「参照」と呼ぶ。C言語のポインタ変数と似ている。

 図2に示した「20」という数字そのものには特に意味がなく、「Hello」という文字列のある場所を示す番号だと考えてもらうといいだろう。その番号が、文字列を参照するための変数stに代入されるので、stに20が入るというわけだ。つまり、stの内容を見れば、文字列がどこにあるかが分かる。参照型の変数というのは、宝箱がどこにあるかを記した地図のようなものだと考えてもいい。

 ただし、20などという意味のない番号をいちいち書くのは面倒なので、代わりに、「参照」のイメージに合わせて、図3のように表すことも多い。このように表しておけば「変数を見れば、データがどこにあるかが分かる」というイメージがつかみやすくなるだろう。


図3 参照を分かりやすく示した図
変数に文字列などのデータそのものが入っているのではなく「参照」が入っていることがよく分かる。参照先に実際のデータが保持されている。

 「値型と参照型は分かったが、じゃあそれがクラスと一体どういう関係があるの」と思った方も多いだろう。確かに、これだけを見れば、クラスそのものとは関係が薄いように思われる。だが、実はこれを理解しておくことが後々ボディブローのように効いてくる。値型と参照型の違いを詳しく説明したのはそういうわけだ(さらっと読み流してしまった人はもう一度ここまでの内容を読み直してきちんと理解しておこう)。

 そしてそのうえで、クラスを見ていくと分かりやすくなるはずだ。ただし、あまり説明ばかり続いても退屈なので、次は実際にプログラムを作りながら見ていくこととする。


 INDEX
  連載:VB 6ユーザーのためのこれならマスターできるVB 2005超入門
  第9回 そろそろまじめにクラスに取り組んでみようか
  1.値型と参照型の違いを知ろう
    2.サンプル・プログラム13 − クラスとオブジェクトを理解するためのプログラム
    3.クラスからオブジェクトを作成/共通に使えるプロシージャ
    4.少しだけ背伸びしてオーバーロード
 
インデックス・ページヘ  「これならマスターできるVB 2005超入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH