Java講座序章「プログラムって何だろう」

〜伝説は始まった〜

はね:それでは「プログラムって何だろう」編をはじめまーす。

トモ:ヤッホーィ!

はね:・・・・・・・。

トモ:なんだよ、そのテンションは。もっとあげていこー!イェーイ!

はね:・・・・・・・。

トモ:ねぇ、一人で盛り上がってくると悲しくなってくるじゃない・・・。

はね:わかったよ。盛り上がっていこうぜ!イェーイ!

トモ:よっしゃぁ、いぇーい!


はね:さて、中途半端な前フリが終わったところで本当に講座に入ります。

トモ:本当に中途半端だったな。多分、これ見た人のうち半分は引いたぞ。

はね:それを言うでない。ちなみに本講座はわたくし、「はね」と、

トモ:わたし、「トモ」でお送りしまーす。

はね:ちなみに最初の予定では顔絵がつく予定だったのですが、「マウスオンリーでは絵なんか書けるか、グォー!」という作者のクレイジーにより、文字だけでお送りさせていただきます。

トモ:全国5億人のトモちゃんファンの皆さんごめんねー!

はね:(無視)。今回の講座は「プログラミングってやってみたいけどぜんぜん分かんない。」「そもそもプログラムって何?」というレベルの方向けに作ってあります。なので他のプログラミング言語を学んでおられる方は読まなくても全然問題ないと思います。

トモ:でも、最後の「オブジェクト指向とは?」だけは読んでも損は無いと思うよー。

はね:なお、作者の好みからこのような対話形式をとっていますが、こーいうのが嫌いな人は他のところにどうぞ。

トモ:やっぱ自分にあわないのはダメだよねー。

はね:ということで、引き返すなら今のうち。Java講座の始まりです。

プログラムってなんだ?

トモ:はねクン、はねクン、プログラムって何?

はね:いきなり核心をつくね、君は。

トモ:だって、プログラムってよく聞くけど実際どんなもんなのかわかんないじゃない。

はね:はっきりいって「プログラム」とは何か、というのは答えにくい質問なのだ。どの分野でもそうなんじゃないかと思うんだけれども、基本的な事こそあまりに基本的すぎて説明しずらい。場合によっては良く分かってないことが多いんだな。

トモ:じゃぁ、プログラムって何?っていう質問には答えられないってこと?

はね:うーん。簡単に言えばプログラムというのはみんなが普通に使っているアプリケーションソフトのことだ。アプリケーションソフトと面倒な言い方をしたけれども、要はこのページを見るのに使っているInternetExproler等のブラウザやOutlook等のメーラー、マインスイーパーやソリティアのようなゲーム、あるいはWindowsやLinux等のOSもプログラムと言えるだろう。

トモ:つまりは「ソフト」のことがプログラムってことね。

プログラミングってナンダ?

トモ:じゃあ、プログラミングって何?

はね:プログラミングってのはそのまんまプログラムを組む事だ。実際にはプログラム(すなわちソフトウェア)の設計図であるソースコードを書くことなんだけどね。ソースコードのことを簡単にソースということも多い。

トモ:プログラムを書くとも言うよね。

はね:他にもいろいろな言い方はあるだろうけど、それは言い方の違いに過ぎないと思うよ。ただ、注意して欲しいのはプログラムの作り方、つまりプログラミングの方法は一つじゃないってことだ。

トモ:どういう意味?

はね:「プログラミング言語」っていう言葉は聞いたことがあるよね?これは「プログラムを組むためのプログラム」なんだ。このプログラミング言語にはいろいろな種類があるから、どの言語を選ぶかによってもプログラミングの方法は多少変わってくるというわけ。

トモ:たとえばどんなのがあるの?

はね:それは次で紹介しよう。

プログラミング言語の種類

はね:プログラミング言語には古い方から順に、機械語(マシン語とも言う)、アセンブリ言語高級言語(高水準言語とも言います)、第4世代言語、がある。機械語に近いほどコンピュータに直接指示が出せるので、細かいプログラムが組めるが、その分、プログラミングの労力は非常に大きい。

トモ:コンピュータに直接指示が出せるってのはどういう意味?

