この章では配列、if文、メソッドを使用して、星座判定システムを作成します。



=>getsメソッドはユーザーがキーボードから入力した文字列を返します。
そして、その文字列を
で整数に変換します。前の章では自身でメソッドを作ってきましたが、getsメソッドなどはRubyであらかじめ機能が定義されているメソッドです。
つまり、このメソッドはユーザーが入力した文字列を整数値に変換するのですが、例え数字で入力したとしても、入力値は文字列として入力されるので、これを整数値に変換するのが
です。
これらの2つのメソッドを「.」で繋ぎます。
このプログラムでは2か所ユーザー入力の箇所がありますが、それらがbirthmonthとbirthdayに代入されています。
この配列内は山羊座から順番通りに並んでいますので、決してランダムに並んでいるわけではありません。
day1には各星座の月の末日を配列に入れています。
day2には1月から12月までの末日を配列に入れています。
=>例えばmonthに1が入り、dayに19が入っているとします。
そうすると
の部分でcountが0の時にifの条件式がtrueになりますので、入れ子のif文の条件式の判定に入ります。
このようにif文は入れ子にすることが出来ます。
つまり、初めのif文がtrueの場合に次のif文でさらに条件式を判定します。
「day <= day1[count]」の中のdayには19が入り、1周目の
にはday1の0番目の要素である19が入っていますので、条件式はtrueになり、nameにはnames配列の0番目の要素であるやぎ座が入ります。
例えばdayに19ではなく23が入っていると仮定すると
はfalseになるので、
の条件式の判定に入ります。
ここでday2[count]にはday2の0番目の要素である31が入っていますのでtrueになり、name には
に該当する星座が入ります。
のcountには1周目では0が入っていますので
で余りを求めると1になります。
結果、names[1]となり、みずがめ座が入ることになります。
ではさらに、以下の箇所の詳しい説明をします。
「count + 1」の箇所の説明をしますと例えばmonthが1で、day が23の場合には
が
になりfalseになるので、elsifのブロックに入りますが、1月は やぎ座とみずがめ座しかなく、やぎ座ではないのならばみずがめ座しかないのでnames配列を1つ進めるために
で1を足しています。
names.lengthを使っている理由は例えば
の中のcountに11が入ると
の箇所が12になりますが、
の箇所が無いと仮定すると
となってしまいますが、実際に
という要素はありません。
そこで
で余りを0(12割る12で余り0)にして山羊座が出るように設計しています。
つまり、該当する以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。
最後にreturnで返ってきたnamesの値がjuに入り、printで出力します。
結果は以下の通りです。
タグ: メソッド
メソッドについて知ろう
この章ではメソッドについて説明します。
メソッドとは引数と言うデータを受け取って、ある一定の処理を行い、戻り値を呼び出し元に返す命令のことを言います。
引数とはメソッドを実行するときにメソッドが使うデータのことを言います。戻り値とは、メソッドを実行した結果、返される値です。
簡単に言いますと「このデータ(これは引数に相当します)を渡すので、この作業をやってくださいね」と命令するとメソッドという機械が作業をしてくれて、その結果(戻り値)を返してくれるというのが一連メソッドの流れです。
例えば「消費税を自動で計算するメソッド」を自分で作りたいとします。
その場合、商品の代金をメソッドに渡すと商品金額に税率を掛けた処理をして、その結果を返すというメソッドを作ることになります。
このような一連の処理を作ることをメソッドを定義すると言います。
通常メソッドはクラス(クラスについては「クラスについて知ろう」で説明します)の中に書きますが、クラスの中ではなくても書くことが出来ます。
クラスの中ではない位置はトップレベルと呼ばれています。これまでの学習ではまだクラスの説明をしていないので、すべてトップレベルで記述してきました。
ここではクラスの中のメソッドではなく、トップレベルでのメソッドの記述方法について説明します。
〇このメソッドの構文の中にある引数を仮引数と言います。
先ほどの書きましたが引数とはメソッドの中で使われるデータのことです。
引数1を第1引数、引数2を第2引数と言いますが、引数の数はメソッドにより変わります。
〇メソッド名の付け方は基本的には変数の命名規則と同じですが、変数と違って大文字のアルファベットも可能です。
〇引数が複数ある場合はカンマで区切りますが、引数が必要ないメソッドであるならば引数は省略することができます。
実はメソッドは定義しただけでは機能しません。
メソッドを実行するためにはメソッドを呼び出さなくてはいけません。
今のところはクラスの説明をしていないので、この章ではトップレベルにメソッドが書かれていた場合でのメソッドの呼び出し方について説明します。
〇メソッドの呼び出しの中にある引数を実引数と言います。
〇引数が複数ある場合はカンマで区切りますが、引数が必要ないメソッドであるならば引数は省略することが出来ます。
では例をみてみましょう。
=>このメソッドは足し算を行うと言う機能を持っています。
このメソッドの中にある引数a,bはこのメソッドが実行されている間だけ有効な引数なので関数の外で出力することは出来ません。これをローカル変数と言います。
このメソッドを呼び出している箇所が
です。
つまり、
という形式でメソッドを呼び出します。
この引数の2はメソッドの中の引数aにセットされ、3はメソッドの中の引数bにセットされます。
そして、このメソッドを実行した結果を
の箇所で出力しています。
この例の結果は5が出力されます。
ここで注意してほしいことはメソッドの呼び出しよりも、メソッドの定義を後に書かないでください。
つまり、以下の例はエラーになります。
次は仮引数にあらかじめ初期値を設定する方法について説明します。
初期値を設定するすると、メソッドの呼び出しの際に実引数を設定する必要はありません。
では例をみてみましょう。
実引数が
のようにカラですのでメソッドの仮引数が使われます。
つまり、aが2、bが3と、仮引数が設定してありますので、この値が使われます。
このように仮引数に値が設定してあれば実引数を省略することが出来ます。
結果は5が出力されます。
仮引数に初期値を設定した場合でも、実引数を設定しても問題ありません。
その場合は実引数が使われます。
では例をみてみましょう。
実引数と仮引数の両方に引数の値を設定していますが、実引数の5と8が優先されますので、結果は13です。
次の例は仮引数を2つ設定して、実引数を1つしか設定しなかった場合はどうなるか見てみます。
この場合は仮引数aに8が代入されるので、仮引数 aの2は使われません。
bはそのまま3が使われます。
結果は11です。
次は実引数と仮引数の数が合わない場合の例です。
実引数が3つで、仮引数が2つなので、実引数が1つ多いです。
結果は次の通りエラーです。
意味は引数の数が間違っていますと書かれています。
次は仮引数を設定する場合の注意点について説明します。
では例をみてみましょう。
仮引数の設定値はすべてを設定する必要はなく、例えば例のように2つの引数の中の1つだけを設定することも出来ます。
しかし、メソッド内の引数の設定は右端からしてください。
つまり
のように、第1引数(先頭の引数)だけを設定して、後の引数を設定しないという形式は取ることができません。
次は実引数に変数を使った例について説明します。
のように実引数に変数を使用することも出来ます。
次はメソッドに配列を渡す方法について説明します。
では例をみてみましょう。
では説明をしていきます。
そして、計算の後にその結果を呼び出し元の
に戻します。
このようにメソッドの実行結果をメソッドの呼び出し側に返すにはreturnを使います。
具体的には
と言う形式で書きます。
例では
の箇所です。
結果は「答えは530」です。
この例の流れを図にしましたので参考にしてください。
次の例もメソッドに配列を渡しているのですが、前の例とは違う形態で渡します。
では例をみてみましょう。
前の例では配列をメソッドに渡した後に、その配列から要素を取り出すためにfor文を使っていましたが、この例ではメソッドに引数を渡すときに実引数の先頭に「*」を付けて、仮引数で個別に要素を受け取ります。
配列である実引数の先頭に「*」を付けると仮引数では配列の要素が分解されて渡されます。
メソッド側には配列の要素の数だけ仮引数を用意してください。
2は仮引数aに入り、3は仮引数bに入り、8は仮引数 cに入ります。
結果は「答えは13」です。
前の例では実引数の先頭に「*」を付けましたが、今度は仮引数にも「*」を付ける例を紹介します。
実引数の配列名の前に「*」を付けるまでは前の例と同じですが、仮引数にも「*」を使用します。
仮引数の変数aには
が入り、残りの要素は
に配列として入ります。
配列の実引数に「*」を付けて渡して、仮引数では「普通の変数と「*」を付けた変数」で受け取ると配列の要素を分けて代入することができます。
その後、配列の要素をfor文で処理しています。
結果をreturnで返しているのですが、この例の場合は2つの変数を
のように返しています。
複数の変数を返す時にはカンマで区切って記述してください。
その戻り値をどのように受け取るかと言いますと、
という形式で受け取ります。
この方法は複数の値を一度で受け取ることができます。これを多重代入と言います。
この例では以下の箇所です。
多重代入についてもう少し例を出して説明します。
では以下の場合にはどうでしょうか。
では次の例をみてみましょう。
では次の例をみてみましょう。
次の例はメソッドの中でヒアドキュメントを使った例です。
この例は与えた実引数の値をヒアドキュメントで出力しています。
結果は以下の通りです。
クラスについて知ろう
この章ではクラスについて説明します。
今までのプログラムでは変数とメソッドを扱ってきましたが、クラスと言う機能を使うことで、多くの変数とメソッドを1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る設計図に例えられます。
設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば、「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を「変数」で書き、「ふるまい」をメソッドで書くことになります。
どのような「状態」や「ふるまい」を作りたいかはオブジェクトの役割です。
例えば「線を引く」「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
クラスの構文は以下の通りです。
クラスの中に変数やメソッドを書いていきます。
クラスの中の変数をフィールド変数と言います。
次にアクセスレベルについて説明します。
アクセスレベルとは変数やメソッドで使われますが、それらの変数やメソッドに対して、どこからアクセスできて、どこからアクセスできないかを決める修飾子です。


