もどるの。

@Java初心者によるJava入門の♪

・もくじ

1.こんぱいらをてにいれるの♪
2.Hello World♪
3.ぷろぐらみんぐ♪
4.くらす♪
5.続くらす♪
6.めそっど♪

つぎのぺーじ♪


1.こんぱいらをてにいれるの♪

ということでJavaについて勉強してみたいコーナーなの。
ちなみにJavaScriptじゃなくて素のJavaのなの。

で。まずJavaのコンパイラを用意しないといけないの。
でもじつはくわしいことはわからないの(涙)。
はやくもつまづいたみゅ(涙)。

でね。
JDKというのがJavaのコンパイラなの。
いや、ちがうかもしれないけども、
すくなくともJDKをインストールすればJavaプログラムのコンパイルができるの♪

んで。
JDKはあちこちでただで入手できるの♪
たぶんJava系の雑誌の付録でついているとおもうの。
JDKさえ入手できればあとはテキストエディタで十分なの♪



2.Hello World♪

で。
プログラムの基本はHello Worldなの♪
なぜってそれは太古の昔からの決まりだから♪

で。
Javaのプログラムはclass単位に作成するの。
もしかしたら違うかもしれないけど、
とりあえずそういう方向で。
ソースのファイル名はclass名と同じにしないといけないの。
大文字小文字も判別されるのできをつけるの。
で。拡張子を.javaにしてできあがりなの。

すると
こんなかんじ。
(テキストエディタでひらいてね♪)

コンパイルするときはDOSプロンプトから
JDKのpathが通っているところで
javac HelloWorld.java
でできるの。

すると同じファイル名で、拡張子.classというファイルができるの。

こんなかんじで。
(ただのバイナリファイルなんで開いても意味ないけど)

で。
C言語なんかだと、コンパイルするとEXEファイルができて、
それだけで実行可能なんだけれども、
Javaはそうはいかないの。
コンパイルと同じように、JDKのpathの通っているところから、
java HellorWorld
として実行することができるの。
するとDOS画面に文字が出るの♪



3.ぷろぐらみんぐ♪

で。
コーディングは基本的にC言語と似てるの。
フリーフォーマットで文を書いて、
文の最後は ; で区切るの。

こんなかんじ?

で。
処理構造はいろんなプログラム言語と同じなの♪

・制御文
俗にいうIF文のこっちゃね。
なんかこうAとBとどっちが大きいか比べてみて、
Aが大きかったらこうせいや。
Bの方が大きかったらかわりにこうしとけや。

っていうやつなの♪

if( 式 ) 文 else 文

ということなの。
C言語だとif( 式 )の式はただの値でもよくて、
0だったら偽とみなし、
偽でないならば真とみなすということだったんだけれども、
Javaの場合は真偽値でないとだめらしいの。
trueかfalseね。boolean型なの。

・繰り返し文
俗にいうループ文なの。

while( 判定式 ) 文
とか
do 文 while( 判定式 )
とか
for( 初期化式 ; 判定式 ; 更新式 ) 文 とかなの。

どれもみんな判定式がtrueである間繰り返されるの。
for文は、最初に1回だけ初期化式が実行されて、
判定式がtrueである間、文を実行して、式が実行されるの。

えっと文とか式とかむずかしいの。
だからまちがえてるかもしれないの。
そのばあいはごめんねなの。

まあそんなわけわからん言葉の定義よりも、
こっちをみてほしいほうこうで♪



4.くらす♪

で。
Javaをやろうってんなら否応なしにクラスの概念ぐらいは
りかいしないとまずいとおもうの。
C++だったらわからなくてもなんとかなるんだけどね(笑)。

で。
一番いいのはどこかのページで勉強してきてもらえれば(笑)。
だってオブジェクト指向の話なんて、
それ書いてるだけで十分大変なんだもの(涙)。
Infoseekとかで「オブジェクト指向」で検索すれば、
いっぱいヒットするから。たぶん。

だからだいぶ省略してかいてみるほうこうで。

クラスというのはオブジェクトの定義なの。
オブジェクトというのはものなの。
定義であるクラスが実体化されたものをインスタンスというの♪

ほらわかんない(涙)。

えっとね。あるひハンバーガーやさんへいきました。
そこにはいろんなハンバーガーを売っているの。
で。
ここでいまハンバーガーっていわれて
どんなものを思い浮かべた?
パンに上下からはさまれてるもので、
その間にはハンバーグとかレタスとかはいってて、
トマトとかピクルスなんかもはいってたりして。