はね:機械語はCPU(Central Processing Unit 中央処理装置、コンピュータの処理の中核)が直接理解できる言語だ。つまり、CPUに直接命令を出せるわけだ。ただ機械語はCPUが直接理解できる形式、すなわち2進数や16進数を使って表されていたため、人間には非常に理解しがたいものだった。そのために機械語のそれぞれを人間に理解しやすい英字で置き換えたのがアセンブリ言語だ。機械語とアセンブリ言語は1対1に対応しているから、アセンブリ言語を用いてもCPUに直接指示が出せる。

トモ:ということは、機械語とアセンブリ言語以外はCPUに直接指示が出せないっていうこと?

はね:そういうことになるな。高級言語の1命令には複数の機械語が対応している。第4世代言語については私自身よく分からないのでなんとも言えないが、機械語を第1世代、アセンブリ言語を第2世代、高級言語を第3世代と言うことからその名がついているようだ。。

はね:ちなみにこの講座で紹介していくJavaは高級言語になる。高級言語としてはJavaの他にC言語やその上位のC++C#、あるいは科学技術で使われるFORTRANなども含まれる。基本的に機械語とアセンブリ言語以外のプログラミング言語は全て高級言語と考えていいだろう。

はね:また、上で紹介した各言語ではOSに依存して実行が可能なソフトウェア(要は普通のソフトウェア)が作れるが、それに対してある特定のソフト上でのみ実行が可能なスクリプト言語というものがある。スクリプト言語の代表はJavaScriptだな。

トモ:私が口を挟む余裕がない・・・。

2進数、8進数、16進数?

トモ:さっき話の中で出てきた2進数とか16進数って何じゃ?

はね:我々が普段使っているのは10進数だろう。1,2,3、、、と数えていき10まで数えると桁が上がる。

トモ:じゃぁ、2進数は2数えると桁が上がるってこと?

はね:その通り。2進数では0から数えて,0、1、10、11、100、101、、、と続いていく。ちなみに読み方は、ぜろ、いち、いちまる、いちいち、いちまるまる、、、だ。間違っても、じゅう、と読んじゃいかんぞ。

トモ:じゃぁ、16進数は16数えると桁が上がるんだな。簡単、簡単。1,2,3、、、、って9までしか数字がないから桁が上がってしまうぞ!

はね:だから16進数ではABCDEFという英字を使うんだ。9の次はA、B、C、D、E、F、10、11、、、、1A、1B、、、1F、20、21、、、と数える。

トモ:なるほどにゃぁ。でも何でこんな面倒なことするんだ?

はね:人間にとっては面倒でもコンピュータにとってはこっちの方が楽なのだよ。コンピュータはYesかNoか、0か1かで判断する。2進数も16進数も2の倍数だろう。それと同じ理由で8進数が使われることもある。こちらは0、1、2、、、7、8、10、11、、、と数える。

トモ:それも、ぜろ、いち、に、、、はち、いちまる、いちいち、、、って数えるんだな。

はね:癪に障るが、正解だと認めてやろう。

トモ:いや、意味分からんし。

基本は2進数で、8進数や16進数を使うのは人が見た時に分かりやすいようにするためです。たとえば、10進数の「255」は2進数だと「11111111」となってわかりづらいですが、16進数だと「FF」と非常に分かりやすくなります。この表記はHTML(簡単に言えば、ホームページを作るときの言語)でよく使われるのでご存知の方も多いはず。といっても、実際のプログラミングでは2進数、8進数、16進数を直接に使うことはほとんどありません。

プログラミングの流れ

はね:プログラミング言語の種類はいろいろあるが、基本的なプログラム作成の流れはほとんど同じだ。高水準言語の場合の簡単な流れを以下に示す。

ソースコードを作成

コンパイラというソフトを使って機械語に翻訳(コンパイル)

実行ファイル(要は普通のソフト)が完成!

実際の作業ではデバッグ(バグつぶし)が入ります。

トモ:ソースコードってなんだ?

はね:ソースコードと言うのは、いわばプログラムの設計図。プログラマーはこのソースコードを書くわけだ。一応Javaの場合の簡単なソースコードを下に書いとこう。意味はそのうち分かるから気にするな。