次はオブジェクトについて説明します。
オブジェクトはnew演算子を使って作成します。
オブジェクトとはクラスの中の「状態」を表す変数や「ふるまい」を表すメソッドに指示を出す役割があります。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
オブジェクトを作る過程をインスタンス化と言います。
ではクラスで作ったプログラムの例を見てみましょう。

このプログラムは銀行でのお金の入金や出金のシステムを簡潔に作っています。2つのクラスがありますが、1つはMainメソッドのあるProgramクラスで、もう1つはGinkouクラスです。
初めにプログラムが実行されるMainメソッドのあるProgramクラスが司令塔になって、他のクラスに指示を出していくことになります。
クラスのフィールド変数には以下の構文でデータを入れます。

クラスのメソッドを実行するためには以下の構文で行います。
その結果、それぞれ以下のメソッドが実行されます。
これらのメソッドはインスタンス化(オブジェクトが作られてから)されてから実行されるのでインスタンスメソッドと呼ばれています。
それぞれのフィールド変数にデータが入ったところで、最後にresultメソッドで出力しています。
結果は以下の通りです。







この例ではProgramクラスを消して、Ginkouクラスにまとめています。
次はアクセスレベルのprivateについて説明します。
これまでのクラスのフィールド変数はpublicにしていますが、これは本来はよろしくありません。
クラスの外側から直接値を入れることが出来てしまうからです。
そこで、フィールド変数はprivateにして、メソッドからこれらのフィールド変数に値を入れる方が最良です。
そして、メソッドはpublicにするのが基本です。
例を見てみましょう。