と、まあなんかそんなかんじだよね?
もちろんハンバーグのかわりに、
なんかいろいろ魚のフライとかはいってたり、
エビのコロッケだったり、
パンが2段重ねになってたり、
いろいろあるかもしれないけども、
こんなで、こんなで、こんなんなってるものは
まあハンバーガーと呼んでさしつかえない、
っていうなんらかの定義はあるわけなの。

いってみればこの定義がハンバーガーの クラスなの。
でもあくまでも定義にすぎないからさわることはできないの。

で。
その実態がインスタンスなの。
カウンターのおねえさんにむかって、
「ハンバーガーください」っていって渡される、
運んだり、さわったり、食べたり、転がしたりできる、
その実際のものであるものがインスタンスなの。

だからクラスは定義だから最初にきめちゃえば、
そこに1つだけしかそんざいしないの。
インスタンスは、クラスの実体化されたものであって、
言い換えれば、その定義をみたすものでよいわけで、
複数存在する可能性があるの♪

で。
いちおうここでクラスというのはわかったことにして(笑)、
つぎは「継承」をせつめいするの。

継承とは読んでそのままのいみなの。
ハンバーガーというクラスがあったとするの。
でもハンバーガーの中にはさっきも書いたとおり、
2段重ねだったり、
ハンバーグと一緒にチーズがはさまれていたり、
てりやきちきんがはいっていたりと様々な種類があるの。
これらをすべておなじハンバーガーで
ひとくくりにしてしまうとそれはそれでこまるよね?
ハンバーガーくださいっていったのに、
あるひとにはチーズバーガーがわたされたり、
あるひとにはエビバーガーがわたされたり、
そのひの気分によってかわるんじゃ困るよね?
「オレ、えびだめなんだよ」とか、
「わたしチーズきらーい」なんてことがあるものね。

そこであるひとが考えたの。
それぞれ名前をつければいいじゃないかってさ♪

ハンバーグとチーズとレタスとトマトを、
上下2つにきったパンに挟んだものはチーズバーガー。
ハンバーグとレタスとトマトを、
上下2つに切ったパンに挟んで、
さらにそれを2段重ねにしたものはダブルバーガー。
てりやきちきんとレタスとトマトを、
上下2つに切ったパンに挟んだものをてりやきバーガー。
ってね。

でもね。
なにかめんどくさいとおもわない?
だって似たようなものなのに、いちいち
ハンバーグとレタスとトマトを
上下2つにきったパンに挟んだものを・・・
って書かなきゃいけないんだよ、1回ですまそうよ。

みんなならどうする?

ひとつの方法としてコピー&ペーストがあるの。
一度書いておいて同じ部分だけ利用して、
必要なところだけ書き換えちゃえばいいじゃん♪

そうなの。この方法だとだいぶ楽なはずなの。
でもね・・・。

あるひ国会でだめにんげんたちが、
ハンバーガーは海苔で包むこと。
海苔で包んでいないものはハンバーガーと呼んぢゃいけません♪
って決めたらどうする?(涙)

おいしくないから却下とかそういうはなしぢゃなくて、
あくまでも仮定の話だから♪

でね、
そうなるといままで
ハンバーグとレタスとトマトを・・・
ってコピー&ペーストしてきたところすべてに
海苔で包まれた
っていう1文を書き加えていかないといけないよね?
そんなのめんどうだもん(涙)。
しかもめんどうぐらいですめばいいけど、
たくさんのなかから直し忘れたりすると
もうなみだがでそうなの(涙)。

そこであるひとが考えたの。
コピー&ペーストしたからいけないんぢゃないかって。
最初に、
ハンバーグとレタスとトマトを、
上下2つにきったパンで挟んだものをハンバーガーと呼ぶ。
としておいて。
ハンバーガーであって、さらにチーズが挟んであるものを、
チーズバーガーと呼ぶ。
ハンバーガーであって、さらに2段重ねになっているものを
ダブルバーガーと呼ぶ。

なあんて書いていったらどんなもんであろうかのぅ、と。

これならさっきよりもいいかんじなの♪
かりにだめにんげんたちが、
パンの上にお子さまランチのように旗をたてること。
なんて決めたとしても、
最初のハンバーガーの定義だけなおしてやれば、
あとは直さなくてもいいじゃん♪
やっはー♪

