メモリと参照渡しは?〜初心者プログラマーが分かりやすく解説してみた〜

プログラミング

 

こんにちは、月子です!

 

突然ですが、私はパソコンの動きが苦手です。

 

コンパイルも「パソコンが何やかんやで出力してくれている」と適当に覚えていました。

そのため、学びなおしました。

 

 

 

だってエンジニアの仕事ってコード書くことでしょ〜?と思いながら研修を受けてたら、

途中で詰まりまくり、上司に「本質的理解ができていない」と叱られました。

 

そうです、何となくで覚えていた私は、ちょっと応用が入ると、一気にキャパオーバーになってしまうのです。

 

特に「インスタンス化」や「参照渡し」の部分がボロボロでした。

 

パソコンのメモリに?変数を入れる?
newで新しいインスタンス化??へ??

 

マジでこんな感じだったので、

今回は「メモリ」について勉強したいと思います!

 

私が理解しやすいように、いろんな例えが出てきます。

「それ、違くない?」と思ったら、遠慮なくコメントや、ツイッターのリプで教えてくださると幸いです!

 

 

コードを組む上で絶対意識しておくべきもの、それが「メモリ」

 

 

そもそもメモリって何なの?って思いますよね。

 

私は例えでよく、カレーライスを作ります。そのため今回も作ります。

 

Curry Curry = new Curry;

 

これで「カレーライス」が1つ出来上がりました。

ただこれって、「カレーライス」が本当にできるのではなく、

1と0のメモリ領域で表現されているだけなのです。

 

 

余談ですが、FGOというゲームがありまして、

エレシュキガルという超かわいいキャラクターを、ガチャで引きたかったんですね。


彼女を迎え入れるため、20,000円を課金したことがあります。

すると、何と、2人も!エレちゃんがきてくれました!!

嬉々として、そのことを友人に話したら、

 

ただの1と0のデータなのに?

 

あの時、友人を殴らなかった私を褒めてあげたい…

 

※余談終わり※

 

 

いいんです、1と0の集まりでも、私の心にはいるから…

 

この「メモリ」

趣味だったら、別に考えなくてもいいんです。エレちゃんはそこにいる!と言い張っても全然構いません。

しかしプログラマーとしては、きちんと考えてコードを組まないといけません。

 

私はカレーライスを作ったら、頭の中にカレーを作り上げて、

にんじんやら玉ねぎを入れていましたが、

それだと、いつか絶対詰まってしまうんです!

特に「参照渡し」!!

 

理由もあわせて、「メモリ」について学んでいきたいと思います。

 

 

メモリとは何か

 

いきなりですが、質問です。

この中で「メモリ」はどれでしょう?

 

core i5
ROM : 600GB
RAM : 8GB

 

実はこれ上司に質問された内容なのですが、

えーと、多分8GB?

こう答えたら、「それでもプログラマーか」と叱られました。

 

正解は「8GB」です。エンジニアはメモリを聞かれて「多分」とか言っちゃダメです。

 

他の2つも含めて、こんな風に例えられることが多いです。

 

core i5 → 頭脳
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つの手ですよ♩

無料説明会はこちら

 

2、TECH::EXPERT

「有料でもいいから手厚いサポートを受けたい」という方は、

私も大好きなマコなり社長が経営しているTECH::EXPERTをおすすめします!

なんと、質問し放題の環境が整っています。

未経験エンジニアとしての経験談なのですが、

質問できる環境ってありがたいですし、なにより成長ができます!

相談会や説明会は無料です。


無料相談会はこちら

3、DMM WEBCAMP

DMMが開催しているプログラミングスクールです。

こちらは有料ですが、条件を満たすことで

支払った教育訓練経費の最大70%が教育訓練給付金として支給されます。

こちらも相談は無料です。

無料相談はこちら

 

 

無料・有料どちらがいいかは体感だと、

有料の方がサポートが手厚い傾向です(当たり前ですよねw)

しかし無料だから適当というわけではないですし、

私のように転職を繰り返してお金がない人からしたら、

無料スクールはすごくありがたい存在でした🎵

 

有料スクール→手厚いサポートが欲しい人
無料スクール→自主的に勉強できる人・お金がない人

 

自分にあった方を選んでくださいね^ ^

 

この記事を書いた人
月子

文系エンジニアの月子です。
SEになり、3年目。主な言語:Java / Python / GAS
フリーランスエンジニア&副業で年収1千万いくのが夢です。

駆け出しプログラマーの毎日
プログラミング
スポンサーリンク
駆け出しプログラマーの毎日
月子.log

コメント

タイトルとURLをコピーしました