この例ではすべてのフィールド変数にthisを付けていますが、前の例のように省略が出来ます。



星座判定をメソッドで作ろう
「if文で星座を判定をしよう」の章ではif文で星座判定のプログラムを作成しましたが、これをメソッドを使って書き換えます。







例えばmonthに1が入り、dayに19が入っているとします。
そうすると
の箇所はiが0の時にifの条件式がtrueになりますので、以下の入れ子のif文の条件式の判定に入ります。
「day <= day1[i]」の中のdayには19が入り、「day1[i]」にはday1の0番目の要素である19が入っていますので、条件式はtrueになり、nameにはnames配列の0番目の要素であるやぎ座が入ります。
例えばdayに19ではなく23が入っていると仮定すると
はFALSEになるので、
の条件式の判定に入ります。
ここで「day2[i]」にはday2の0番目の要素である31が入っていますのでTRUEになり、nameには
に該当する星座が入ります。
1周目では
のiには0が入っていますので
となり、nameにはみずがめ座が入ることになります。
ここで
の説明をします。
「i +1」の箇所の説明をしますと例えばmonthが1で、day が23の場合には
が「23<=19」になり FALSEになるので elseifのブロックに入りますが、 1月はやぎ座と水瓶座しかなく、 やぎ座ではないのならば水瓶座 しかないのでnames配列を 1つ進めるために「i +1」で1を 足しています。
「%12」を記述している理由は
の中のiに11が入ると「(i +1)」の箇所が 12になりますが、「%12」の箇所が 無いと仮定するとnames[12]となってしまいますが、実際にnames[12]という 要素はありません。
そこで「%12」で余りを0(12割る12で余り0)にして
「やぎ座」が出るようにしています。
つまり、該当する以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。
結果は以下の通りです。
メソッドについて知ろう4
メソッドについて知ろう3
この章では配列をメソッドに渡す方法について説明します。
では例をみてみましょう。
配列をメソッドに渡すには
という形式で書きます。
この例ではnumber配列をmaxメソッドに渡すので
と書きます。
配列を渡したら、メソッドの仮引数では
のように配列で受け取ります。
maxメソッドの機能は受け取った配列の要素の中で一番大きい数の添え字を返します。
for文の中のifで以下のような順番で大きさを比べています。
そして最後に以下の箇所で出力されます。
number[world1]のworld1には一番大きい配列のインデックス番号が入っているので、
となり89が出力されます。
次の例では配列の要素をメソッドに渡して、その配列の値をメソッド内で変更した時に元の配列はどうなるのかについて説明します。
配列は値渡し(変数をメソッドに渡すことを値渡しと言います)ではなく、参照渡しという方法で渡されます。
参照渡しと言いましても特別なことをするわけではなく、配列をメソッドに渡すだけです。
参照渡しでメソッドに配列を渡して、メソッド側でその配列のデータを書き換えると元の配列のデータまでが書き換わります。
普通の変数を値渡しでメソッドに送ってもメソッド側で書き換えることは出来ません。
例では配列の要素である
がkakikaeメソッドの
の箇所ですべて4に変えていますが、このようにメソッド側で配列の値を変えることで、呼び出し元の配列の要素も4に変更されます。
結果は以下の通りです。
次の例で呼び出し元の変数を値渡しで渡して、メソッド側でその変数の値を書き換えることができるのか見てみましょう。
では説明を始めます。
int x = 99;
int y = 90;
をkakikae (x, y) ;の箇所でkakikaeメソッドに送っています。 そして、kakikaeメソッドでは 以下のように4を代入しています。
a=4;
b=4;
ここで変数に4を代入しても、 呼び出し元のint x 、int y の値は変更されずにそれぞれ 99、90のままです。
つまり呼び出し元から渡した変数の値をメソッド内で変更しても呼び出し元の変数の値は変化しません。
これが値渡しです。
しかし、値渡しを参照渡しに変更する方法がC#には備わっています。
実引数と仮引数に以下の例のように「ref」と言うキーワードを付けます。
では例をみてみましょう。
実引数と仮引数に「ref」を付けるとkakikaeメソッド 内で変数 a,bに値を代入した場合、 Mainメソッド内の変数x,yの値も書き換わります(スペースの都合でkakikaeメソッドの引数を2行で書いていますが1行で書いてもいいです)。
結果は以下の通りです。
refの付いた変数を渡す場合はその変数には何かしらの値が入っていないといけません。
しかし、値の入っていない変数をメソッドに渡したい場合はrefの代わりにoutを使用してください。outもrefと同じで参照渡しです。
結果は以下の通りです。
メソッドについて知ろう2
メソッドについて知ろう1
この章ではメソッドについて 説明します。
メソッドとは「引数」というデータ を受け取って「ある一定の処理」を行い、「戻り値」を返す機能のことを 言います(戻り値を返さないメソッドもあります)。
「引数」とはメソッドを実行するときに使われるデータのことで、「戻り値」とはメソッドを実行した結果 返される値です。
簡単に言いますと 「データ (引数)を 渡すので、この作業をやってくださいね」 と言うとメソッドが作業をしてくれて、 その結果(戻り値)を返してくれるというのがメソッドの機能です。
この一連の流れをメソッドに書いていくわけです。
今までParseメソッドなど幾つかのメソッドを紹介しましたが、これらは初めからC#で用意されているメソッドです。
例えばParseメソッドは文字列を他の型に変換するメソッドです。
この章で紹介するメソッドはユーザー定義メソッドと呼ばれていまして、Parseメソッドのような機能を持つメソッドを自分で作っていきます。
ではメソッドを使う例とメソッドを使わない例を比べてみましょう。
初めはメソッドを使わない例からみてみましょう。
ではメソッドを使わない例の説明をします。
これは2つの数値の平均値を求めるプログラムです。
上記のように同じ内容の処理を3回書くのは面倒ですし、プログラムの可読性が悪くなります。
これをメソッドで書き換えれば処理部分の記述は1か所で済みますので、プログラムの可読性が良くなります。
結果は以下の通りです。
では先ほどの例をメソッドを使って書き直してみましょう。
何度も同じ動きをする文を1つにまとめるのがメソッドの役割の1つなので、先ほどの3か所ある同じような文を1つのメソッドにまとめると以下のようになります。
このようにメソッドの中には機能の部分を書いていきます。
ではメソッドの作成方法について説明します。
メソッドを使うためにはメソッドの定義を行わなくてはいけません。
それが以下の構文です。
このブロックの中にメソッドの具体的な内容を書いていきます。
引数が複数ある場合は「,」を使って、データ間を区切りますが、この引数を仮引数と言います(この構文ではスペースの都合で仮引数の部分を2行目に書いていますが、通常は1行で書きます)。
「戻り値型」についてはこの章の後半で、「アクセスレベル」「static修飾子」については「クラスについて知ろう」で詳しく説明しますので、今の時点では形だけ覚えて頂くだけで結構です。
次はメソッドを実行する方法について説明します。
メソッドは定義しただけでは何も動きません。
メソッドを使いたい時にはメソッドを呼び出さなくてはいけません。
以下の基本構文でメソッドを呼び出します。
カッコの中にある引数を実引数と言います。
この実引数をメソッドに渡して、メソッドに処理をしてもらいます。
この例では引数をheikinメソッドに渡して、平均値を求める作業をしてもらいます。


