Javaのメソッドとクラスを学ぶ　5/26

メソッドを使ってみよう
①メソッドのイメージ
・メソッドとは、何らかの処理を割り当てた部品です
・これまでmainメソッドだけに記述してきた処理部分を、メソッドに切り分けていきます
・Javaのファイルを実行すると、自動的にmainメソッドが実行されます
・mainメソッドの処理をメソッドに切り分けると、mainメソッドが各メソッドに指示を出し、各メソッドが個々の処理を実行するという構造になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/80b03d06-b426-68a9-837c-09b7844058f4.png)
②メソッドを使ったプログラム
・メソッドに切り分けたコードと、そうでないコードを比較してみましょう
・左の図は、mainメソッドの中に処理が羅列されていて、処理の内容やまとまりがわかりにくいですね
・メソッドに切り分けることでコードが整理されます
・また、メソッドは何度でも使いまわすことができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/1a2a8407-4d79-944d-b9c6-9ef58982ab5c.png)
③メソッドを呼び出してみよう
・メソッドとは、処理をまとめた部品だと考えれば、決して難しくはありません
・左の図では、helloというメソッドを定義し、mainメソッドでhelloメソッドを呼び出しています
・詳しくはまだわからなくて大丈夫です
・右の図の流れを確認して、まずは演習でメソッドを体験してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/ec90c1a7-3e14-bbc5-995c-7ea833cca41d.png)
④メソッドの定義
・メソッドについて詳しく学んでいきましょう
・まずはメソッドの定義です
・「public static void」の部分はまだ定型として覚えておきましょう
・またメソッド名の後の()についても後ほど学びます
・ブロック（{}で囲まれた部分）の中に、そのメソッドが行う処理を記述します
・メソッドの名前は好きに付けることができますが、処理の内容が想像できるような名前をつけましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/0ba7b55d-85d5-7f4d-9021-611592bcc4ea.png)
⑤メソッド定義の場所
・メソッドはクラスの中に定義します
・下図の具体例では、helloメソッドはMainクラスのブロック（{}）の中に定義されています
・このようにクラスの中に定義しないとエラーになりますので気をつけましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/57815648-5518-9a67-4259-1ce9ece6d828.png)
⑥メソッドの呼び出し
・メソッドを呼び出すためには、メソッド名()とするだけです
・呼び出しの時の()を忘れないようにしましょう。詳しくは後ほど学びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/1ba9a4db-663d-39da-d515-e885c33c748d.png)
--------------------------------------------------------------------------------------------
引数を使おう
①引数とは
・引数（ひきすう）とはメソッドに与える追加情報のようなものです
・メソッドを呼び出すときに、一緒に引数を渡すと、メソッドの中でその値を利用することができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/c47832ba-bff8-0230-1d4c-ac6639d6b6e2.png)
②引数を受け取るメソッド
・メソッドに引数を渡すには、まず引数を受け取れるメソッドを定義しなければなりません
・そのためには、メソッドの定義部分で、引数を受け取るための箱となる変数（仮引数（かりひきすう））を指定します
・下図のように、「public static void メソッド名()」の()に仮引数を指定します。仮引数は、変数定義と同様に、データ型を指定する必要があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/0100d819-26f2-8c33-4be9-bf9ff6b716d1.png)
③メソッドに引数を渡す
・メソッドに引数を渡すには、メソッド名(引数)としてメソッドを呼び出します
・渡された引数は、メソッドの仮引数で指定した変数に代入され、その変数はメソッドの処理の中で用いることができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/3ec972d7-afe6-5fb1-f836-1e1566c96585.png)
--------------------------------------------------------------------------------------------
複数の引数
①複数の引数をもつメソッド
・引数は複数渡すこともできます
・メソッドが複数の引数を受け取るためには、仮引数をコンマ（,）で区切って定義します
・また、引数は左から順番に「第1引数、第2引数・・・」というように呼びます。覚えておきましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/a38efe45-c7f6-6143-676a-99cf612c3e69.png)
②複数の引数を渡してみよう
それでは、メソッドに複数の引数を渡す様子を見てみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/0a5ebe74-fa25-1169-3347-6910b019ccbd.png)
③引数を渡す順番
・仮引数は任意に順番を決められますが、メソッドを呼び出すときは、仮引数の順番通りに引数を渡さなければなりません
※例えば下図は引数を渡す順序が反対になっています。その結果、String型の仮引数に整数を入れようとするので、エラーになってしまいます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/bf987048-9acc-fea3-0f6e-c19d83de1208.png)
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－
メソッドの戻り値
①戻り値とは
・メソッドの処理結果を、メソッドの呼び出し元で使いたい場合があります
・このようなときは、メソッドが戻り値（もどりち）を返すようにします。
・メソッドを工場に例えてみましょう・工場（メソッド）は、発注者（mainメソッド）から材料（引数）を受け取り、決められた加工（処理）を行って完成品を発注者に返します。この完成品にあたるのが戻り値です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/cc1ebc02-aa8c-954d-3bfb-672679df07ba.png)
②戻り値のあるメソッド
・メソッドの中でreturnを使うと、returnの値をメソッドの呼び出し元に返すことができます
・また、戻り値があるメソッドは、戻り値のデータ型を指定します
・ここまで定型だった「public static void」のvoidの部分で指定します
・右の図のaddメソッドは、戻り値が整数なので「public static int ...」となります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/f8ff9bb7-b119-fa01-f15b-b0010af3c6c5.png)
③戻り値の具体例
・戻り値がある場合、メソッドの呼び出し部分がそのまま値に変わります
・よって、下図のようにメソッドの呼び出し部分を、変数に代入することができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/ef6dcd21-f185-926e-27d2-452db8ba2288.png)
④void
・これまで定型だったvoidとは何でしょうか
・voidは戻り値がない、という意味です
・下図のhelloメソッドには、returnはなく戻り値はありません
・このように戻り値のない（returnがない）メソッドには、voidを指定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/a211de31-804f-dfd9-d800-09f0ade374e8.png)
--------------------------------------------------------------------------------------------
メソッドのオーバーロード
 ①同名のメソッド
