Back To Main


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
┃ ◆Javaで珈琲ブレイク vol.002◆
┃……………………………………………………………………………………………
┃ [不定期] Melma! ID=m00061296 まぐまぐ ID=0000088576
┃……………………………………………………………………………………………
┃ 今回からご覧になる方は、バックナンバーもご活用下さい
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

皆さんいかがお過ごしですか?

前回はJava SDK、Java API、そして、CPadのインストールをしました。そしてCPadのテストもかねて、お約束のハローワールドプログラムを作成し実行しました。
どうです、CPadなかなか、使いやすいでしょう?Hr.Hackは稀杜さんの回し者ではないですが、楽にJavaの勉強ができますよね。ばしばし使っていきましょう。

前回のプログラム

class HelloWorldDemo1{
public static void main(String[] args) {
System.out.println("ハローワールド");
}
}

まず、簡単に、見ていきましょう。HelloWorldDemoというのがクラス名でクラスを表します。クラスの説明は次回のメルマガで説明するので、ここでは、仕様書・設計図だと思っておいてください。ハローワールドを画面に表示するための、設計図ということを宣言します。public static void main(String[] args)は、main()というのがメソッドネームです。メソッドには返値(かえりち)の型(Type)を示さないといけませんが、ここでは、返値を示さないvoidを使います。

publicはaccess specifierです。access specifierはプログラムの他の部分が、クラス(HellowroldDemo)の外から、そのクラスのメンバ(main()メソッド)にアクセスできるか否かを定めます。main()メソッドはpublicでないといけません。というのは、プログラムがスタートするときに、main()メソッドはクラスの外からJavaインタープリタ(Java Interpreter)にアクセスされるからです。

staticというキーワードは、それによって、HelloWorldDemoクラスのオブジェクト(インスタンス)が生成される前に、Javaインタープリタがmain()メソッドを呼べるようにします。

main()メソッドは、String[]型のargsという一つのパラメータ(parameter)を持っています。argsはargumentsの省略ですね。このようにあまりにも分かり切っているvariableはJavaでも省略形を使います。ほかの例で言うと、"i"です。"i"はforループの中でindexとして使います。前回のメルマガでは、argsの代わりにargとしましたが、両方よく使われています。ただ、配列(array)の場合は変数名を複数形にするのが一般です。このmain()メソッドのパラメータは特殊でコマンドライン実引数(じつひきすうと読む、command-line argument)の値を格納します。これをどのように使うかというと、プログラムのモード選択に使ったりします。たとえば、コマンドでHelloWorldDemoを入力するときに、

Java HelloWorld debugと打つと、パラメーター名やその値を表示したりするデバッグモードに切り替えられるようにします。これも、後々、アドレスブックプロジェクトの一環として、勉強します。今のところは気にしないでください。

一通りざっと説明しましたが、今のところは、細かいことは気にせずに、先へ進みましょう。これらが、ああ、こういうことを言っていたんだ!となるには、もう少し時間がかかります。学習ははじめから全て吸収するのは無理だと思います。かいつまんで、かいつまんで、少しずつ吸収し、そしてまた前に戻る、前に戻ったらまたかいつまんで、かいつまんで、以前より吸収する、右上がりの折れ線グラフみたいなモノだと、Mr.Hackは考えています。また、皆さんの力がついてきたときに、ここを、読み返してみてください。

■ HelloWorldクラス
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

さて、前回のハローワールドプログラムじゃおもしろくないので、Cpadが複数ファイルに対応しているのもかねて、新規作成ボタンをクリックし以下のファイルを作りタイプしてみてください。


HelloWorldDemo1.java

class HelloWorldDemo1 {
public static void main(String[] args) {
HelloWorld myClass = new HelloWorld();
System.out.println(myClass.getMessage());
}
}

目的は、前回と同じようにハローワールドと画面に表示するプログラムを作成します。HelloWorldクラスがその役割を担います。初中級者の方は、HelloWorldクラスはどう作るか考えてみてくださいね。答えを見る前に"考える"ことが、Programmingセンスを磨きます。メールマガジンなんだから読むだけでいいんだ!なんて思わずに、ちょこっとだけ考えてみてくださいね。超ど級初心者だと思っている方は、なにさこれ、私にはちょっとむりだな、このメルマガ・・・やーめよっと、と思う前に、もうちょっとだけ辛抱してみてください。メルマガの紙面上ではJavaのシンタックス(文法)等全てカバーし切れません。ある意味ペースメーカーとして活用して頂ければ、上達も早いと思います。以前Mr.Hackは自分でJavaの本を買いました。最初の"はじめに"から読んで1/5も読まないうちに何度も本箱行きになったことか。Javaが初めての方は、え?mainってなに? System.out.printlnってなに?getMessageってこれJava言語で定義されているの?なんでファイルネームとクラスネームが同じなの?なんで"ハローワールド"って画面に表示するのにこんなにかかないといけないの?そうおもって、入門書を見てください。そうすれば吸収力も俄然変わってくると思います。どうしても自分で解決できず、メルマガでもふれていないときは、Mr.Hackにメール下さい。メールアドレスは、このメルマガの一番下にあります。中級者のかたは、何を今さら・・・と思って頂いても今は結構です。でも、徐々にレベルアップしていくのでご心配なく。