この渡されたデータを元にメソッド内では平均値を求める処理を実行します。
その他の以下のメソッドも先ほど説明した原理で実行されますので、結果的に3回メソッドが実行されて、結果も3回出力されます。



しかし、仮引数と実引数の型が違っても 小さい型の実引数から大きい型の仮引数への自動変換は出来ます。
この例の場合はint型の「99と96」を「99.0と96.0」に自動変換 してくれます。
次はreturnについて説明します。
先ほどのheikinメソッドはメソッドを実行した時に発生した値を呼び出し元に返していませんでしたが、今度はメソッドを実行した時に発生した値を呼び出し元に返す方法について説明します。
では例をみてみましょう。
結果は以下の通りです。
return文のあるメソッドの構文は以下の通りです。
この例ではheikinメソッドを実行した結果が変数dに代入されていますが,この計算結果を呼び出し元に返したい時にはメソッド内に
と記述します。
return文のその他の書き方として、戻り値の箇所に変数を指定する代わりに
のように計算式を書くこともできます。
そして、計算結果dの値が呼び出し元に戻されて、そのdの値が変数gに代入されます。
そして、そのgの値を
で出力しています。
次に基本構文の中の戻り値の型について説明します。
最初の例の戻り値の型は「void」でしたが、戻り値を返す必要がない場合には戻り値の型を「void」にします。
先ほどの例での戻り値の型は「int」ですが、これは返す値の型に合わせます。
つまり、返す値であるd変数はint型なので、戻り値の型は「int」にします。
次にメソッドでの注意点について説明します。
メソッドの中で宣言される変数はそのメソッドの中でしか使用できないので注意してください。
例えば以下の例のMainメソッドやheikinメソッドの中にある変数は各メソッド内でしか使用することは出来ませんので、他のメソッド内で使うとエラーになります。
以下の例はMainメソッドの中でheikinメソッド内のd変数を使っているのでエラーになります。
また、Mainメソッドとheikinメソッドの中で同じ名前の変数名を使っていますが(変数aと変数b)、メソッド内で宣言をした変数は例えメソッド間で同じ名前の変数を使っても全く違う変数として使うことが出来ます。
つまり、同じ名前の変数ではありますが、まったく違う変数としてみなされます。
メソッドを使って星座プログラムを作ろう
「if文で星座を判定しよう」で星座を出力させるプログラムを書きましたが、これをメソッドを使って書き替えてます。
この章はメソッドの学習ですので、BufferedReaderについては「キーボードの入力の値を受け取ろう」の章で説明します。