public class HelloWorld {
        pubic static void main(String[] args) {
                System.out.println("Hello world");
        }
}

トモ:これはどんな操作をするんじゃ?

はね:後で分かるっちゅうのに・・・話を聞いとれ。だが、一応説明すれば画面に「Hello world」と表示するだけのプログラムだ。

トモ:なんだつまらん。もっと超大作ゲームのソースコードとか載っけやがれってんだ、こんちくしょうめ。

はね:載せてもいいが、何千、何万行という膨大な量になるぞ。

トモ:・・・。

はね:簡単なブロック崩しのプログラムでも300行程度だ。ソフトウェアというのは膨大な命令の集まりだと言うことが分かるだろう。しかも、高級言語の命令は一つにつき複数の機械語に対応しているからまだマシで、アセンブリでプログラムなんか書いた日にゃあ・・・。

トモ:なんか、めまいが・・・。私、プログラミング学ぶのもういいデス。

はね:マテマテ。慣れればたいした事は無いし、何よりプログラミングというのはとても楽しい作業なんだ。

トモ:そうか。それにしてもプログラマーってのはすごいもんだな。

はね:どんな仕事でも大変なもんさ。

変数ってなんじゃ?

はね:どんな言語でプログラムを書くにしても避けては通れない話題、変数についての話だ。

巷のプログラミング講座では「変数は初心者がなかなか理解できないところである」みたいなことがよく書かれている気がします。個人的にはつまずくこともなく自然と入れた(ような気がする、もう覚えてないけど)ので特別難しい事はないと思うのですが・・・。変数よりもオブジェクト指向という概念の方が100倍難しい。(と言っても、オブジェクト指向も常人には理解できないというほど難しいものでもないのですが。)多分、変数は、自分で一回使わないと分からないけれども、一回やってみればすぐに分かる、という類のものなのだと思います。初心者が変数を分からないのは目で読むだけで理解しようとしているせいなんじゃないかな、と。

はね:変数というのは、値を保存しておくための容器だ。はい、終わり。

トモ:いつにもまして適当だな。

はね:まぁね。実際、変数については自分で使ってみないと分からないし。とにかく、プログラミングにおける変数というのは、(数学の変数とは違って)、値を保持するためのものだと考えてくれ。

トモ:変数について詳しくは、また次の機会にね。

JavaってNANDA?

はね:さて、本講座で扱うプログラミング言語「Java」について説明しようかね。

トモ:おお。やっとか。待ちくたびれたぞ、じいや。

はね:誰がじいやだ。さて、簡単に言ってしまえば、Javaとはフリーのプログラミング言語だ。これを知っておけば十分。さて次の項へ移ろう。

トモ:ちょっと待てーい。いくらなんでも簡単すぎるだろうが。

はね:何を言う。フリー、すなわちタダ。お金を払わなくても利用できる。これだけ知っておけば、後は必要なものなど何もあるまい!

トモ:いや、そこまでフリーである事を強調する意味が分からんし。

はね:バ、バ、バババ、バババババ、バッカモーーーーーーーーン!!貴様のような奴は廊下に立っとれーーーーーーーい!!!!

トモ:ひぃ。

はね:良いか。現在、アプリケーション開発で最主流のC++なんぞ、開発環境(プログラムを組むのに必要なソフトウェア等)だけで何万もするんだぞ。VisualBasicもそんなもんだ。にもかかわらず、Javaを無償で配布したSunに申し訳ないと思わんのかぁ!

Javaの開発・配布はSun microsystems(日本語ページ)が行っています。ちなみにJavaはIDE(総合開発環境)なんかも無償で提供されています。これも買えば何万ですが、おそらくSunが最初にJavaを無償提供したためでしょう、多くのJava用のIDEはオープンソースとなって世界中の有志によって開発、無償配布されています。。Java使いはSunに足を向けては眠れないという・・・。いや、私は全然気にしてませんが。

※オープンソース・・・プログラムの設計図であるソースコードが公開されていること。

トモ:Borland C++ Compilerの無償ダウンロードあるけど?

はね:・・・・。・・・あぁ、まぁ、なんだぁ、その、すまん。知らんかった。