このときの「ハンバーガーであって」
というのを「継承」というの。
最初に定義したハンバーガー。
その特徴を引き継いで定義されたチーズバーガー。
このときに
チーズバーガーはハンバーガーを継承している。
というの♪

ハンバーガーもチーズバーガーも定義だから、
それぞれクラスなの♪
で。
継承してつくられたチーズバーガーのことを、
ハンバーガークラスの サブクラスなんて呼んだりするの。
逆に、ハンバーガークラスは、チーズバーガークラスの、
スーパークラスである、なんていわれるの。
わかった?
なっとく♪



5.続くらす♪

で。
わかった?なっとく♪なんて書いてみたものの
これだけでわかるわけないよね(笑)。

プログラム的には、クラスというのは変数の型だと思ってもらえれば
だいたいあっていると思うの。
というか記述もまったく変数宣言だし。

C言語なんかだと数値型の変数の宣言で、
int   a;      /*int型の変数 a の宣言*/
なんて書くよね?

構造体なんかは、
struct  MyuStruct {
     int   m_intValue;
     char  m_charValue;
};
なんていう型宣言をしておいて、実際に使用するところでは

int  main( int arvc, char* argv[] ) {
     struct  MyuStruct  s;  /*MyuStruct型の変数 s の宣言*/
......
}
なんて書くよね?

C++でのクラス宣言はこれとまったく同じなの♪
(もちろんJavaでもおなじ仕組みだけど)

class MyuClass {
public:
    int  m_intValue;
    char  m_charValue;
....
};
なんていう宣言をしておいて、
int  main( int arvc, char* argv[] ) {
     MyuClass  c;  /*MyuClass型の変数 c の宣言*/
......
}
なんていうように使うの♪
で、ここで宣言された変数 c はMyuClass型のインスタンスと呼ばれるの♪

そんなわけで前節ではクラスは定義だって書いたけど、
プログラミングのとくいなみんなは、
クラスは型。
インスタンスは変数。
って覚えてね。



6.めそっど♪

で。
クラスは型なの♪と高らかに宣言したまでは良かったんだけど、
クラスはやっぱりint型やchar型とはちがうの。
もっと大活躍なの。

・・・その前にこのページみてるひとってC言語わかるの?
構造体ってわかる?
VBにも構造体ってあるのかしら?
いや、VB使ってる人はクラスは知らなくてもメソッドはわかるのよね。

えっとじゃあこのぺーじはどんな人向けなんだろう・・・。
やっぱり初心者向けと銘打っているからには、
なんにも知らない人のために書かないといけないのよね。
ふぅ・・・。

えっとね。
あるところにゆうしゃがいたの♪
でもいまどきゆうしゃなんていったらゲームにでてくるはなしだよね。
ゲームってのはこんぴゅーたで動いていたりするわけで、
そうするときっとプログラムとして表現できたりするの。

で。
「つよさをみる」なんていうコマンドでゆうしゃのステータスを
みるなんてのはよくあるはなしだよね。
そうするといろんな数字がならんでいるの。
レベル4
なまえふなっぴ
つよさ18
すばやさ21
HP15
MP12
なんていうふうにさ。

で。
これプログラムでつくるとしたらどうする?
ふつうはそれぞれに対応する変数を用意して、
その中に詰め込んであげるよね?
こんなかんじで。
    int  Level = 4;
    char*  Name = "ふなっぴ";
    int  Power = 18;
    ...

じゃ、つぎ。
ゆうしゃのほかにせんしやそうりょがなかまになりました。
どうする?

またへんすうつくる?

でもさ。
たぶん普通の言語だと同じ名前の変数っていうのは、
一個しか作れないよね?
ゆうしゃの名前変数に Name ってつかっちゃうと、
せんしの名前変数は Name2 とか NameOfFighter とかつけないといけないの。

そうするとね、なんかめんどうじゃない?
それぞれの変数は、ゆうしゃのもの、せんしのもの、
っていうふうにそれぞれ関連があるわけだよね。
名前の付け方で Name1 と Level1 がワンセットだっていうのはわかるけど、
もっと簡単にひとくくりにできればいいのにね。

そこであるひとが考えたの♪
ぢゃあ、ひとくくりにしてしまえって♪