この例は星座の判定を judgeメソッドに任せています。
このように判定の部分をif文で長く書くのではなく、メソッド化することでコンパクトになりプログラムがすっきり書けます。
少しずつ分解しながら、説明していきます。
〇以下の箇所は「if文で星座を判定しよう」で説明したので、説明は省略します。
〇メソッドを呼び出しているのは以下の箇所です。
judge(month, birthDay);
judge(month, birthDay);の中のmonthのデータがjudgeメソッドの引数int monthに入り、birthDayのデータがint dayに入ります。
〇 judgeメソッド内の
の要素は星座名で配列を作成しています。
この配列内の要素は山羊座から順番通りに並んでいます。
決して、適当に並んでいるわけではありません。
〇judgeメソッド内の
には各星座の月の末日を配列に入れています。
judgeメソッド内の
には1月から12月までの末日を配列に入れています。
〇次に以下の箇所の説明をします。
例えばmonthに1が入り、dayに19が入っているとします。
そうすると
の部分はiが0の時にifの条件式がTRUEになりますので、以下の入れ子のif文の条件式の判定に入ります。
「day <= day1[i]」の中のdayには19が入り、1周目の
にはday1の0番目の要素である19が入っていますので、条件式はTRUEになり、nameにはnames配列の0番目の要素であるやぎ座が入ります。
例えばdayに19ではなく23が入っていると仮定すると
はFALSEになるので、
の条件式の判定に入ります。
ここで
にはday2の0番目の要素である31が入っていますのでTRUEになり、name には以下の条件に該当する星座が入ります。
この中のiには1周目では0が入っていますので
で余りを求めると1になりますので
となり、みずがめ座が入ることになります。
の箇所の説明をしますと例えばmonthが1で、day が23の場合には
が
になりFALSEになるので、else ifのブロックに入りますが、1月は やぎ座と水瓶座しかなく、やぎ座ではないのならば水瓶座しかないのでnames配列を1つ進めるために
で1を足しています。つまり、該当する以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。
〇もし、judgeメソッドのmonthに100、dayに100などif文の条件式にマッチしないデータを入れるとnameには何も入りません。
そうなった場合にはnameには初期値のカラ文字
が入っているので、if文の条件式にマッチして「間違い」が出力されます。
staticについては「staticについて知ろう」の章で説明します。
次はmainメソッドの外で変数を宣言するとどうなるかについて説明します。
name変数はmainメソッドの外で宣言しているので、プログラムのどこからでも使用することが出来ます。
このような変数をグローバル変数と言います。
プログラム全体で変数を使いたい場合にはメソッドの外で宣言をしてください。
これまでメソッド内で使っていた変数はローカル変数と呼ばれています。
ローカル変数とはメソッド内で宣言して、メソッドの中に使用が限定されている変数です。
この例ではname変数を judgeメソッド内で使っているので、mainメソッド内でname変数の値を使うためにはグローバル変数にする必要があります。
メソッドについて知ろう
この章ではメソッドについて説明します。
これまでたくさん使ってきたmainメソッドもメソッドの1つなので、mainメソッドの説明から始めます。
これまでmainメソッドは詳しく説明しませんでした。
その理由はプログラムの基礎を理解していないとメソッドの説明はできないからです。
ではmainメソッドについて説明します。
mainメソッドは以下の通り定義します。
Javaのプログラムはmainメソッドから始まる決まりになっています。
mainは他の名前で代用することができませんので、必ず必要な名前になります。
publicはクラスの外からのアクセスすることができることを意味します。
publicについては「クラスについて知ろう」の章で説明します。
つまり、publicの付いたメソッドはどこからでも利用することが出来ると言うことです。
staticは クラスのオブジェクトを作ることなくアクセスすることができると言う意味です。
staticについては「staticについて知ろう」の章で、オブジェクトについては「クラスについて知ろう」の章で詳しく説明します。
String args[]はコマンドラインで入力した時に、この場所に引数というデータを入れることが出来るのですが、String args[]という形式なので文字列の配列が入ります。
ここはStringしか定義できません。
つまり、int型にしたりはできません。
コマンドライン入力については「コマンドライン入力について知ろう」の章で説明します。
voidはメソッドが戻り値を返す必要が無い時に使います。
voidも戻り値も後で詳しく説明します。
mainメソッドはプログラムの中で最初に実行され、戻り値を返す必要がないので、voidになっています。
mainメソッドは必ず書かなくてはいけないメソッドなので、少し特殊ですが、他にもメソッドは自身で作ることが出来ます。
メソッドとは与えたデータ(引数)に基づいて決められた処理を行い、戻り値を返す機能を持っています。
例えば消費税を自動で計算するメソッドを自分で作りたいとします。
その場合、メソッドは商品金額に消費税率を掛けた処理をして、その結果を返すという機能を持ったメソッドを作ることになります。
もう一例挙げます。
エクセルをご存知の方はわかると思いますが、エクセル関数にSUMと言う関数が有りますが、この関数は指定した範囲のデータに基づいて足し算を行う関数です。
例えば指定した範囲のデータが3,5,7であるならば結果は15です。
このSUM関数のような機能を自身でメソッドに書いていきます。
では実際に例を見てみましょう。
初めにメソッドを使わない例を作成して、メソッドの例と較べます。