・同名のメソッドは原則として定義できません
・なぜなら同じメソッドが複数存在すると、メソッドを呼び出したときにどのメソッドを用いればいいのか、コンピュータがわからなくなってしまうためです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/cc1f106b-8c19-e610-7186-2a9ee88bcaa5.png)
②オーバーロード
・ただし、引数の型や個数が違う場合は同名のメソッドを定義できます
・同名のメソッドがあっても、引数が違えばどれを呼べばいいのかコンピュータが判断できるためです
・このように同名のメソッドを定義することをオーバーロードと言います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/beaf6f7a-ef9a-767a-a47e-15e8059604f2.png)
--------------------------------------------------------------------------------------------
メソッドを組み合わせよう
①メソッドからメソッドを呼ぶ
・メソッドは、mainメソッド以外のメソッドから呼び出すことも可能です
・プログラムの部品であるメソッドが、相互に助けあってプログラムを形作ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/a38fa3c2-4b5d-9adc-35d2-ed9b8bc4eb50.png)
②メソッドを組み合わせよう
・メソッドから他のメソッドを呼び出してみます
・averageメソッドは平均を求めるメソッドです
・aとbの平均は「(a + b) / 2」で求められますが、足し算の部分はaddメソッドを利用しています
・（(double)はキャストという型変換です。覚えていない人は「JavaⅠ」コースの型変換を復習しておきましょう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/7d1a691d-f619-d831-4692-2f22cf2af0ad.png)
--------------------------------------------------------------------------------------------
真偽値の戻り値
 ①真偽値を返す