C++は、70年代に米国ベル研究所で開発されたC言語にオブジェクト指向を加えた言語。ほとんどのアプリケーションはこの言語で作られている気がする。最近はJavaを意識した仕組みのC#という言語もあるらしい。なお、オブジェクト指向についてはこのページ下部を参照。ちなみにC#はMicrosoftが開発。

VisualBasicはMicrosoft者が開発した言語。なんか、フォームを組み合わせて視覚的にソフトウェアが作れるらしい。開発環境が何万もして最初から眼中に無かったので、詳しい事は知らん。

トモ:まぁ、いいよ。とりあえず、タダってのは素晴らしいよね。

はね:分かってくれたか、同志よ。

トモ:はいはい、そういうことにしとくよ。それで、他には?

はね:何がだ、同志よ。

トモ:いや、もういいっちゅうの。だから、他にはJavaについて知っといた方がいいことってのは無いの?

はね:うーん、実際タダだってことだけ知ってれば十分な気がするしなぁ。あ、そうだ。大切な事が2つあった。

トモ:2つもかよ。

はね:まず、一つ目はオブジェクト指向言語だっていうこと。これについては下記参照。

トモ:二つ目は?

はね:二つ目は、これがJavaの最も大きな特徴なんだけども、Write Once Run Anywhere、WORAとも言うべ。

トモ:一度書いたらどこでも走る?Javaってマラソン選手なのか?

はね:違うわ。runには「実行する」っていう意味があるだろう。辞書引いてみ。

トモ:あ、本当だ。あった気がする。

はね:気がする、の意味がわからんが、つまり、Javaというのは一度プログラムを書いたら、どんな環境でも、つまりWindowsでもMacでも動くということだ。

トモ:スーパーコンピュータでもか?

はね:原理上は動くらしい。ちなみに携帯のゲームもJavaで作られている。

トモ:あれ?でもわざわざどんな環境でも動くことを強調するってことは、他の言語で書かれたプログラムは環境が違えば動かないってことだよね?

はね:そうだ。たとえばWindowsのプログラムは普通、Macでは動かない。このページの最初の方で機械語と高水準言語についての話をしただろう。

トモ:0か1かの世界だにゃ。

はね:JavaとC#以外の高級言語で書かれたプログラムは、コンパイラというソフトウェアによって機械語に翻訳される(この作業をコンパイルと言います)。コンピュータが理解できるのは機械語だけだから、コンピュータの理解できる形式に直してやらないといけないわけだ。そしてこの機械語はコンピュータ、正確にはCPUによって異なっている。

トモ:にゃるほどな。WindowsとMacではCPUが違うんだな。

はね:WindowsはIntel社が開発したPentium系列。MacはApple、IBM、モトローラの3社の提携によって開発されたPowerPC系列と呼ばれるCPUを使っている。

トモ:じゃあ、Javaの場合はどうやってWrite Once Run Anywhereを実現しているんだ?

はね:Javaの場合はソースコードはいったんJavaバイトコードと呼ばれる中間コードに変換される。実行時にはJava仮想マシン(Java Virtual Machine、JVM)と呼ばれるソフトウェアが、Javaバイトコードを各環境に対応した形式(ネイティブコード)に変換して実行している。Java仮想マシンは各環境(プラットフォーム)ごとに作られているから、いわば、環境の違いをJava仮想マシンが吸収してくれるわけだ。

トモ:ネイティブコードって言うのは何じゃ?機械語と同じか?

はね:同じだ。英語で言うなら・・・It's the same as ・・・。

トモ:分からないくせに無理するにゃ。C#ってのの場合はどうなるんにゃ?

はね:・・・。C#の場合もJavaと基本は同じだ。MSIL(Microsoft Intermediate Language)と言う中間コードに変換され、.NET FrameworkのCLR(Common Language Runtime)が実行する。Java仮想マシンについての説明では次のような図がよく使われるな。

Java仮想マシン(JVM)がOS間の違いを吸収している図
図1:OSの違い(最下部の凹凸)をJava仮想マシン(JVM)が吸収している

はね:ここで、UNIXというのはWindowsやMacと同じOSだ。この図を見ると、OSによる特性をJava仮想マシンが吸収している様子が良く分かるという非常に高度な・・・