この例は3つの数字の平均を求める記述を行なっていますが、このように何度も同じ処理を書くのは面倒ですし、3つの数字の平均ではなく、3つの数字の合計を求める仕様に変更となったときに、変更点のすべてを書き直さなくてはいけません。
この例はまだ短いプログラムなのでいいですが、これが何百行あった時にすべて書き直すことは大変な作業になります。
このような時にメソッドを使うと便利です。
では、先ほどの例をメソッドを使って書き直します。


何度も同じ動きをする文を1つにまとめると言うのがメソッドの役割の一つです。
メソッドを使わない例では3か所あった同じ処理を以下のようなメソッドを使うと1箇所で済みます。
同じ文を何回も書かなくてもいいので、プログラムの可読性が良くなります。
ではメソッドの作り方について説明します。メソッドを作成する基本形は以下の通りです。
メソッドの基本構文の詳細はこの後すぐに説明しますので今は形だけを覚えておいてください。
スペースの都合で
の部分が2行目に書かれていますが、通常はこの例のようにメソッド名の横に書いてください。
また、
の部分を「仮引数」と言いますが、引数とはメソッド内で使われるデータです。
そして、このメソッドを実行したい時には
のように記述すればheikinメソッドを呼び出して実行することが出来ます。
つまり、以下の基本構文でメソッド内の内容を実行します。
引数とはメソッドに渡すデータの事ですが、引数が複数ある場合には
のように
を使って、データ間を区切ります。
このメソッドの呼び出しのカッコの中にあるデータ
を「実引数」と言います。
実引数は別に変数である必要はなく、
のようなリテラルでも問題ありません。
リテラルとは「99」や「”猫”」のようなデータそのものを意味します。
では先ほどの例でメソッドの流れについて説明します
実引数のxの値はメソッド本体の
にセットされ、yの値は
に、zの値は
にセットされることになります。
このように変数の値を渡すことを値渡しと言います。
そして、そのセットされた変数は実際のメソッドの中で使われることになります。
また、実引数と仮引数の変数名が一致していなくても問題ありません。
ここで注意点して欲しいことがあるのですが、実引数と仮引数の型と順番と数は一致させてください。
例えば次のような引数の数の不一致はいけません。
そして、仮引数がint型で実引数がString型と言うような型の不一致もできません。
しかし、仮引数と実引数の型が違っても、以下のように小さい型の実引数から大きい型の仮引数への自動変換は出来ます。
この例の場合はint型の99と96をdouble型の
に自動変換してくれます。
次にメソッドの利点について説明します。
メソッドを作成する便利な点は例えば3つの数字の平均を求めるメソッドから3つの数字の合計を求めるメソッドにプログラムを変更する際にも以下のようにメソッドの一部分を変えるだけで簡単に変更できるということです。
次にメソッドの基本構文について詳しく説明します。
〇アクセスレベルとは 変数やメソッドに対してどのような場所からアクセスすることが可能であるかを指定することですが、ここではpublicを指定しています。
publicとはどこからでもアクセス可能であると覚えておいてください。
他にもprivateやprotectedなどを指定できますがpublicも含めてクラスの章で詳しく説明します。
static修飾子については「staticについて知ろう」の章で説明します。
〇戻り値型とはメソッドの実行結果を次の例で説明するreturnで呼び出し側に戻すことができるのですが、その戻す値のデータ型を記述します。
戻す値がない時はvoidを指定します。
〇メソッド名はshowTemperatureのように小文字から始まり、単語の区切り目は大文字であることが慣習になっています。
このように書かなくてもエラーにはならないので、自身で解りやすい名前を付けましょう。
またメソッド名にはgetとかshowとか動詞が使われることが多いです。
次はメソッドを実行した時に発生した値を呼び出し元に返す方法について説明します。
例を見てみましょう
値を呼び出し元に返す構文は次の通りです。
先ほど説明したメソッドの例と違うところはreturnがあるか、無いかの違いです。
計算結果を呼び出し元に返したい時には
という形式で書きます。
戻り値とは文字通り、呼び出し元に返したいデータです。
この例では
と書いています。
このreturnで返す戻り値がどの型なのかを指定するのが基本構文の「戻り値型」です。
この例では返す値がint型なので「戻り値型」もintになっています。
戻り値を返さないのであればvoidと書きます。
戻り値である変数dは呼び出し元に戻って、変数gに代入されます。
上の例は結果を変数に入れて、returnで返していますが、以下の例のようにreturnに直接、式を書いて返してもいいです。![]()
このような変数をローカル変数と言います。
例えばheikinメソッドのa,b,c,dの変数はheikinメソッド内でしか使用することは出来ません。
ですので、他のメソッドでa,b,c,dの変数名を使用しても、まったく別の変数になるので問題ありません。
この例でもmainメソッドとheikinメソッドでは同じ変数名a,b,cが使われていますが、全く問題ありません。
では次に進みます。
これまではmainメソッドから他のメソッドを呼び出していましたが、mainメソッド以外のメソッドから他のメソッドを呼び出すことも出来ますので、次の例を見てください。