さて、HelloWorldはどんな感じになるでしょうか。こんな感じになりましたか?HelloWorld.javaファイルの中身は、

/**
* HelloWorldクラス "ハローワールド"の文字列を含む
*
*@author Mr.Hack
*/
class HelloWorld {

/** メッセージを含む文字列変数 */
String message;

/**
* コンストラクター messageフィールドをハローワールドで初期化
*/
HelloWorld() {
this.message = new String("ハローワールド");
}

/**
* message変数を得る
*
*@return message メッセージを含む文字列変数
*/
String getMessage() {
return this.message;
}
}

です。あ、いまこれをコピーした方、/** */を消したりしませんでしたか?だめですよ、ちゃんと、/** */も含んでコピーしてくださいね。Copy rightはもちろんですが、それをとったら、3年後に見たら何のクラスなのかわからないでしょ。

■Strongly Typed Language (型重視言語)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

型重視言語と訳しましたが、本当はなんでしょうね?日本語訳ご存じの方いらっしゃいまいしたら知らせてください。JavaはC,C++以上にStrongly Typed Languageです。全ての変数(例えば、message。型はString)、式(例えば、this.message = new String("ハローワールド");。型は、String)に型があります。返値の型には、primitive data type(プリミティブ型:byte, short, int, long, char, float, double, boolean)とreference type(参照型, class(クラス), array(配列))と、返値を示さないvoidがあります。

プリミティブタイプは全部覚えないといけないの?

そんなことはないです。プログラムに出てくるときに確認すればいいのです。それに、大抵は、int型、char型、double型、boolean型の4つがよく使われます。Mr.Hackはbyteは数回、long、floatなんてサンプルプログラム以外使ったことがないと思います。参照型は???と思うかもしれませんが、クラスも返値になります。たとえば、Stringクラス等ですね。自分で作ったクラス(例えば後述のHelloWorldクラス)ももちろん返値として使えますよ。配列も返値になります。ここで注意してもらいたいのは、配列は一つのtype(型)であることです。int型とint[]型は別物です。

ところで、

えーーーこうでもいいんじゃないの?

class HelloWorld {

String message = "ハローワールド";

String getMessage() {
return message;
}
}

いやいや、これの方がすっきしりしてるさ。

class HelloWorld {
 String getMessage() {
return "ハローワールド";
}
}

ははは、僕なんて一行だぜ。