トモ:どうせ、どっかのパクリだろ。

はね:ぐむ、、、だが、図はちゃんと自分で書いたぞ。15分くらいかかった。この手間が以外と面倒だったので、これからJava講座を作りたい人は上の図を自由に使うことを許可しよう。

トモ:誰も欲しがらないっての。

オブジェクト指向ってWhat's?

はね:Javaの歴史うんぬんを語っても仕方ないし、そんなに詳しくも無いので次に行こう。次は現在、プログラミングを志す上で絶対に知っておかねばならないオブジェクト指向についての話だ。

トモ:確かによく聞くねぇ。意味は分からないけど。

はね:安心しろ、この講座ではオブジェクト指向だけはどこよりも分かりやすく教えるつもりだ。泥舟に乗ったつもりでいるがいい。

トモ:すぐに沈みそうだな。

はね:まずはオブジェクトとは何かについて説明しよう。そこの人、辞書をひくがいい。

トモ:名前で呼べ、名前で。えーと、object「物体、もの、実物、対象」なんじゃこりゃ。意味が分からんぞ。

はね:辞書の通りだ。オブジェクトとは「もの」であり、「実物」であり、「対象」なんだ。

トモ:なるほど、よく分かった。・・・って分かるか!ちゃんと説明しろ!

はね:簡単に言ってしまえばオブジェクトというのは日常にある「もの」のことなんだ。シャーペンや本、人間、犬、CD、情報・・・。とにかく数えられるものは何でもオブジェクトと考えていい。

トモ:確かに全部、「もの」だし「実物」だし「対象」だよね。本だったら読む対象だし。あれ?でも情報ってのは実物?

はね:確かに目には見えないけれども、数えられるからオブジェクトだ。

トモ:そんな安易な・・・。

はね:実際、オブジェクト指向ではどうしても数えられないもの(海・空・宇宙etc)以外は全部オブジェクトとして扱う。これは我々の日常にもあっているんじゃないだろうか。

トモ:確かに数えられない空とかは「対象」になりにくいね。でも、何で数えられるものはオブジェクトで、数えられないものはオブジェクトじゃないの?

はね:その前にオブジェクト指向について簡単に触れよう。さて、オブジェクト指向とは現実の「もの」のあり方をプログラミングにも取り入れた手法だ。たとえば、何か一つの仕事をするにしても、それを一人で最初から最後までやることはないよね。たいていは何人かが相互に協力しあって一つの仕事をするわけだ。

トモ:いや、私は一匹狼だから最初から最後まで一人でやるよ。

はね:お前のことは聞いてない。一般論の話だ。現実では一つの仕事を終えるのには次の図のように多くの人の協力が必要なことと思う。

AさんはBさんに仕事を依頼。Bさんは仕事を完了させてAさんに成果物を渡す。また、AさんはCさんにも仕事を依頼、この仕事では成果が物として返ってこない。
図2:現実の仕事の流れ。複数人の協力によって一つの仕事が完成する。

トモ:いや、待て。明らかにリーゼントの怪しい人間がいるだろ。

はね:何を言う。黒髪にめがねをかけた真面目そうな人間じゃないか。

トモ:確かに「黒髪」で「めがね」をかけてるけどさ。違うだろ。

はね:見た目で人を判断するのは良くないな。トモの字よ。この図を見て分かる通り、人と人とは会話のやり取りを行って仕事を頼んだり頼まれたりする。そして、仕事に必要な情報を与えて、その仕事の成果をもらう。A君とC君とのやり取りのように仕事の成果が物として無い場合もあるな。

トモ:どんな仕事を依頼したのか、気になりすぎるぞ。

はね:オブジェクト指向というのはこれと同じようにしてプログラミングを組もうというものだ。上の例では、それぞれの人がオブジェクトで、オブジェクト同士の間に交わされる会話をメッセージと呼ぶ。

はね:各オブジェクトはメッセージをやり取りして、仕事(=処理)を依頼したりされたりする。この際に相手に渡す、処理に必要な情報が引数であり、帰ってくる処理結果が戻り値だ。

トモ:いんかず?れいりあたい?