この例ではmainメソッドからmenseki1メソッドを呼び出していますが、さらにmenseki1メソッドから、menseki2メソッドを呼び出しています。
このような呼び出し方も出来るので覚えておいてください。
では説明を始めます。
mainメソッドの中でmenseki1メソッドを呼び出しています。
menseki1メソッド内では
の結果を
に代入しています。
さらにmenseki1メソッド内でmenseki2メソッドを呼び出して
に結果を代入しています。
最後にdとeを足したものをfに代入して、その値をreturnで呼び出し元に返して変数gに入れています。
結果は以下の通りです。
次は配列をメソッドに渡す方法について説明します。
では例をみてみましょう。
このメソッドは配列の要素の中で一番大きい数の値を求めるメソッドです。
〇配列をmaxメソッドに渡すには
のように引数に配列を書きます。
〇配列を渡しているのでメソッドの仮引数は
のように配列で受け取ります。
〇比べるための一番初めの基準の数値は
なので
の値である2になります。
そして、for文の中で以下のような順番でループして大きさを比べています。
1周目の
は
となり、
の方が大きいのでtop1には1が入ります。
2周目の
は
となり、
の方が大きいのでtop1には2が入ります。
3周目の
は
となり、
の方が大きいのでtop1には3が入ります。
4周目の
は
となり、
の方が大きいのでtop1には4が入ります。
5周目の
は
となり、
の方が大きいのでtop1には5が入ります。
最終的にtop1には5が入ります。
そして、
の箇所でtop1の値がworld1に代入されます。
number[world1]のworld1には一番大きい配列のインデックス番号が入っているので、
となり、89が出力されます。
次の例は配列の要素をメソッドに渡して、その値をメソッド内で変更した時に元の配列はどうなるかについて説明します。
結果は「444444」です。
配列をメソッドに渡すときには値渡しではなく、参照渡しになります。
変数をメソッドに渡す場合は値渡しです。
呼び出し元の配列numberをrt配列に渡していますが、このrt配列をkakikaeメソッド内で変更するとnumber配列の値まで書き替えることができます。
これが参照渡しになります。
変数を渡す値渡しの場合はメソッド側でその変数の値を書き替えることが出来ません。
例ではnumber配列の要素である
をkakikaeメソッドの中のrt配列に渡してすべて4を代入していますが、このようにメソッド側で配列の値を変えることで、呼び出し元の配列の要素もすべて
に変更されます。
次の例では呼び出し元の変数をメソッド側で書き替えることができるか(書き替えることは出来ませんが)見てみましょう。
kakikae(x,y,z);の箇所で引数をkakikaeメソッドに送っています。
これは値渡しで渡しています。
そして、kakikaeメソッドで以下のように4を代入しています。
a=4;
b=4;
c=4;
ここで変数に4を代入しても、呼び出し元のx 、y、z の値は変更されず
のままです。
つまり、値渡しの場合はメソッド側でその変数の値を書き替えることが出来ません。
その場合には呼び出し側の引数もカラにしてメソッドを呼び出します。












