初心者には同じにしか見えない...
「Arrayってそもそも配列ですよね?ArrayListもArrayってあるから配列だよね!?」
これは僕だけではないと思います。
使用していく中で経験的にわかっていくとは思いますが、ちゃんと理解していないと困ることもあるかと。
自分なりの理解をメモしておきますので、初心者の方に対して少し違いがイメージできるようになる助けになればと思います。
そもそもクラスって?
- クラス
- データ(変数)
- 処理(メソッド・関数)
要はデータと処理を一まとまりにして扱うよというもの。
これが最初はわからなかったし、今でもそんなに便利なものなのかどうかもよくわかっていませんが。。。
よく車とかで説明されたりしますが、結局「言ってることはわかるけど。。。」という消化不良状態でした。
しかし、結局はテンプレだと考えればすっきりしました。
クラスはテンプレ、インスタンス化はテンプレの利用
初心者にはクラスとかインスタンス化しないと使えないとか言われてもなんのこっちゃという感じだと思います。
車でいうと
* 車種
* 排気量
* 値段
とかいうものをまとめてクラスとして、インスタンス化して
* 車種:プリウス
* 排気量:1200CC
* 値段:200万円
とすることで、クラスが利用できるようになるとか言われてもね。
走るという処理も、インスタンス化して、格納されている変数を下に動作するとかなんとか?書いててもよくわかりません。
しかし、そもそもテンプレだと考えればすっきりします。
車を作ろう!と思った時に、
車種:デビル
排気量:1億
燃料:原油
よし作った!んじゃ売ろう!あれ、値段どうするよ?
ってなると困るやん?てか最初の段階で車作ろうぜって話をする人はその時その時で違う人のはず。その時に決め事がなければ最初に決めておくことは人によりけりってなると毎回毎回現場は困るわけです。
ということで、ここで車クラスというテンプレを作っといて
車種
排気量
燃料
値段
色
速度
走る
止まる
バックする
を最初に決めてね!ってしとけば、「これ決めてへんかった」とか「何決めなあかんかったっけ?」ということはなくなります。
んでこのテンプレに沿って「じゃあ車種はデビルって奴にしようぜ!」って決めていくのがインスタンス化ですね。
厳密には違うのでしょうが、この理解でほぼ問題ないかと思います。
んで処理に関しても、走るっていう処理を設計ごとにどのくらいのスピードで動くかを決めていくんじゃなくて、速度という値を先に決めておいて、その速度の値を使って、「このくらいのスピードで前に進む」とテンプレ化しておけば毎回同じ命令の走るでちゃんと走るという感じ。
だから値だけ配列のようにまとめておくよりも、その値を使ってどうするのっていう処理もまとめておけば、記述が統一されるんですね。
テンプレだと思えば便利なものだなと思えます。
配列はクラス
クラスの中の変数を取り出す時は
クラス名.変数名
というように書くので、配列の要素数を取り出すには、配列のクラスの中にあるlengthという変数に要素数が入っているので、
array.length
のようにすれば取り出せる。
ArrayListはクラスを格納してるかつカプセル化
カプセル化してると変数に直接アクセスできません。というのも
array.length
のように書いてもエラーになるだけということ。
じゃあどうすりゃいいのっていうとカプセル化の説明などで出てくる、getterやsetterなどのメソッドを使用して変数の値を取得したりするんですね。
メソッドを使わないといけないというところがミソ。
つまり、要素の数を取得する時に
array.size();
のように最後に( )が必要になるということ。メソッドだから。
メソッドを使っているのか、変数名を指定して取得しているのかっていうところで書き方が違うので、「とりあえずこう書けば動く」と覚えるよりも「メソッドを使っているのか変数名を指定してるのか」の違いはわかっていないと( )をつけるのかどうかで迷ったりするかと思います。
あんまりまとまってないですがまとめ
とりあえず自分の頭の整理のつもりで書きました。厳密な説明ではありませんが、漠然としたイメージが少しはすっきりしたイメージに変わればと思います。
また、このあたりの話は別記事でまとめていきたいと思います。