Javaの基本のキを語る②後編
今回はJavaの基本のキを語るの後編です。前編を読んでない方は是非最初にそちらを読んでみて下さい。
Variableを変えない方法
Variableが変わると元に戻せなかったり計算する時に不都合が生じたり最悪エラーが出ます。プログラムを書いていれば最低100回はあります。という事でVariableを変えない方法を用意してくれました。(Java API さんありがと♡)
それがfinal というkeywordです。
final double taxRate= 1.10;
こう書けば誰がなんと言おうと消費税は10パーセントから変わりません。Math classを使うっていうのを前回習いました。実はjavaは他のclassのmethodとかを勝手に使ったりいじったり出来るんです!
public Class Itiban{
method①{}
method②{}
method③{}
}
別のクラスにて
public Class Niban{
method①{}
method②{}
method③{
Class itibanのmethod①を召喚!
}
}
みたいな事です。
重要な事はこClass Nibanのmethod③はClass itibanのmethod①にあるVariablesとかを変更できちゃう事なんですよね。
Itibanのクラスに税率とか売り上げとかの数字を沢山入れてるのに外部のclassであるNibanから好き勝手にいじられたらたまったもんじゃないです。
そこでfinalというkeywordが活躍します。
final double taxRate = 1.10;
とfinal を頭につければこの値は一生外部からの変更が許されません。これで安心安全にVariablesが使えますね!
String classについて
こいつはjavaの中でも飛びぬけておもろいやつです。興奮気味に読みましょう(笑)
String はclassですが、使い方はdata typeのようなものとして扱うことが多いです。Stringは文の連続にも対応しているdata typeのようなものです。特徴は””マークで囲う事です。
例えば ”Hello. My name is Computer Science from Scratch.” これどっかで見かけませんでしたか?実はprintln、print methodの説明の時に使っています。
int number = 5; みたいに
String str = "Hello";
と書けばString型のdata typeの箱の一つにstrという名前を独自につけて、その箱にHelloという文字の羅列を入れたみたいな解釈で問題ないです。では、なぜStringはVariableではなくてClassなのか?それはClass だとString Class内で色んな処理が行われて使い勝手がいいから。
は?
何言ってんのかさっぱり分からないと思いますので解説します。
例えばint を例にとってみましょう。int は
int number = 500; と書く事でint data typeのVariableであるnumber に500を代入する、と定義することが出来ます。これを他の数字と足したり引いたり色んな処理に使うわけですが、例えばこの500という数字に二桁目が何なのか知りたいと思った時あなたならどうしますか?結構頭を悩ませると思います。でも、Stringはクラスだから一瞬で出来ちゃうんです!
String str = "500";
としましょう。String classはJavaの開発者さん達が既に書いてくれているクラスです。そして、そのクラスの中には特定の場所の文字を数えてくれるmethodsが用意されているんです。Javaの開発者さん!痒い所に手が届くとはこの事でめんどくさい大量のコードを前もって書いてくれてありがとうございます笑
data typeみたいに考えていいと言いましたが、int numberやBoolean boolとは一応違います。intなどのデータタイプは元々メモリー内に沢山の箱があって、その一個の箱にdata typeとVariableを付けるという作業をしていました。しかしStringはclassです。class内には箱もクソもありませんので、一から自分で用意しなければなりません。それがString str = "500";というコードなのです。String はclassの名です。まあ意識しなくてもコードが書ければなんでもいいので先に進みましょう。向上心のある貴方もコードを書いていくと共に段々理解が深まるので2週間後のテストでいい点を取らなきゃダメなんだ!みたいな方以外は理解に時間をかけるべきでは無いと思います。classを召喚するにはまず
String(クラス名) str(変数) = ”Hello”;
と書く必要があります。これでString classのstrという変数の箱をつくり、その中に””の文字を入れ込むことに成功しました。一度作ったらめっちゃ便利です。
Char indexNum = str.CharAt(1);
これでindexNumには0が代入されました。つまり二桁目が0であるとわかったという事です。詳しく見ていきましょう。Char classの変数indexNumを作り、その箱の中にstrの文字列の1番目の文字をいれるという作業をしました。対象となる変数.CharAt(数字)で処理する事が出来ると思います。indexNumはStringではなくてchar data typeなので間違えないように!
おい、誤植があるぞ!と思ってる方が多いと思いますがコレで合ってます。皆さんが間違っていると思っているのは数字のことだと思います。実はjavaでは文字を数えるさい、0から始まります。index(通し番号)とstrの対応するLiteralを見てみましょう。
500の場合であればindex 0 が5。index 1 が0。index 2 が0となります。めっちゃ大事です。最初の方は数え間違いでよくミスります。注意してください。
さて、他にもstr.length() と書けばstrに何文字入ってるかが分かります。500なら3文字ですね。CharAtに引っ張られて2文字とはなりませんのでご注意を。
便利なmethodは沢山あって
String strOriginal = "ONAKASUITA";
String strChanged = str.toLowercase();
System.out.println(strChanged);
出力結果はonakasuita
となります。大文字を全て小文字に変えてくれるmethodです。大文字に直すならtoUpperCase() method を使えばおk。javaでは大文字と小文字は全くの別物なので、これらのString 変数がONAKASUITAと同じかどうか見極めるときに、strOriginalは正解とですけどstrChangedは違うとでてしまいます。例えばパスポートの認証システムを作りたい時は入力されたものを一度大文字に変換して、それが正しければログイン出来るみたいにすれば入力された文字が小文字でも大文字でも問題なく処理する事が出来ますね。こうやって役立つmethodsが沢山収容されているのがString classなんです。
Commentの種類について
前にも少し紹介した事があるけど、javaにはコメントを自由に書く事が出来ます。commentは共通してコードの概要だとか説明文の事を指します。たったそれだけ。
//の後ろに書いた文字とかは無視されるってやつです。そんなcommentにも実は種類があります。それを一つずつ見ていきましょう。
Single-Line comment
これは以前から紹介しているスタンダードなやつ。//記号の後ろにコメントを書く。
例(シングルライン)
//このコメントはシングルラインを
//二行に渡って使っています
Mulit-Line comment
複数行に渡ってコメントを書きたい場合に使える。勿論スタンダードなやつを複数行に渡って使うこともできるけど、いちいち//記号を書くのがめんどいからこっちを使う事も多い。使い方は/* コメントを書くスペース */
例(マルチライン)
/*このコメントはマルチラインを
4行に渡って使っています。
こうする事で何行にも渡って
コメントを書けます。
*/
Documentation comment
最初の頃は全く使わないけど後々勉強する@系のやつが登場した途端にめっちゃ使うこのコメント方式。今は全く@を書く事でSNSのハッシュタグみたいなコメントを書く事が増えてくる。その時に便利なコメント方式なので頭の片隅には入れておくこと。使い方は / ** コメント */ とmulti-lineと殆ど変わらない。
例(ドキュメンテーションコメント)
/**
・このコメント方式は勝手に・が出て箇条書き出来る様になっている
・シングルラインと違ってスペースキーを押すだけで
・行を増やせるのでマルチラインと同じく使いやすい。
*/
キーボードで入力したい
今までStringだのintだのを知って数字やら言葉やらとを四則演算してみたり文字数を数えてみたりととたけど、それは全て入力済みのliteralsなんですよね。でも実際はパソコンに何か数字を入れて見積書を発行したり文字を入力してSNSで呟いたりするわけですよ。javaでもキーボードで入力したいと思っています。出力がSyste.out なら入力はSystem.in なのではと思った方。正解です!と言いたいのですが、System.inは少し使いずらいのです。というのもSystem.in はbyteのdata typeでしか読み込むことができないのでStringやbyteで読み取れる数字より大きい数字は対応していません。そこでScanner classというクラスを使って実現可能にしていきたいと思います。まずはテンプレを書きます。
import java.util.Scanner;
public class KeyBoardDeInput {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
System.out.println ("Please enter a number: ");
int number = keyboard.nextInt();
System.out.println(number);
}
}
このコードを実行すると
Please enter a number:
という文がコンソールに表示されます。そこに適当な数字を入れてエンターキーを押すと、numberにその数字が代入されて、System.out.println(number);
という文によってそのキーボード入力された文字がコンソール(画面の下の方に表示される四角いやつ)に出力されます。
というのが一連の大きな流れです。では詳しく1行づつ見ていきましょう。
まず1行目のimport java.util.Scanner; というコードです。
これはScanner classを使うにあたって必要な決まり文句です。javaの開発者さん達が前もって用意してくれたclassで召喚文を書く事で使う事が出来ます。ちょおおおおと疑問に思いませんか?なぜ他のclassであるString とかMathとかはimport文無しで使えたのか。それはパッケージの違いです。まず今回のimport に続くコードをもう一度見てみましょう。java.util.Scanner; です。java はこの言語のjavaで最後のScannerはこれから使うScanner ClassのScannerですが、間に挟まれたutilとは何でしょうか?これがパッケージ名です。ファッションというカテゴリの中の上着というジャンルの中のセーターみたいな感じでutil というpackageの一つにScanner class は収容されています。Scanner class はutilというpackageに入っていましたが、Stringや他のクラスはlang という名前のpackageに入っています。これはコードを書くぞ!と思ってコードを書く画面を立ち上げた時には既にimportされているpackageなのです。従ってStringと書く際にjava.lang.String と書く必要はないんですよね。
では、ようやくmain methodの中身を見ていきましょう。初めは
Scanner keyboard = new Scanner(System.in); ですね。Scanner classのオブジェクトを新しく作ってその箱の名前をkeyboardと今回は命名したいのですが、String classと違ってScanner classはクラス内の文章に新しく箱を作る為のコードが用意されていないので、箱を作れません。つまりString strと書いた瞬間に箱が自動で作成されるのですがScanner classでは自動で箱は作れないのです。作れたのはkeyboardという表札だけ。ではどうしたらいいのか。答えは右辺にあります。最初のnewというのがその解答です。newというのはkeywordの一種で、メモリー内に新しく箱を作るというお仕事をしてくれます。つまりnewで新しく作ったメモリー内の箱に用意したkewboardという表札を取り付けたわけです。Scanner classはintだろうがStringだろうが受け付けてくれるので便利ですね。この右辺のコードの意味は、System.inで読み込まれたものScanner classの引数として入力するということです。色んなところで使う()の中身のことを引数などというようですが漢字で引数なんて書かれたって専門用語で伝わりづらいので引数という言葉は殆ど使わない予定です。
System.in method単体で使おうとするとbyteのみの読み込みになりますが、Scanner classと組み合わせて使う事でどんなdata type でも入力できるようになってます。というかbyteしか入力できなくて不便だからScanner classが開発されたのかもしれませんが。詳しい事は知りませんがとりあえずキーボードでの入力では上記のコードがテンプレなので丸暗記必至です。
そしてSystem.out.println ("Please enter a number: "); のコードについては特にいう事はありません。ただ単には””内の言葉を出力するだけです。
肝心なのは次のコード。
int number = keyboard.nextInt(); intのVarialbeのnumberはkeyboard(ScannerのVarialoble)のnextInt methodを使用しますというものです。つまりVariableのkeyboardをScanner classのnextInt method を発動させたということです。nextInt methodは実際ンにキーボードで入力されたintのdata typeのやつをnumberに代入するという処理です。コンソールに100とキーボードで書き込んだら100という数字がnumberに代入されて最終的にはprintln methodでコンソールに表示されます。
これが一連の詳しい流れの説明です。もし入力したやつをStringのdata typeで使いたいならnextLine() だし、doubleで使いたいならnextDouble() とdata type によって分かれているので注意が必要ですね。
Dialog Boxについて
僕個人の話ですが正直ダイアログボックスは苦手です。知ってますか?ダイアログボックスって。これはコンソールじゃなくてパソコンとかのエラーが出た時に真ん中に出てくる四角いメッセージのやつです。テレンっていう効果音と共に出てくるあれです。あれをjavaで出すやり方についてです。ダイアログボックスはメッセージを表示するためと、何かを入力してもらうための二通りの使われ方が、それぞれ書くコードが少しずつ変わってくるのできちんと理解しましょう。
まずどちらにせよ、ダイアログボックスはJOptionPane というclassをつかいますswingというpackageに入っているのでimport のコードを書きます。
import javax.swing.JOptionPane;
なんかよくわかりませんがjavaではなくてjavaxなんです。理由は知りませんが詳しい事が分からなくても初心者で困る事はないしテストでも聞かれないのでjavaxなんだなーと思いしましょう(笑)
import javax.swing.JOptionPane;
public class Example {
public static void main(String[] args) {
String firstName = JOptionPane.showInputDialog("What is your first name?.");
JOptionPane.showMessageDialog(null,"hello." + firstName);
System.exit(0);
}
}
このプログラムは2つのJOptionPane を使っています。一つ目はInput Dialogです。What is your first name?というメッセージと共に入力画面が表示されるダイアログボックス。
もうひとつがMessage Dialogです。hello と入力されたfirstNameが表示されるダイアログボックスです。
気を付けなければならない点は2つ。Input Dialogのnull,の部分です。これについての深掘りはおいおいやっていくので今は丸暗記しちゃってください(笑)
もう一つは最後にSystem.exit(0); の文についてです。一旦ダイアログボックスを終わらせたい場合は必ずこのコードを書いてください。書かなければmain methodが終わるまで処理が完了されない状態となりJVM(Java Virtual Machine)を圧迫する事に繋がります。簡単に言えば負担が増えます。
Dialog boxedの出来ない事とその対応
Dialog boxesはSting以外を受け付けません。厄介です。なんせintやdoubleでは使えないですから。そんな時は何とかして数字に変えましょう。そのためのmethodがあります。
String str = "33";
int number = Integer.parseInt(str);
このようなコードを書く事でstrを数字に直したargumentをnumberに代入する事が出来ます。
これはJOptionPane以外の場面でも結構活躍するので是非覚えて帰ってください。今日も8000文字超で疲れたしキリがいいのでここまでにしましょう。次回は条件文について説明したいと思います。ではまた!