Java学習 メソッド

# JavaとRubyのメソッドの違い
JavaとRubyで、メソッドの役割はほとんど変わらない。
記述方法は大きく変わる。
Javaには、mainメソッドという特別な意味を持つメソッドもある。

# Javaのメソッド
## mainメソッド

Javaでは、Rubyと同様に自由にメソッドを定義して使用することができる。
ただし、Javaには「mainメソッド」という特殊なメソッドがある。
mainメソッドには特別な役割があり、記述の仕方も決められている。

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

### 1. ファイルを実行するとmainメソッドが実行される。

ここまでの学習でreplitにコードを書く時、以下のように記述をしていた。
```java
class Main {
  public static void main(String[] args) {  
      // 処理の内容
  {
}
```

2行目の `public static void main(String[] args)` の「main」の部分がメソッド名。
今までのコードは全てmainメソッドの中身を定義していた。

Javaのmainメソッドはファイルの実行時に自動で実行される。そのため、mainメソッドを実行するコードを書く必要がない。

Rubyでは、メソッドは定義するだけでは何も起きず、必ず実行する必要があった。
この点もJavaとRubyのメソッドの違う点と言える。

### 2. mainメソッドの引数などは、必ず決められた通りに記述する必要がある。

通常のメソッドは引数の設定などを変更できるが、mainメソッドについては書き方が決められている。
データ型等を変更してしまうとエラーになるため、以下の通りに記述する必要がある。

```java
public static void main(String[] args) {  
      // 処理の内容
}
```

# メソッドの使い方
Javaでメソッドを使用する方法は若干複雑なため、以下の２つに分ける。

1. 引数を使用しないメソッドの使い方
2. 引数を使用するメソッドの使い方

## 1. 引数を使用しない場合
```java
class Main {
  public static void main(String[] args) {  
    sayHello();
  }

  public static void sayHello() {
    System.out.println("Hello World");
    return;
  }
}
```

```:実行結果
Hello World
```

### 基本的な使い方
メソッドを定義するための構文は以下。
実行したコードの6~9行目の記述
```java
アクセス修飾子 static修飾子 返り値のデータ型 メソッド名() {
  // 処理内容
}
```
上記のコードの `void` が返り値のデータ型、 `sayHello` がメソッド名。
メソッドを定義するために、返り値のデータ型を指定する必要があるのはRubyと異なる点。
Rubyの場合は以下だった。
```ruby
def sayHello
    # 処理内容
end
```

JavaとRubyではメソッド定義方法に以下の違いがある。

1. 返り値のデータ型を指定する必要がある
2. 引数がないメソッドでも定義時にかっこの省略はできない
3. Rubyの「def」「end」の代わりに、波かっこでコードを囲む

### 1. 返り値のデータ型を指定する必要がある
Javaのメソッド定義では、返り値のデータ型を指定する必要がある。
`return 1;`といったように返り値が整数型であれば、メソッド名の前に「int」と記述する。
```java
public static int returnNumber() {
    return 1;
}
```
先ほど実行したコードのように返り値がない場合は、「中身がない」ことを意味する「void」と記述する。


### 2. 引数がないメソッドでも定義時にかっこの省略はできない
rubyの場合は以下のように省略できた。
```ruby
# 引数がない場合
def sayHello
    // 処理
end

# 引数がある場合
def sayHello(name)
    // 処理
end    
```

javaでは省略できないため以下のように空の () を記述する。
```java
sayHello()
```

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

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

```java
sayHello();
````

引数が必要ないメソッドでも、かっこは省略できない。




## 2. 引数を使用する場合

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

  public static int square(int number){
    return number * number;
  }
}
```

```:実行結果
225
```

### 基本的な使い方

メソッド実行時に引数（本引数）を `square(15)` のように指定し、メソッドで引数（仮引数）を `square(int number)` のように受け取る仕組み。

```java:メソッドの定義
public static int square(int number){
  return number * number;
}
```

`int number` の部分が仮引数。

変数名「number」だけでなく、受け取る値のデータ型（今回はint）を指定する必要がある点がRubyとは違う。

このメソッドの場合、返り値は整数型です。そのため、メソッド名の前に「int」と記述している。

__実行方法は以下__
```java
square(15);
```
「square(15)」のように、メソッドsquare()を実行する際に、引数として「15」を指定。

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




# 修飾子
Javaには、「修飾子」と呼ばれる機能がある。
修飾子はクラスやメソッド、変数などの定義を行う際に、特定の機能を付加するもの。

## アクセス修飾子

```java
public static void sayHello() {
    // 処理
}
```
  上記では `public` がアクセス修飾子。

  アクセス修飾子は、外部への公開範囲を設定するためのもので、

* public
* protected
* private 

の３種類がある。

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

Javaでは、publicにする必要がないものは、極力privateを使用した方が良いとされている。


## static修飾子

```java
public static void sayHello() {
    // 処理
}
```
  上記では、 `static` がstatic修飾子。

staticは英単語で「静的」という意味。静的とは、状態が変化しないことを意味する。

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

クラスメソッドの役割や使い方は、Rubyとおおむね同じ。

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