はね:無理やり変な読み方をするな。引数(ひきすう)戻り値(もどりち)だ。

トモ:オー。ニホンゴムズカシイネー。

はね:無視。ここでコンピュータの世界におけるオブジェクトの定義を話そう。オブジェクトとは「データ(属性)と操作(メソッド)を一つにまとめたもの」だ。属性はオブジェクトが持つ特徴と言ってもいい。人間だったら身長・体重・名前・住所・・・などが属性だ。メソッドとは耳慣れない言葉だが、これは簡単に言えば各オブジェクトが持っている動作だ。といっても分かりづらいだろうから、電卓を例にしよう。

電卓によるメソッド説明例
図3:電卓によるメソッド呼び出しの例。右向きの矢印はメソッドの呼び出し。左向きの矢印はそれぞれの処理による戻り値を表す。

トモ:ハテナ?クラスって何じゃ?

はね:クラスについては後で説明するが、簡単に言えばオブジェクトの一部だ。今はそれだけ知っておいて、下の項を読んでからもう一度この図を見れば意味が分かるかもしれない。

トモ:「かもしれない」って適当な・・・。

はね:実際、オブジェクト指向についてはソースを読んでいるうちに理解できることが多いからね。それでも極力直感的に理解できるようにはしているつもりなんだけど。

トモ:精進せぇよ。

はね:はい・・・。さて、通常の電卓ではたとえば「7」「+」「3」「=」というように入力して答えを求めるが、ここでは簡単のためにadd(x,y)、divide(x,y)、multiply(x,y)というメソッドをもつCalcクラスを考えることにした。それぞれのメソッドの機能はaddがxたすy、divideがxわるy、mutiplyがxかけるy、の値を返すというものだ。

トモ:変な電卓だな。

はね:確かに人間が使うには変だけども、プログラムを組むときにはこの方が書きやすいんだ。いちいちどのキーが押されたか覚えておくのも手間だしね。

トモ:考え方を変えなきゃダメってことか。

はね:もっとも、こういう考え方はそのうち身につくものだ。さて、図にもあるように、Javaではメソッドを呼び出すときは「オブジェクト名.メソッド(引数)」という風に呼び出す。引数が複数ある場合は「,](カンマ)で区切る。戻り値があればそれが帰ってくる。

トモ:メッセージが書かれてないぞ。この図は欠陥品だな。

はね:実際にはメッセージは内部で勝手にやり取りしてくれるから、プログラマーはメッセージなんて気にする必要は無いんだ。メソッド呼び出しと戻り値、これだけ分かっていれば全然OK。

トモ:なんだよ。メッセージ、メッセージ、メッセージ、・・・と百回も唱えて覚えなくて良かったのか。

はね:本当に百回唱えてたのならほめてやろう。でも、こういう裏を知っといた方が理解がしやすいと思うのだよ。

トモ:百歩譲ってそれは認めてやろう。

はね:君に認められる必要も無いけどね。さっき、オブジェクトを「データ(属性)と操作(メソッド)を一つにまとめたもの」だと言ったね。ここから海や空や宇宙がなぜオブジェクトにならないかが分かるんじゃないかな。

トモ:どれも属性や操作を持ちそうにないな。

はね:そういうことさ。ただ、プログラマーの視点によってはオブジェクトにならなくもない。結局、私たちがこの世界を認識する方法が一人ひとり異なるように、オブジェクト指向と一口に言っても、何をどのようにオブジェクトにするかはプログラマーによって千差万別ってことさ。

トモ:むむむむ、ちょっと哲学っぽい話。

オブジェクト指向以前の、上から下へと処理が流れていく形式を手続き型(プロシージャ型、procedure型)と言います。手続き型はいわば、一つのオブジェクトで全ての処理を行うような感じです。本来は手続き型こそがプログラミングの基本ですので、次回以降はまず手続き型のプログラミングについて学んでいきたいと思います。

オブジェクトとインスタンスとクラス

トモ:objectとinstanceとclass?辞書を引くとinstanceが「実例」、classは「種類」か?

はね:そんな感じかな。ただ、正直これについては本によって定義がまちまちなんだ。だから、実際にプログラムを組む中でつかんでいくしかないと思う。とはいえ、説明無しでは全く意味が分からないだろうから簡単に説明しよう。

