java アウトプット メソッド

# mainメソッド
mainメソッドには以下の２つのルールがあります。

① ファイルを実行するとmainメソッドが実行される
② mainメソッドの引数などは、必ず決められた通りに記述する必要がある

__① ファイルを実行するとmainメソッドが実行される__
今までreplitにコードを書く際に、以下のような記述を行ってきました。
```java
class Main {
  public static void main(String[] args) {  
      // ここに処理を書く
  {
}
```
この2行目を見ると「main」という文字が見えますが、これはメソッド名を表しています。

つまり、今まで書いてきたコードは、mainメソッドの中身を定義してきたことになります。
Javaのmainメソッドには、ファイルの実行時に自動的に実行されるというルールがあります。そのため、mainメソッドを実行するコードを書かなくても実行されるのです。

__② mainメソッドの引数などは、必ず決められた通りに記述する__
通常のメソッドは引数の設定などを変更できますが、mainメソッドについては書き方が決められています。

データ型等を変更してしまうとエラーになるため、以下の通りに記述する必要があります。
```java
public static void main(String[] args) {  
      // ここに処理を書く
}
```

# メソッドを使ってみよう（引数がない場合）
Javaでメソッドを使用する方法は若干複雑なので、以下の２つに分けて学習していきます。

① 引数を使用しないメソッドの使い方
② 引数を使用するメソッドの使い方

まずは、①の引数を使用しない最もシンプルな使い方について確認していきます。
```java
class Main {
  public static void main(String[] args) {  
    sayHello();
  }

  public static void sayHello() {
    System.out.println("Hello World");
    return;
  }
}
```
コードを実行すると以下のように「Hello World」と表示されます。
```console
> sh -c javac -classpath .:target/dependency/* -d . $(find . -type f -name '*.java')
> java -classpath .:target/dependency/* Main
Hello World
```

__基本的なメソッドの使い方__
メソッドを定義するための構文は以下の通りです。
```java
アクセス修飾子 static修飾子 返り値のデータ型 メソッド名() {
  // 行いたい処理
}
```
必要な記述が多いので、まずは太線部分のみに着目しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520032/5e73860b-6686-b821-462c-cc0d7ffb553a.png)

メソッドを定義するために、返り値のデータ型を指定する必要があります。
Javaでのメソッド定義は、Rubyと以下の点が異なります。
① 返り値のデータ型を指定する必要がある
② 引数がないメソッドでも定義時にかっこの省略はできない
③ Rubyの「def」「end」の代わりに、波かっこでコードを囲む

__① 返り値のデータ型を指定する必要がある__
Javaのメソッド定義では、返り値のデータ型を指定する必要がある。
例えば、「return 1;」といったように返り値が整数型であれば、メソッド名の前に「int」と記述する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520032/553162ea-3f7f-e69e-9ea4-f9b26ad367c3.png)
先ほど実行したコードのように返り値がない場合は、「中身がない」ことを意味する「void」と記述します。

__② 引数がないメソッドでも定義時にかっこの省略はできない__
必ず「sayHello()」のようにかっこが必要です。

__③ Rubyの「def」「end」の代わりに、波かっこでコードを囲む__
Rubyでは、メソッド定義の開始を示す「def」という文字が必要でした。
Javaではそのような記述の代わりに、実行したい処理を「{」と「 }」で囲みます。

# 修飾子を理解しよう
Javaには、「修飾子」と呼ばれる機能があります。修飾子は、クラスやメソッド、変数などの定義を行う際に、特定の機能を付加するものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520032/a0cd3930-d42d-0e93-91ac-01a9762f3548.png)
__アクセス修飾子__
アクセス修飾子は、外部への公開範囲を設定するためのもので、以下の３種類があります。

・public
・protected
・private

このうち、このカリキュラムでは、使用頻度の高い「public」と「private」について解説します。

この「private」という記述は、Rubyカリキュラムでも使用しました。

コントローラー内にprivateと記述することで、それ以降のメソッドをプライベートメソッドにすることができました。プライベートメソッドは、クラスの外部から呼び出すことができないメソッドです。

Javaでも基本的な考え方は一緒です。使用するアクセス修飾子によって、以下の設定を行うことができます。

| アクセス修飾子の種類   |  機能                           | 
|:---------------------|:--------------------------------|
| private              | 同一クラス内からのみアクセスできる | 
| public               | どのクラスからでもアクセスできる   | 

Javaでは、publicにする必要がないものは、極力privateを使用した方が良いとされています。
なお、このアクセス修飾子はメソッドだけでなく、クラスや変数の公開範囲を設定するために使うこともできます。


__static修飾子__
staticは「静的」という意味の英単語です。静的とは、状態が変化しないことを意味します。

メソッドの定義の際に、staticをつけることで「静的メソッド」として定義されます。静的メソッドは、「クラスメソッド」とも呼ばれます。

クラスメソッドの役割や使い方は、Rubyカリキュラムで学習した内容とおおむね一緒です。

staticを付けない場合は、「インスタンスメソッド」として定義されます。

__メソッドの実行方法を理解しよう__

メソッドを実行する方法はシンプルです。

メソッド名が「sayHello」の場合は、以下のように記述することでメソッドを呼び出すことができます。

sayHello();

引数が必要ないメソッドでも、かっこは省略できないことに注意しましょう。

# メソッドを使ってみよう（引数がある場合）

```java
class Main {
  public static void main(String[] args) {
    var answer = square(5);
    System.out.println(answer);
  }

  public static int square(int number){
    return number * number;
  }
}
```
コードを記述できたら実行しましょう。

値の２乗を計算するコードとなっているので、引数に「5」を指定すると以下のように「25」と表示されます。

__メソッドの使い方を理解しよう（引数がある場合）__
以下のように、メソッドの実行時に引数（本引数）を指定し、メソッドで引数（仮引数）を受け取る仕組みです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520032/5232672c-8c81-9d55-cb8e-1ab171102948.png)

この流れを、いま実行したコードで確認します。
メソッドの「定義」は以下のように行なっています。
```java:メソッドの定義
public static int square(int number){
  return number * number;
}
```
仮引数は、「int number」となっています。
Rubyとは違い、変数名「number」だけでなく、受け取る値のデータ型（今回はint）を指定する必要があります。

なお、このメソッドの返り値は整数型です。そのため、メソッド名の前に「int」と記述していることに注意しましょう。

また、メソッドの実行は以下のように記述しています。
```java
var answer = square(5);
```

「square(5)」と、メソッドsquare()を実行する際に、引数として「5」を指定しています。

このように、引数の使い方はRubyの場合とほぼ同じで、仮引数にデータ型の指定が必要なことだけが異なるということになります。