わかったようでわかってなかった！？オブジェクト指向プログラミング (1)

オブジェクト指向プログラミング。業務でプログラムに関わると必ずと言っていいくらい出てきますよね。
わかったようでわかっていなかった点を自分なりに整理してまとめてみました( ´ ▽ ` )ﾉ
プログラムは自分が遊んでいるゲームのサーバサイドで使われているJavaでするー！ヾ(o´∀｀o)ﾉ

## オブジェクト指向プログラミングとは？
> コンピュータプログラムの構造、構成法の一つで、関連するデータの集合体と、それを操作する手続きを「オブジェクト」(object)と呼ばれるひとまとまりの単位として一体化し、オブジェクトの組み合わせとしてプログラムを記述する手法。(IT用語辞典 e-Words)

...モキュ？(´･ω･`)

抽象的な説明では何のこっちゃなのでもう少し噛み砕いて説明します。

まず引用文の関連するデータの集合体とは**クラス**と呼ばれるものを指しています。
**クラス**とはモノを作りだすための設計図です。

### 1. 設計図(クラス)を作ろう！

ex. Nyoheiというクラスを作り、画面ににょへーい☆と出力する。

```java:nyohei.java

class Nyohei{
  public static void main(String args[]){
    System.out.println("にょへーい☆");
  }
}

```
Nyoheiってのが設計図すなわちクラスの名前です。

### 2. メンバーメソッドとメンバー変数を用意しよう！

クラスを作る際には**メンバーメソッド**と**メンバー変数**を用意します。

**メソッド**とは何かの処理を行うための機能を指します。

ex. キャラクターのHPを設定する。
`void setHP(){}`
setHPがメソッド名。

**メンバーメソッド**とはクラスの中で定義されているメソッドを指します。
クラスの中での処理(敵を攻撃する、味方を回復する etc...)のことですね。

ex. キャラクターのHPを設定するメソッド
`void setHP(int newHP){
     hp = newHP;
  }`

メンバーメソッドには引数も指定できますね♪ヾ(=´･∀･｀=)

**メンバー変数**はメソッドの外に記述する変数を指します。
ex. キャラクターのHPを管理するint型の変数
`int HP;`
ex. キャラクターの名前を管理するString型の変数
`String name;`

### 3. クラスを元にしてオブジェクトを作ろう！

このクラスを元にしてモノすなわち**オブジェクト**を作ります。
オブジェクトの作成にはnew演算子を使いますね。

ex. パーティーメンバーのオブジェクトを作る
`Character member_1 = new Character();`

### 4. これまでのおさらいとしてプログラムを作成してみる。

ex. 4人1組のソロパーティーを作成し、各キャラクターの名前とHPを設定して画面に表示する。

```java:solo_party.java
class Character {
  int hp;
  String name;
  
  void setHP(int newHP){
     hp = newHP;
  }

  void setName(String newName){
     name = newName;
  }

  void showHP(){
    System.out.println( name + "のHPは" + hp + "です。");
  }
}

class Party {
  public static void main(String args[]){

    // オブジェクトの作成
    Character member_1 = new Character(); 
    Character member_2 = new Character();
    Character member_3 = new Character();      
    Character member_4 = new Character();

    // 各オブジェクトにメンバー名を設定
    member_1.setName("カルチョスさん"); 
    member_2.setName("カルちゃん");
    member_3.setName("カルさん");
    member_4.setName("カルたん");

    // パーティーキャラのHPを設定
    member_1.setHP(800); 
    member_2.setHP(1200);
    member_3.setHP(1000);
    member_4.setHP(1400);

　　// パーティーキャラのHPを表示
    member_1.showHP();
    member_2.showHP();
    member_3.showHP();
    member_4.showHP();

  }
}

```

大雑把に図に表すと↓な感じ。

![oop_illust_1.png](https://qiita-image-store.s3.amazonaws.com/0/62945/3cc091c0-1b3c-4a12-d29d-f83efc2e5df6.png)


### 【そういえば】publicってなんなんだ！？┗┐＜(´(゜)ω(゜)`)＞┌┛

アクセス修飾子のことですね。これもソース読んでいると必ず出てきます。
重要なんで解説します。

ex. 会員制サイトスクエニメンバーズでブログをともだちのみに公開するときを考える。

```java:blog_scope.java
class MyBlog {
  String name;
  private String scopeName;

  void setScopeName(String newScopeName){
      scopeName = newScopeName;
  }

  void setName(String newName){
     name = newName;
  }

  void presentBlog(){
    System.out.println( name + "の日記は" + scopeName + "公開です。");
  }
}

class Blog {
  public static void main(String args[]){

    // オブジェクトの作成
    MyBlog member = new MyBlog(); 

    // オブジェクトにメンバー名を設定
    member.setName("カルチョス"); 

    // ブログの公開範囲を設定
    member.scopeName = "ともだちのみ";

    // ブログを公開する
    member.presentBlog();

  }
}
```

直接メンバー変数scopeNameに値を格納し、メンバー変数scopeNameにprivateとつけてコンパイルするとエラー！

(´･ω･`)...モキュ？そう！そうなんです！

*privateを付けたメンバー変数はメンバ変数を定義したクラス内でし
か、メンバ変数の値を変更したり参照したりする事は出来ないのです！*

`member.setScopeName("ともだちのみ");`のようにメソッドを通せばコンパイルできる！

アクセス修飾子publicは省略されることがあるらしいけど、上記の例のようにprivateと使い分ける意味でも
自分でコード書くときはちゃんと書いた方がいいですね。


privateとpublicの違いをざっくり図に表すと↓な感じ。

![oop_illust_2.png](https://qiita-image-store.s3.amazonaws.com/0/62945/7b04f416-1ee5-6db7-2d8b-b1b82d334d17.png)


・参考サイト：[JavaDrive](http://www.javadrive.jp/)

オブジェクト指向プログラミングは説明する内容が多いですねｗ(´ー｀A;)
コンストラクタ、デストラクタ、継承、ポリモーフィズムなどなど…(´･ω･`)
一気にまとめるのは大変なので、自分自身の理解と再確認の意味も込めてこれから少しずつ解説していきますー(｡uωu｡)