【メソッドとカプセル化の操作①】メソッドの概要

## はじめに
オラクル認定資格教科書 Javaプログラマ Silver SE８
第一章　Javaの基本　
第二章　Javaのデータ型の操作
第三章　演算子と判定構造の使用
第四章　配列の作成と使用
第五章　ループ構造の使用
第六章　メソッドとカプセル化の操作←　ｲﾏｺｺ！！
第七章　継承の操作
第八章　例外の処理
第九章　Java APIの主要なクラスの操作

## メソッド
### メソッドの概要
　Javaのようなオブジェクト指向言語で、特定のクラスやオブジェクトに所属するグループのこと。 
　内容がまとまっている処理や反復する処理など、いくつかの処理を一つにまとめたものをメソッドと呼ぶ。
　メソッドは、**インスタンスメソッド**と**クラスメソッド**と分類でき、それぞれ以下の通りである。

#### インスタンスメソッド
　インスタンスメソッドは、インスタンスごとで異なる処理をおこなう時に使用する。
　定義はクラスの中に行い、**staticは付けず**にアクセス修飾子、戻り値、引数を設定します。
　呼び出す時には一度インスタンスを生成してからそのインスタンスからメソッドを呼び出します。
```java
//インスタンスメソッドの宣言
class クラス名 {
  アクセス修飾子 戻り値型 メソッド名(引数の型 引数名) {
    //なんらかの処理
  }
}

//インスタンスメソッドの呼び出し
クラス名 変数名 = new クラス名();
上述の変数名.インスタンスメソッド(引数);

```

#### クラスメソッド
　クラスに紐づけられたメソッドのことをクラスメソッドといい、インスタンスメソッドがインスタンス固有の振る舞いを表すのに対してクラスメソッド はクラス全体の固有の振る舞いを表す。
　**staticメソッド**として定義することにより、呼び出し側でインスタンス化を行わずにメソッドを利用できることが特徴。
```java
//クラスメソッドの宣言
class クラス名 {
  アクセス修飾子 static 戻り値型 メソッド名(引数の型 引数名) {
    //なんらかの処理
  }
}

//クラスメソッドの呼び出し
クラス名.クラスメソッド(引数);
```
### メソッドの宣言
　メソッドを宣言する際に、登場するアクセス修飾子、static、戻り値型、引数について

#### アクセス修飾子
　アクセス修飾子とは、ほかのクラスから、フィールドやメソッドなどへのアクセスを制御するためのもの
　利用できるアクセス修飾子は次の４つである。
|修飾子|説明|
|:--|:--|
|public|すべてのクラスからアクセス可能|
|protected|同じパッケージか継承しているサブクラスからのみアクセス可|
|なし|同じパッケージからのみアクセス可|
|private|同じクラス内からのみアクセス可|

#### 戻り値型
　戻り値型は、メソッドを実行した際に、どのような種類のデータを戻すのかを示したもの。
　戻り値型を指定した際は、必ずreturn文を記述しなければならない。
　戻り値型をvoidとした際は、戻り値なしを意味しており、return文が必要ない。
```java
//戻り値型をintとした場合
public int method(int num) {
  return num;
}
//return文で戻すデータの型とメソッドで宣言した戻り値型は一致しなければならない
//Objectをreturnする場合はその限りでない
```
　なお、戻り値を受け取る際は、戻り値と同じ型もしくは互換性のある型であることが必要。
```java
//戻り値型をvoidとした場合
public void method(int num) {
  System.out.println(num);
}
//return文を記述できない
```

#### static
　staticで修飾されたフィールドやメソッドは **「static領域」** と呼ばれる領域に配置され、それ以外の部分は **「ヒープ領域」** と呼ばれる領域に配置される。インスタンスが生成されるときは、ヒープ領域にあるクラス定義をもとに生成され、また生成されたインスタンスも「ヒープ領域」に格納される。

##### staticの基礎
　**staticなフィールドやメソッドはインスタンスの有無に関わらず使える**性質であるため、値を書き換えた場合、大元の値が変わることとなる。(インスタンス生成してから書き換えても同じ)

