こんにちは、月子です!
突然ですが、私はパソコンの動きが苦手です。
コンパイルも「パソコンが何やかんやで出力してくれている」と適当に覚えていました。
そのため、学びなおしました。
だってエンジニアの仕事ってコード書くことでしょ〜?と思いながら研修を受けてたら、
途中で詰まりまくり、上司に「本質的理解ができていない」と叱られました。
そうです、何となくで覚えていた私は、ちょっと応用が入ると、一気にキャパオーバーになってしまうのです。
特に「インスタンス化」や「参照渡し」の部分がボロボロでした。

パソコンのメモリに?変数を入れる?
newで新しいインスタンス化??へ??
マジでこんな感じだったので、
今回は「メモリ」について勉強したいと思います!
私が理解しやすいように、いろんな例えが出てきます。
「それ、違くない?」と思ったら、遠慮なくコメントや、ツイッターのリプで教えてくださると幸いです!
コードを組む上で絶対意識しておくべきもの、それが「メモリ」
そもそもメモリって何なの?って思いますよね。
私は例えでよく、カレーライスを作ります。そのため今回も作ります。
Curry Curry = new Curry;
これで「カレーライス」が1つ出来上がりました。
ただこれって、「カレーライス」が本当にできるのではなく、
1と0のメモリ領域で表現されているだけなのです。
余談ですが、FGOというゲームがありまして、
エレシュキガルという超かわいいキャラクターを、ガチャで引きたかったんですね。
彼女を迎え入れるため、20,000円を課金したことがあります。
すると、何と、2人も!エレちゃんがきてくれました!!
嬉々として、そのことを友人に話したら、

ただの1と0のデータなのに?
あの時、友人を殴らなかった私を褒めてあげたい…
※余談終わり※
いいんです、1と0の集まりでも、私の心にはいるから…
この「メモリ」
趣味だったら、別に考えなくてもいいんです。エレちゃんはそこにいる!と言い張っても全然構いません。
しかしプログラマーとしては、きちんと考えてコードを組まないといけません。
私はカレーライスを作ったら、頭の中にカレーを作り上げて、
にんじんやら玉ねぎを入れていましたが、
それだと、いつか絶対詰まってしまうんです!
特に「参照渡し」!!
理由もあわせて、「メモリ」について学んでいきたいと思います。
メモリとは何か
いきなりですが、質問です。
この中で「メモリ」はどれでしょう?
ROM : 600GB
RAM : 8GB
実はこれ上司に質問された内容なのですが、

えーと、多分8GB?
こう答えたら、「それでもプログラマーか」と叱られました。
正解は「8GB」です。エンジニアはメモリを聞かれて「多分」とか言っちゃダメです。
他の2つも含めて、こんな風に例えられることが多いです。
ROM : 600GB → 引き出しの中身
RAM : 8GB →机の上
今すぐ使うものは8GBの方に、
今は使わないけれど残しておきたいものは600GBの方に、しまっておくイメージですね。
私たちはプログラミングでコードを打つと、
ポイポイポイポイとどんどん机の上に広げていきます。
「メモリ」の何となくのイメージは掴めましたか?
次は、さらに「メモリ」を詳しく見ていきます。
「メモリ」をマンションに例えてみる
私の愛読書「スッキリわかるJAVA」では、メモリについてこう書いています。
「メモリの中は基盤の目のように区画整理されており、格区画にはアドレスが振られています。」
よし……マンションに例えましょう。
パソコンのメモリはマンションです。
このメモリをヒープ領域と呼びます。
このヒープ領域は区画に分かれていて、「0001,0002,0003…」とアドレスが振られています。
そうです、マンションの部屋がたくさんあるイメージでいきましょう!
私たちがコードを打つと、部屋がどんどん確保されていきます。
確保するためには、「new」を使います。
この部屋を確保してくれているのが、JVMです。
JVMについてはこちら
もし配列を新しく作ると、JVMはどのように動くのでしょうか。
int[] num = new int[3];

おっけー!
配列の中に要素を3個作りたいのね!
じゃあ、12部屋確保してくるわ!!ちょい待ち!
12部屋と言ったのには、理由があります。
int型は1つの変数で4バイト消費します。つまり4部屋確保が必要なんですね。
そのためint型の変数を3つ入れるためには、12部屋必要になるのです。