トモ:でもさ、定義がまちまちだったら、この講座でやる定義が正しいとは限らないじゃん。意味無〜〜。飛ばして次を読もう。

はね:待てい。意味が無いと決めるのは、ちょいと話を聞いてからにしておくんなせぇ。「はね」の名もらってうん百年。そう簡単に一蹴されちゃぁ、この名がすたるってものよ。

トモ:よくワカランが、熱意は感じたので聞いてやるか。

はね:ありがとうごぜぇやす。さて、この講座では経験を元にした個人的な解釈をお話してぇと思います。なぁに、個人的な解釈と言ったってやたらめったらでたらめなもんじゃぁありやせん。きちんとオブジェクト指向の考えに沿った上で、実際にプログラムを組む上での考えをお話してぇと思いやす。ていうか、この話し方つかれた。

トモ:んじゃ、ちゃっちゃとはじめちゃってくれや。

はね:そいじゃあ、インスタンスクラスについて簡単に説明しちゃおうかねぇ。要はインスタンスもクラスもどちらもオブジェクトなんだけど、違うのはそれが具体的か抽象的かってことかな。たとえば上でCalcクラスによるメソッドの説明をしたけれども、あれは電卓クラスをオブジェクトと考えて、それに対してメッセージを呼び出すことを考えていたのであったね。でも、あの電卓がある特定の電卓である必要はないよね。

トモ:SONY製でも三菱製でもホンダ製でもいいわけか。

はね:ホンダが電卓作っているかどうかは知らんが、要は電卓であれば何でもいいわけだ。こんな風に、ある特定のものではないオブジェクトをクラスと呼ぶ

トモ:ふーん、よく分からんけどもパソコンクラスだったら、パソコンであればいいわけで、SONYでもDELLでも何でもいいわけだな。

はね:そういうこと。対して、インスタンスというのはいわば具体的なクラスだ。

トモ:具体的なクラス?

はね:たとえばシューティングゲームの敵キャラを考えよう。一つ一つの敵キャラについて別々のクラスを作る必要が無い事は分かるね。

トモ:行動パターンをだいたい同じにすれば、最初に出てくる出現位置とか、体力とかだけを変えれば処理は同じでよさそうだな。

はね:そうだ。だからそれらをいちいち別のクラスで作るのではなく、一つのクラスを鋳型(いがた)にしたインスタンスとして扱うのだ。普通、オブジェクトといえばインスタンスのことを指す。

トモ:むむ。意味が分からんぞ。

はね:下の図を見るといい。

クラスからインスタンスが生成されることの図示
図4:シューティングゲームの敵キャラを例にした、クラスからインスタンスが生成されることの図示。そのインスタンスを独特のものにするための初期値(必須ではないし、全く同じ値を与えてもよい)を与えることで、インスタンス化できる。生成された3つのインスタンスteki1、teki2、teki3はそれぞれデータが異なる事に注意。

はね:「new クラス名(初期化のための引数)」で新しいインスタンスを作成することができる。新たなインスタンスを作成する作業をインスタンス化と言う。こうして作成されたインスタンスは元のクラスは同じでも、それぞれ独自の変数をもつので、表示位置をずらしたり、体力を変えたりすることができる他、特定のインスタンスだけを動かしたりと言った事も可能だ。ちなみにこの図はベルトコンベアーをイメージしたつもりだ。

トモ:見た目は同じだけど中身が違うクローンみたいなもんか。

はね:そんな感じだ。

トモ:えーっと、インスタンスは具体的なクラス。ということはパソコンクラスがパソコンなら何でもOKだったのに対して、インスタンスの場合はそれがSONYとかDELLとかを分けて考えないといけないんだな。メモリも256MBだったり512MBだったりするなぁ。

はね:それだけじゃないぞ。たとえば全く同じ性能の2台のパソコンを買ってきたとする。この2台を性能が同じだからと言って、同じものだと考えるか?

トモ:考えるわけないよ。いくら性能が同じだからって2台のパソコンが同じもののわけないじゃない。