そこで新しい型をつくってしまうの♪
ね。int型とかchar型とかの基本型をいろいろ組み合わせた、
自分だけのオリジナルの冒険者という型をつくってしまうの。
public class Adventurer {
    private int Level;
    private String Name;
    private int Power;
    private int Speed;
    private int HP;
    private int MP;
}
えっといきなりだけどJavaの書き方なの(笑)。
このコーナーではC++のコードと、Javaのコードが混在してるので、
みんなちゅういしてね♪
ま、とりあえず雰囲気はどちらでも伝わると思うので。
ここで説明してるのは概念の話であって、
JavaでもC++でもなんでもいっしょだからさ♪

ここで、{...}に挟まれた部分が、冒険者の型の定義なの。
型の名前が、Adventure で、
その中身に、int型の Lebel とか String型の Name とかがあるの。
この中身のことをメンバとよぶの。

で。
上記のような冒険者型を用意しておいて、
    Adventurer  BravePerson;   /*ゆうしゃって英語でなんていうの?(笑)*/
    Adventurer  Fighter;
    Adventurer  Priest;
    Adventurer  Mage;
というふうにそれぞれ冒険者型の変数(=冒険者クラスのインスタンス)
として宣言してやればいいの。

で。
ここまで書くと、VB経験者や、C経験者は、
勇者の名前は、 BravePerson.Name で取り出せると思うでしょ?
だけど半分正解で、半分不正解なの(涙)。
たしかにVBの世界では正解なの。
C言語でも構造体に関しては正解なの。
あるインスタンスのメンバ変数を扱うためには、
インスタンス変数名.メンバ変数名
で操作できるの。

そうなの。そうなんだけど、オブジェクト指向の世界には、
「カプセル化」という考え方があるの。

カプセル化っていうのは、メンバ変数へのアクセスには、
専用の手続きをもって行うことなの。
この手続きのことをメソッドというの。

たとえばある人の名前を知りたかったら、
普通本人に「お名前は?」ってきくよね。
そうすると「ふなっぴなの♪」とか返事が返ってくるの。

でもさ、このとき、ゆうしゃふなっぴがどうやって自分の名前を
答えたのかなんてことは聞いた方にはどうでもいいことだよね。
もしかしたら、ふなっぴは手帳に自分の名前をメモっていたかもしれないし、
ともだちに電話をかけて自分の名前を確認したかもしれないし、
適当にでたらめな名前を答えているかもしれないの。

でもでも。
知りたいのは名前であって、
どんな変数をもっていて、どんな処理を経て、値を取り出したのか、
なんていうことは興味がないことなの。

これが直接変数を取り出すなんていう、
まるで相手の記憶を本にして読むことができるスタンド
「ヘブンズドアー」みたいな仕組みだったら、いろいろ不便なことが起こるの。

たとえば、
人によっては、勝手に名前を取り出すなんてしたら、
「漢の左将軍、宜城亭候、領は予州の牧、新野皇叔劉備、字は玄徳」
なんていう長い名前が入っているかもしれないの(涙)。
でも、名前を聞く、という正規の手続きをとることで、
ちゃんと「劉玄徳なの♪」という回答を得ることができるの。

プログラムでいうと、
勝手に名前を取り出すというのが、
String YourName = BravePerson.Name;
ということ。
このとき劉備のような長い名前を判定しなければならないので、
名前を取り出すたびに、いちいち
if( BravePerson.Name.Length() > 6 ) {
    YourName = BravePerson.Name.Left( 6 );
} else {
    YourName = Braveperson.Name;
}
というコーディングをしなければいけないの。
もし100カ所あったら100カ所に。

でも、メソッド(=メンバ関数)を使うようにすれば、
そのメソッドを
public class Adventurer {
    public String Name;

    public String GetName() {
        if( this.Name.Length() > 6 ) {
            return this.Name.Left( 6 );
        } else {
            return this.Name;
        }
    }
}
という定義にしておけば、使うところでは、
String YourName = BravePerson.GetName();
と書くだけですむようになるの。

ハンバーガーの話でもでてきたけど、
1回記述したらすむようなことは1回ですまそうね、ってこと。
しかもコピーするとかじゃなくて、
ソースの中に1回しかでてこないの。
そのためのメソッドなの。

オブジェクト指向っていうのはそういうほうこうで♪



つぎのぺーじ♪


トップページへ。

ご意見ご感想を書き込んでくれるとうれしいの♪
質問も可(答えられるかどうかは別問題(笑))。
けいじばん♪