7000番地〜7011番地を、numの変数のために用意したぜ!
さらに、JVMはこんな処理をします。

よし、numには7000番地と入れておこう
そうです、7000~7011番地すべてを変数numには入れません。
1番最初のアドレスだけnumに入れるのです。
(何でなのかは私にもわかりません、誰か教えてください)
参照渡しとは、マンションの部屋を渡すこと
ここで「参照渡し」について話します。
int[] num = new int[]{1,2,3}; int[] sum; sum = num; sum[0] = 100; System.out.println(num[0]);
今までの私だったら、

えーと、numの配列に1、2、3を入れて…
sumの配列も作って…
numをsumに入れる…
そしてsumの0番目の要素は「100」にする…

え?numの0番目の要素は1のままじゃないの??
しかし実行すると、「100」が出てきます。
図にするとこんな感じです。
パソコンの舞台裏を知っていないといけない、と言ったのは、まさに「参照渡し」があるからです。
パソコンの舞台裏を知らないと、
「1、2、3」の数字を渡すんでしょ?と思いがちです。私もそう思ってました。
でもそうではなく、アドレスの1番はじめの番地を渡します。
つまり、
sum = num; sum[0] = 100;

7000番地を見ると、ふーむ、7011番地まで配列が入ってるね〜
これをsumとシェアするんだね?

ん?要素0を100にしたい?
要素0は7000番地~7003番地だね
おっけー変えとくよ!
こんな処理をしてるので、num[0]も100になったんですね。
メモリと配列渡しのまとめ
・newすると、JVMがアドレスを確保してくれる
・「参照渡し」とはアドレスを渡すことである
私はここが全く理解できていなかったので、めちゃくちゃ苦労しました。
例えばカレーライスは1つしかないのに「new」しまくったりね。
newするたびに、部屋をどんどん確保していきます。
しかし自分は「カレーライスは1つしか作ってない!」と思い込んでいるので、
2個も3個もカレーライスを作っている自覚がないわけです。カレー地獄。
次回はインスタンスやフィールドをやろうと思っているので、
今回のアドレスと絡めて学んでいこうと思います!
\ いろいろやってるよ! /
よわよわエンジニアのブログ:月子.log
雑多な発信をしてるツイッター:@moon_trdr
ゆるーーーい絵日記:@tuki__tukiko
欲しいものリスト 公開しています🌸
「鈴木 月子」宛に届けていただけると泣いて喜びます!
(送っていただいた方の名前・住所は匿名で送られますのでご安心ください♪)
***
派遣から正社員として、内定をもらいました!
【未経験からエンジニアになりたい人、おすすめのプログラミングスクール】
(コロナの影響で、オンラインでの無料説明会で案内しています)
1、GEEK JOB
私が通っていたプログラミングスクールです!
1番のメリットは、
無料の転職サポート&プログラミング教育を受けられることです!
私もGEEKJOBで転職サービスを受けて、入社しましたが、
最初から最後まで完全に無料でした。
プログラミングできるかな・・・と不安な方は、
最初は無料の説明会と体験会もあるので、
お試しで行くのも1つの手ですよ♩
「有料でもいいから手厚いサポートを受けたい」という方は、
私も大好きなマコなり社長が経営しているTECH::EXPERTをおすすめします!
なんと、質問し放題の環境が整っています。
未経験エンジニアとしての経験談なのですが、
質問できる環境ってありがたいですし、なにより成長ができます!
相談会や説明会は無料です。
DMMが開催しているプログラミングスクールです。
こちらは有料ですが、条件を満たすことで
支払った教育訓練経費の最大70%が教育訓練給付金として支給されます。
こちらも相談は無料です。
無料・有料どちらがいいかは体感だと、
有料の方がサポートが手厚い傾向です(当たり前ですよねw)
しかし無料だから適当というわけではないですし、
私のように転職を繰り返してお金がない人からしたら、
無料スクールはすごくありがたい存在でした🎵
無料スクール→自主的に勉強できる人・お金がない人
自分にあった方を選んでくださいね^ ^
コメント