staticなフィールドにアクセスするには **「クラス名.フィールド名」** 
インスタンス生成後であれば **「インスタンス変数名.フィールド名」** で記述する。
```java
public class Sample {
  static int num = 0;
}

public class Main {
  public static void main(String[] args) {
    Sample.num = 10;
    System.out.println(Sample.num);
    //結果: 10

    Sample s1 = new Sample;
    Sample s2 = new Sample;
    s1.num += 5;
    s2.num += 10;
    System.out.println(Sample.num);
    //結果: 25
    //インスタンスを通しても同じstaticフィールドにアクセスしている
  }
}
```

##### staticなメンバのアクセスルール
　staticでないメソッドからstaticなメンバへは自由にアクセスが可能だが、
staticなメソッドからは同じstaticなメンバへしかアクセスできません。（static領域からヒープ領域へはアクセス不可）

#### 引数
　引数とは、以下のコード例の`(int num)`を指しており、指定した型の値を受け取る。
受け取れる個数は宣言した引数分。（例外で可変長引数というものがある）
```java
public class Sample {
  void sample(int num) {//int型を１つ受け取る
    // do something
  }
}

//引数を渡す（メソッドの呼び出し時）
Sample.sample(10)//10を渡している。同じ型である必要がある。
```
##### 可変長引数
　通常、受け取れる引数の個数は宣言した分だけだが、 **「可変長引数」** を使用すれば、引数の型が同じであれば、何個でも引数を受け取れる。個数が変動的な時に使用する。

　可変長引数の定義は、引数のデータ型のすぐ後ろに「...」（ピリオド3つ）を付ける。
```java
void sample(int... num) {
  //do something
}

//可変長引数以外にも複数の引数をを受け取る場合は、可変長引数を最後にする必要がある
void sample(String a, int... num) {
  //do something
}
```
可変長引数は配列として扱われるため、使用時は以下のようになる
```java
void sample(int... num) {
  for(int i = 0; i < num.length; i++) {
    System.out.println(num[i]);
  }
}
```


　可変長引数は配列を指定することも可能で便利なものだが、引数型を1つしか指定できない、オーバーロード（並び順が違うメソッドを2つ以上定義すること）では使えないなどの細かいルールがある。

## リンク集
[【Javaの基本①】クラスの構造](https://qiita.com/vitamin_b12/items/3f920cd223fd3cc1ceae)
[【Javaの基本②】パッケージとインポート](https://qiita.com/vitamin_b12/items/be766c8c3ef2366d9fea)
[【継承の操作②】インターフェース](https://qiita.com/vitamin_b12/items/cdc76298d7f6a494dff2)
[【Javaのデータ型の操作①】プリミティブ型のデータ・参照型](https://qiita.com/vitamin_b12/items/f922ab56e4d8b6580f49)
[【演算子と判定構造の使用①】論理演算子(&&、||)、同一性（==）、同値性(equals)](https://qiita.com/vitamin_b12/items/9feb89e8fb1bc67a8d6d)
[【演算子と判定構造の使用②】分岐処理(if、swich)](https://qiita.com/vitamin_b12/items/523467908e683474eac7)
[【配列の作成と使用】](https://qiita.com/vitamin_b12/items/2fc45588640c479e1f4d)
[【ループ構造の使用】while文、do-while文、for文、拡張for文](https://qiita.com/vitamin_b12/items/23d853dda9baf727e4ac)
[【メソッドとカプセル化の操作①】メソッドの概要](https://qiita.com/vitamin_b12/items/215ad731221c2691c441)
[【メソッドとカプセル化の操作②】オーバーロード、コンストラクタ](https://qiita.com/vitamin_b12/items/e4fd3d51a35bb6a5566c)
[【継承の操作①】クラスの継承](https://qiita.com/vitamin_b12/items/19f8ad6f9801ac8f6a8f)
[【例外の処理】](https://qiita.com/vitamin_b12/items/f7ebf2c1106a7dcbdb41)
[【Java APIの主要なクラスの操作】](https://qiita.com/vitamin_b12/items/dcd3edfe2273e5a09231)