前提が違います。
まず、メモリは何種類かあるようです。
私が知っているやつは、スタック領域とヒープ領域です。
他にもあるらしいですが、詳しくはわかりません。
スタック領域は、自動的に確保されるエリア。ですが、このエリアは意外と狭い。
なので、動的に確保できるエリア、ヒープ領域も用意されています。
ヒープ領域ではnewで確保して、C++でいうdeleteで破棄...と自分で後片付けもしないといけません。
Javaなんかではガーベージコレクタとかそういう、Java側のやつで「不必要になったら削除」してくれる機能があるので、そこまで問題ではないですが。
int型変数やlong型変数, double型変数...といったプリミティブ型と呼ばれる型の変数は、動的確保をしなくてもスタック領域で事足りるのでふつうは newしない。
(場合にもよりますが)
なので、
とかみたいに書ける。
でも、クラスなんかはメンバ( フィールドやメソッド ) の分もかかってくるので、
2~4バイトだけ...ってことはなく、実際にはもっとかかるかもしれません。
なので、new で確保する方法になっているっぽいです。
C++では、プリミティブ型みたいに生成することは可能です。
C++
1// Testっていうクラスがあるとして
2Test test(100);
3test.method1();
ですが、これはメンバの分は確実に重くなります。
なので、動的確保を用いて、
C++
1// Testっていうクラスがあるとして
2Test* test = new Test(100);
3test->method1();
4delete test;
みたいにすれば、重さは少しマシになる。
このnew/deleteをする方法をJavaは取り入れられているのだと思います。
また、前提が違う...っていうのは intはあくまで型。
構造体じゃないです。
[追記1]
maisumakunさんからご指摘を受けました。
えーっと、私が言いたかったのは、C++で説明しますが、
(サイズが環境によって異なることと、私自身が完全には試していないことから)
【C言語/C++】データ型のサイズ・範囲の一覧【32bit/64bit環境】を例にとると、
char : 1
int : 4
long long : 8
double : 8
となっています。
仮に、クラス(構造体でもいいですが) のメンバとして、
(あくまで例)
- 名前 : 文字列 // 要素数30 + 1 = 31
- number : int // 学籍番号とか
- 体温 : double
と考えたとき、単純に計算しても、
char : 1
int : 4
double : 8
なので、
名前のサイズ = 1 * 31 = 31
学籍番号系のサイズ = 4
体温のサイズ = 8
すべて合わせると、31 + 4 + 8 = 43 はかかる。
でも動的確保だとC++ではポインタで表されるため、容量が少なく済む。
っていうことです。
(もしかして、私の解釈、間違ってます? )