【初心者向け】10分で絶対にわかる！JavaBeansとは

Javaの記憶部分をつかさどるJavaBeansというものがあります。
これがいったいどういうものなのか、Java初心者が雰囲気を掴めるように解説をします。


#JavaBeansとは何か？


JavaBeansは **銀行** だと思ってください。

余計なことは一切考えず、**JavaBeans＝銀行** を脳みそに刷り込んでください。
刷り込みができたら次の項目へ進んでください。


#どういうことか？

↓こんな感じの一般的な会員登録のフォームを想像してください。
https://www.uniqlo.com/jp/member/registry

ページを開いたら会員登録をすることが目的なので、粛々と個人情報を入力していきます。
メールはhoge@hogemail.co.jp、パスワードはhogeword、性別は男…とか、そんな感じで入力すると思います。
入力が終わったら確認画面へ画面遷移すると思いますが、それでは**ここまで入力した個人情報は一旦どこで保管しておくか？**が問題となります。
この時に個人情報を**一時的に預かってくれる銀行がJavaBeans銀行**です。

JavaBeans銀行は入力された情報をあらかじめ指示された格納方法で格納してくれます。
これを**クラス**とか**Bean定義**とかいいます。プログラム的にはこんな感じの書き方をします↓

```java
public class Kaiin{

String name; //名前
int age; //年齢

}
```
これはすなわち「Kaiinという名前の定義では、文字列型のnameと整数型のageだけ格納できますよ」という意味になります。
#JavaBeans銀行の使い方

三〇とかみ〇ほみたいなリアル銀行と同様に、JavaBeans銀行にデータを預ける時には口座を開設する必要があります。
JavaBeans銀行では口座を開設することを**インスタンス化**するといいます。
俗にnewするとか言われるやつです。プログラム的にはこんな感じの書き方をします↓

```java
Kaiin kaiin = new Kaiin();
```
これは
>Kaiinというフォーマットに則って口座を開設します。
>口座名は「kaiin」です。（上の例では名前と年齢だけ格納できる）


ということを示しています。
開設した口座はプログラム内であれば「kaiin口座を使うで」と一言言えばいつでも使うことができます。

#誰でも金庫を触れるとマズい

「ウチの銀行はセルフサービスです！金庫を開けておきますので、みなさんご自由にお金の出し入れをしてください！」
という銀行は信用できないですし、悪い人がお金を盗んだりしそうなことは容易に想像できると思います。
JavaBeans銀行でもこのようなリスクを考えて、誰にでもデータを自由に触らせるのではなく**特定の窓口を通して**データの出し入れをするよう決めました。この窓口さんの名前は**取り出し担当がgetさん、格納担当がsetさん**と言います。プログラム的にはこうなります↓


```java
public class Kaiin{

private String name; //名前
private int age; //年齢
Kaiin(){}; //コンストラクタ

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(ing age) {
    this.age = age;
}
}
```
修飾子がprivateに変更されていることがわかると思います。
これが金庫に格納されて外部の人は直接触ることはできなくなった状態です。データの出し入れはpublic修飾子がついているsetさんとgetさんを経由して行います。

まとめると、JavaBeans銀行でのルールは
>・データ本体はprivateをつけて金庫の奥底に隠すこと
>・データの出し入れはユーザーがやるのではなくsetさんとgetさんにお願いすること

ということになります。
これをJavaの用語で**カプセル化**といいます。

※追記：JavaBeansの定義のひとつに引数なしのコンストラクタを持つということがあるそうです。
コンストラクタは初期値を設定するメソッドです。要は「開設した口座に誰のものかわからんデータがあったら困るやん？お掃除（初期化）しときましょ」ということですね。よくわからないという場合はとりあえずおまじないとして覚えておきましょう。


#データの出し入れをやってみる

ここまでJavaBeans銀行の仕様がわかったと思いますので、具体的なプログラムを書いてみたいと思います。

```java
public class CallName {
    public static void main(String[] args) {
    
    Meibo meibo = new Meibo(); //①
    meibo.setName("深田恭子"); //②
    system.out.println(meibo.getName()); //③ ④
    }
}

public class Meibo{
    
    private String name; //名前
    Meibo(){}; //コンストラクタ

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
```
このプログラムを実行すると出力されるのは「深田恭子」です。
順を追って説明すると

>①Meiboクラスという格納方式に則って口座を開設します。口座名は「meibo」です。
>②口座名meiboに名前(Name)情報を格納します。格納するデータは「深田恭子」で、作業はsetさんにお願いします。
>③meibo口座から名前(Name)の情報を引き出します。作業はgetさんにお願いします。
>④getさんがmeibo口座から引き出してきてくれた名前を出力します。

という流れになります。
なんとなく雰囲気はつかめましたでしょうか。

#JavaBeans銀行には欠点がある

JavaBeans銀行には致命的な欠点があります。それは

**データはひとつしか預けることができない**

ということです。
上のプログラムを少し書き換えてみます。

```java
meibo.setName("深田恭子");
meibo.setName("カンニング竹山");
system.out.println(meibo.getName());
```
この結果出力されるのは「カンニング竹山」です。
JavaBeans銀行では後から入ってきたデータが優先されるので、深田恭子は消えてしまうのです。
もし深田恭子とカンニング竹山の両方を保持したい場合は**名前を変えて口座を複数開設する必要があります。**

```java
Meibo meibo1 = new Meibo(); 
Meibo meibo2 = new Meibo(); 
meibo1.setName("深田恭子");
meibo2.setName("カンニング竹山");

system.out.println(meibo1.getName())
system.out.println(meibo2.getName())
```
これで「深田恭子」「カンニング竹山」の両方を出力することができました。

#まとめ

なんとなくわかりましたでしょうか。
データの流れは使いながら覚えていく部分も大きいと思いますので、たくさんプログラムを組んで覚えてください。

軽く流していますがカプセル化とかgetter/setterとかはオブジェクト指向を学んでいく上でウルトラスーパー大事な部分です。時間をかけてもいいので、じっくり理解しておくとよいと思います。

最後に簡単におさらいします。
>・JavaBeansにデータを格納する時は口座を開設する（newする）
>・データの出し入れはgetさんとsetさん経由で行う（getter/setter)
>・JavaBeansは1件しか保持することができないので、データを複数件格納したい時は名前を変えて複数口座開設する。


#発展と補足

- 今回は「名前だけ」を格納しましたが、「口座の情報すべて」をまるごと別の口座に格納することもできます。
- JavaBeansでググると「再利用可能な…」と出てくると思いますが、一旦忘れていいと思います。よくわからないことを深追いすると余計わけがわからなくなります。
  だんだん大きいプログラムが組めるようになると「こういうことね」とわかる瞬間が来ると思いますので、その時まで放っておきましょう。
- 裏側の話をすると、newをすると「メモリ内に記憶領域を確保」してくれます。
- Bean定義ファイル名はフレームワークによってhogeBean.javaとかhogeForm.javaとか、いろいろな表現があります。