・最後に、真偽値を返すメソッドも作ってみましょう
・真偽値のデータ型はbooleanなので、メソッド定義は下図のようになります
・isEvenメソッドは引数の値が偶数かどうかを調べ、偶数であればtrue、奇数であればfalseを返します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/5e7209c7-5a25-0b7d-ed8c-73f7608212f0.png)
②真偽値を返すメソッドの例
・真偽値を返す、isEvenメソッドを実際に使ってみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/bd5a597b-e329-95cc-439d-e40e3544dffc.png)
--------------------------------------------------------------------------------------------
クラスを使ってみよう
①クラスに触れてみよう
・メソッドの次は、クラスについて学びましょう
・ここまでは、Mainクラスのmainメソッド内の処理をメソッドに切り分けてきましたが、その結果Mainクラス内にメソッドが多くなってしまいました
・ここからはメソッドではなく、クラスを切り分けることを学んでいきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/56e1349f-767e-8f62-f0b9-5d2035b8e722.png)
②複数のクラスを使う
・クラスは、メソッドという小さな部品をまとめる、より大きな部品です
・これまではmainメソッドと同じクラス（Mainクラス）のメソッドを使ってきましたが、他のクラスのメソッドを利用することも可能です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/50196d9c-3ae8-41e1-2c78-62343b8018cf.png)
③他クラスのメソッドを呼び出す
・下図の例には、MainクラスとPersonクラスの2つのクラスがあり、MainクラスのmainメソッドでPerson.hello()としています
・このようにクラス名.メソッド名()とすることで、他のクラスのメソッドを呼び出すことができます
・詳しくは後ほど学びますが、まずは演習で体験してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/3291d7f6-8b1f-c598-fcd7-e398073f0fab.png)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
クラスの定義
①クラスの定義
・クラスの定義は「class クラス名」とします。
・また右の図のように、クラス名の最初の文字は大文字にし、ファイル名は「クラス名.java」としなければなりません。これらのルールはしっかり覚えておきましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/9e2c35ef-6d99-7e0c-c2d3-1ac4416d9662.png)
②Personクラスを作ろう
・Personクラスを作り、Mainクラスのmainメソッド以外をPersonクラスに移します
・こうすることで、mainメソッド以外の「ロジック（論理）」部分をPersonクラスにまとめ、実行部分とロジック部分を切り分けることができます
・このように分割することで、Mainクラスは実行用のクラス、Personクラスはロジックをまとめるクラスという役割分担が明確になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/87bb0853-a2c9-4780-6258-55e8586bb7c2.png)
③Personクラスのメソッドを呼び出す
・Mainクラスのmainメソッドから、Personクラスのメソッドを呼び出してみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/46eb23ab-ebe4-0c16-5b9b-4aac6d5d2fa0.png)
④クラスについての補足
・Javaは、ファイルではなくクラスを実行します
・また実行時にmainメソッドが呼ばれますが、正確にはmainメソッドを持つクラスしか実行できません（mainメソッドのないクラスは、他クラスから呼び出して使います）
・またクラス名に関係なく、実行時にはmainメソッドが呼ばれます（Mainクラスだからmainメソッドが呼ばれる、というわけではありません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/dd4f46d3-dfa0-e7bb-baad-e5b3769c87ce.png)
--------------------------------------------------------------------------------------------
ライブラリを使ってみよう
①外部ライブラリ
・Javaでは、他人が作ったクラスを利用することもできます
・このようなクラスを外部ライブラリと呼び、自分のプログラムに読み込むことで利用できるようになります
・すべてのプログラムを自分だけで開発する必要はありません
・世界中のエンジニアが作った便利なメソッドを利用することで、開発の幅は一気に広がります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/0209f0f8-9e17-6d89-7d5e-1463c101d259.png)
②外部ライブラリのimport
・外部ライブラリを自分のプログラムに読み込む（使えるようにする）には、importを用います
・数学的なメソッドを持つMathというクラス（ライブラリ）を読み込むには、class定義より上で「import java.lang.Math」とします
・「java.lang」の部分は、Mathクラスの場所を示しているという程度に覚えておきましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/3a2286b3-7544-2b0f-bcaa-32a8e854eae1.png)
③Mathクラスのメソッド
・Mathクラスのmaxメソッドを使ってみます
・maxメソッドは、引数に渡した2つの数値の大きい方を返してくれます
・外部ライブラリをうまく活用すれば、自分で実装する手間が省けるので便利ですね
・演習では、引数の小数点以下を四捨五入して返すroundメソッドを使います
・これはdouble型の引数を渡し、Math.round(引数)のように使います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/7014e89f-73e1-cd07-2b68-a507ae60aff5.png)
--------------------------------------------------------------------------------------------
入力を受け取ろう（１）
①import不要のクラス
・先ほど読み込んだ「java.lang.Math」はよく利用されるため、実は特別にimportせずに自動で読み込まれるようになっています
・Mathクラス以外にも「java.lang.クラス名」となる外部ライブラリはすべて自動で読み込まれます。興味のある人は調べてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/1a38d64a-1986-e9dc-80d9-4b5c9d7ca97b.png)
②コンソールへの入力とScanner
・これまではコンソールに値を「出力」してきましたが、実は左の図のようにコンソールに値を「入力」し、その値をプログラム内で使うこともできます
・コンソールへの入力を受け取るにはScannerというライブラリを用います
・Scannerは「import java.util.Scanner」と読み込みます。ライブラリは、Googleで検索すれば使い方がわかりますので、覚える必要はありません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/71457459-48c0-f527-c8a2-f417d27a82e3.png)
③Scannerで文字列を受け取る
・Scannerの使い方を見てみましょう
・まずScannerを初期化しscannerという変数にいれています
・詳しくはまだ知らなくて大丈夫ですが、Scannerではこの初期化したものを代入した変数を使ってメソッドを呼び出します
・scanner.next()とすると（Scanner.next()ではない）、コンソールに入力された文字列を受け取ることができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/bbb6d2c1-386d-fd34-3079-29abf8c5181e.png)
④Scannerの処理の流れ
・Scannerの処理の流れを確認しましょう
・scanner.next()が呼ばれると、一旦処理が中断しコンソールに値が入力されるのを待ちます。左の図では、コンソールに入力された値をscanner.next()が受け取り、変数nameに代入しています。
（図中のSystem.out.printは、改行せずに値を出力する命令です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/8c5feebc-bf03-21a4-2f15-234599d63f8f.png)
--------------------------------------------------------------------------------------------
入力を受け取ろう（２）
①数値の入力を受けとる
・Scannerを用いて、整数と小数を受け取る方法は下図です。整数を受け取るメソッドはnextIntメソッド、小数を受け取るメソッドはnextDoubleメソッドです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3438361/1a83f0c0-1cb8-1644-c64f-2ebce71ce050.png)