はね:そう、それがインスタンスの捉え方だ。実際のプログラミングでは使用されているメモリ番地で区別されているがな。対してクラスの捉え方はどうだろう?

トモ:うーん、2台のパソコンを同じものとみなすってこと?

はね:と言うよりはむしろ、この世に存在するパソコンというもの全てをひっくるめてパソコンと呼ぶようなもんだな。たとえば、今パソコンを例に出しているわけだけど、「パソコン」と言ったときに、これは特定のパソコンを指すわけじゃなくて、何か頭に思い浮かぶパソコンのイメージのようなものを指すよね。こういうイメージとでもいうものがクラスだ。

トモ:英語で言うなら、不定冠詞(a)がクラスで、定冠詞(the)がインスタンスってことか。英語圏の人はこれを聞けばすぐに理解できそうな気がするけども、日本語圏の人間にはなかなか理解しずらいかもなぁ。

はね:逆に言えば、オブジェクト指向を理解できれば英語の定冠詞・不定冠詞が理解できるって事だね。ちなみに実際のプログラミングでは、クラスのソースコードを書いて、そのクラスをインスタンス化して使う。たまにインスタンス化せずに直接にクラスのまま使うこともあるけどね。

トモ:上の電卓による説明はCalcクラスのままで使ったってことか。

はね:そういうこと。基本的にはそのオブジェクトを区別する必要がない場合はクラスのままで使う。逆にシューティングの敵キャラのように、一つ一つのオブジェクトを区別する必要がある場合はインスタンスとして使う。ま、そのうち分かるさ。

トモ:適当だな。

はね:これについては実際にプログラムを組んでみなければわからんのよ。ただ、オブジェクトにはいろいろな特徴があるから、これについてはある程度プログラムを書けるようになってからもう一回説明しようと思う。

トモ:習うより慣れろってことだね。

Javaでは(ほぼ)全ての命令をオブジェクト(つまりクラスとインスタンス)を使って行います。たとえば、もっとも簡単な命令の一つで、DOS窓(黒い画面)に文字を表示する命令に
System.out.println("文字");
というものがありますが、この命令ではSystemクラスがもつoutという名前のインスタンスのprintlnというメソッドを引数"文字"で呼び出しています。このようにクラス内の変数にアクセスするときは、クラス名.変数名。クラスのメソッドにアクセスするときは、クラス名.メソッド(引数)。とします。この視点をもっていると、初めて見る命令でも意味がつかみやすいかも。

ちなみに「(ほぼ)全ての命令」はオブジェクトを使うと書きましたが、オブジェクトを使わずに、C言語のようなプラットフォーム(環境)依存の言語で書かれたDLL(Dynamic Link Library よく使う命令をまとめたものと考えて可)を主体とするnativeメソッドもあります。しかし、これは一般のプログラマーが使うことはまずないので、全ての命令はオブジェクトを使って行う、と理解していただいてよろしいかと思います。(これについては詳しくないのでこの辺で・・・)

まとめ

はね:長々と書いてきた第1回Java講座「プログラムって何だろう」編もここで終わりだ。

トモ:本当に長かったなぁ。途中いろんなことがあったよ。何人ものファンに追いかけられてサインをねだられたり、くじけそうになった時にファンの人が支えてくれたり・・・。

はね:安心しろ、それは全部夢だ。

トモ:む、とにかくさっさとまとめて終わろうよ。

はね:ということで今回のまとめ。

はね:とりあえずこんなところだろう。

トモ:いやぁ、ずいぶん長い文章だったね。1万字は間違いなくあるよ、これ。

はね:「プログラミングって何?」っていうレベルの初心者を対象に書いたからね。これでも簡潔に書いたつもりなんだけども。

トモ:これでやっと入り口か。プログラミングってのは奥が深いなぁ。

はね:次回は実際にJava開発環境をインストールして、簡単なプログラムを書くことまでやるつもりだ。それでは次回をお楽しみに。

トモ:この文量を考えると、今回だけでもう嫌になった人もいそうだけどな。

はね:次回はもうちょっと文量を少なくできるよう精進します・・・。


感想をお伝え下さい。オラに元気を分けてくれ!
お名前、メールは省略可能です

お名前:
メール:

戻るぜ!