class HelloWorld {String getMessage() {return "ハローワールド";}

どれも"文法的には"正解です。ただ、一番最後のように書いた方は、前回のメルマガ読みませんでしたね?創刊号に是非、目を通してください。たぶんコンピューターで速度を測れば一番下のものが実行速度が一番速いでしょう。しかしながら、ほかのと比べてどうですか?読みやすいですか?それを一ヶ月後に見てぱっと意味がとれますか?昔のようにコンピューターのメモリーもハードディスクの容量もとても限られていた頃は、どうやって行数を減らすかが最大の焦点でした。そのため、getMessageもgmsgとしました。でもどうでしょう。gmsgで意味がとれますか?このgmsg()というメッソドはどういう役割をしているのか文字を見ただけでわかりますか?一方で、getと入れることによって、メッセージを取り出すということが容易に想像できますね。これにこのメソッドの説明をjavadoc用のコメント、/** */のをつけて説明しておけばどんな屁理屈を言う人でも一義的にしか読めなくなるでしょう。ただ、メモリーもハードディスクも無限ではないので、ある程度メモリースペース節約と読みやすさのトレードオフ(交換条件)になるのですが、皆さんが作成する程度のプログラムであれば、読みやすさを第一に考えてまず問題ないと思います。

ところで、なんで、こんな風に二つのファイルに分けたの?一つのファイルで、

class HelloWorld {
public static void main(String[] args) {
System.out.println("ハローワールド");
}
}

でいいーーーじゃーーーんーーーー。だって実行すると同じ結果なんだからサー。まことにいいセンスです。実行する側からみれば、上のプログラム全て同じ結果(ハローワールドと画面に表示される)になりますね。そこが、後で勉強する、Encapsulation(Dataのカプセル化、Dataの隠蔽)の概念につながっていきます。使う側からは、中身の構造なんてどうでもいい、結果だけちゃんと出してくれれば。これは、中身の構造は簡単にはいじれない・見れないというEncapsulationのことの裏返しです。まだエン・・なんとかって説明してくれないの?もう少し先です。でももう2度も出てきましたね。どうです?自分で調べてみたい気がしてきましたか?そうです。その調子です。自分で調べたことは記憶の奥まで残ります。是非実行してくださいね。

ところで、このクラスを二つに分けた理由の一つとして、ユーザーインターフェイスがあります。printlnはコンソールに出力する方法ですが、もし、アプレットに表示したい場合はどうでしょう?もし、JSPをつかってHTMLに表示したいときはどうでしょう?"ハローワールド"とmainメソッドのprintlnにハードコーディング(埋め込み)することによって、コンソール出力にしか使えなくなります。一方で別のHelloWorldクラスを作り、そのクラスのインスタンス(オブジェクト)、つまり、myClassを作り、そのmyClassにgetMessage()メソッドを適用することによって、おなじ"ハローワールド"というString(文字列)が得られますが、これはアプレットのテキストフィールド等にも、そのStirngを入れることができます。つまり、HelloWorldクラスを作ることによって、再利用可能なポータブルなモノになったのです。これは、結構重要な考え方なのでまた、ちょくちょくふれていこうと思います。

さて、今日はウォーミングアップもかねてこの辺にしておきましょう。次回までに皆さんHomework(宿題)をだします。エー学校みたいでやだなー、といわずに是非トライしてみてください。今回はプログラミングではありませんが、非常にAPIと友達になるにあたって重要です。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

【Question 1】

println()はどこのクラス(class)のメソッド(method)か。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ヒント

クラスは次回説明しますが、Systemはクラスです。HelloWorldもクラスです。
APIの左側でSystem classを探して見てください。そして、フィールドの概要(ずいぶん難しい言葉をつかっていますね。英語だとField Summaryです)のなから、あるモノをさがし、その左側にかいてあるモノのリンクをクリックしてみると・・・。


是非皆さんトライしてみてくださいね。へーぇ、こうやってクラス名がわかるのかーとわかってもらえれば、APIと友達になれる第一歩です。

それでは、みなさん、hava a good day!

Mr.Hack

■ちょっと珈琲ブレイク
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Javaを書くときに、思わず、javadoc用のコメント(/** */で囲まれたところ)を後回しにしてしまっていませんか?Mr.Hackも、気をつけよう気をつけようと思っていますが、ついつい後回しして、プログラム提出ぎりぎりにあわててコメントしています。後にご紹介しますが、JRefactory(気になる人はhttp://jrefactory.sourceforge.net/でチェック)というjavadocをチェックしてくれたり行間を整理してくれたりする非常に便利なツールがあります。これで人様が見てもいいような立派なjava codeの形ができます。もちろんメソッドや変数の記述は自分でしないといけませんが。その便利なスタイルフォーマットを裏付けるような本があります。"THE Element of Java Style"という128ページほどの本です。Amazon.com(http://www.amazon.com)で$11.20ほどで、Amazon.co.jp(http://www.amazon.co.jp)で¥1,764で売っています。残念ながら今のところ、翻訳版が見あたらないのですが、ひじょーに、Javaを書くにあたって、参考になるところが多いです。これをJavaを書く人がみんな参考にしていれば、Readablityの向上はもちろん、プログラムディベロップメントの観点からも、ソフトウェア開発に貢献するのではないかなと思います。是非、英語がわかる人はご購入をお勧めします。Java codeスタイルの必読書です。Mr.Hackは英語がわからない人のために、毎回、1項目づつ紹介していきたいと思います。108項目あるので全部カバーするのには・・・。いつになるのでしょうね。でも、少しずつJava styleになれていきましょう。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◆Javaで珈琲ブレイク◆
────────────────────────────────────
皆様からの激励・批判・質問のメールをお待ちしております。
【発行者】 Mr.Hack - javacafebreak@hotmail.com
【サイト】 http://mrhack.hoops.ne.jp/
【発行数】 10
【解除】http://mrhack.hoops.ne.jp/
※解除は上記のサイトからいつでもできます。
────────────────────────────────────
(c)2002 MR.HACK ALL RIGHTS RESERVED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

 


© 2002 MR.HACK ALL RIGHTS RESERVED