【Java入門】配列宣言とその意味
  • facebookページ
  • twitterページ
  • 2017.09.09

    【Java入門】配列宣言とその意味

    Javaの配列宣言

    Java言語では配列変数を宣言する際には、以下のような書式になります。

    これは、aという長さ100の整数型の配列変数を宣言するという意味になります。

    これにより、a[0]からa[99]という整数型変数100個が新たに生成され、それぞれ0で初期化されます。

    Javaプログラマーは、配列を使うことは珍しいことではないので、このような処理を常日頃たくさんソースコードに記述しますが、あまり意味について深く考える機会はありません。

    そこで、ここではこの配列の宣言と意味について考察することにします。

    参照と値の関係

    配列の宣言は、大きく分けて二つの部分に分けることが出来ます一つが変数の宣言、そして配列の宣言です。例えば、冒頭にあげた配列aの宣言は、以下のように分けることも出来ます。

    まず、最初の「int[] a」は、整数型並列変数aを宣言するという意味です。[]は、変数名の後につけることも可能で、

    としても意味は同じです。これは、変数aが配列変数であることを意味します。

    次に、後半の

    ですが、これは、int型の連続したデータ100個分を確保するということを意味しています。このデータは一塊にはなっているものの、巨大なデータの塊です。

    ですからこのとき、変数a自体は、値を持ちません。では、一体これは何なのかと言うと、先に宣言されたメモリ上の100個分の配列データへの参照を意味するのです。

    配列への参照

    わかりやすい言い方をすると、「aと言う変数は、メモリ上にある100個分のintデータの位置を表す」ということになります。

    つまり、配列変数は大量のデータがあるため、一つ一つの値を扱うことが出来ません。そのため、そのデータが存在する領域を表すわけです。

    そして、値として扱いたい場合は、a[0]、a[1]、…、a[99]といった具合に、[]内に添え字を入れて、その領域内の何番目の値、ということを指し示してやればいいのです。

    多次元配列の場合

    次は多次元配列の場合を考えて見ます。判りやすいように、二次元配列で考えて見ましょう。二次元配列の場合、宣言は以下のようになります。

    と書きますが、これを詳しく書くと、以下のようになります。

    これを見ると、まず大きさ2つの配列を宣言し、更にその中に大きさ3の配列をそれぞれ宣言していることがわかります。

    つまり、多次元配列とは、「配列の中に配列が入ってる」という状態を表すのです。

    ジャグ配列の場合

    なお、Java言語やC#言語で用いられる、一般に「ジャグ配列」と呼ばれる、二次元配列でありながら、形が不揃いになる配列は、この中に生成する複数の配列の長さがまちまちの配列を意味します。

    具体的に書くと、

    のようにすると、長さがまちまちの配列が出来上がります。これがジャグ配列です。

    三次元、四次元と、次元を上げていっても基本的にこの考え方は変わりません。なお、多次元配列の宣言の

    ですが、

    と書いても意味は同じです。

    Javaのメモリ管理と配列

    ところで、配列宣言の部分で出てきた、「new」という演算子ですが、これはメモリ上に何らかのデータを展開することを表す演算子で、クラスからインスタンスを生成するときにも使われます。そのため、配列の宣言に限らずこの演算子を用いると、メモリ上に何らかのデータが生成されることになります。

    ヒープメモリ

    なお、この配列が確保されるメモリ領域のことを、ヒープメモリ(heap memory)もしくは単にヒープといいます。なお、配列ではない普通の変数はスタックと呼ばれるよう領域に格納されます。

    この2つの大きな違いは、スタック上の変数のデータは、メソッドが終了した後に終了するのに対し、ヒープ上のデータは、メソッドが終了しても消えないという点にあります。

    したがって、一度生成した配列は、このヒープ領域に留まり続けることになるわけです。

    ガーベージコレクタ

    ところで、このとき大きな問題が一つあります。それは「データがいらなくなったらどうすればよいのか」ということです。

    コンピュータのメモリ容量には限界があります。したがって、むやみやたらと配列を作り続けると、当然のことながらメモリは限界に達し、アプリケーションが停止してしまったりするおそれがあります。

    実は、いらなくなった配列のデータは、システムによって自動的に開放されます。その仕組みのことを、ガーベージコレクタと言います。

    ガーベージコレクタの振る舞い

    ガーベージ(garbage)とは、ゴミを表す英単語です。つまり、ガーベージコレクタとは、ゴミを集める、つまり使用しなくなったメモリを開放するための仕組みです。

    ガーベージコレクタは、外部から参照されなくなったメモリ領域を開放するのが役割です。これにより、使用しなくなった配列は自動的に開放の対象となるのです。

    例えば、あるメソッドの中で宣言されたaという配列があったとします。このとき、そのメソッドが終了すると、変数aは同時に消滅しますから、その配列の領域に対する参照も自動的に消えます。

    ガーベージコレクタはこれを察知し、不要になった配列用のメモリ領域を開放し、メモリに空き容量を作ります。

    ガーベージコレクタの振る舞い

    有効にメモリを使う

    とは言え、やはり配列に限らず大きなデータを扱うときには十分に配慮をする必要があります。というのも、実は、Javaのガーベージコレクタは、プログラマーが意図的に起動させることが出来ないからです。

    外部から参照されなくなったメモリはいずれ開放されますが、そのタイミングまではコントロールできません。そのため、プログラマーはメモリを圧迫しないように、なるべく大きなメモリ領域を長時間確保しないように工夫してプログラミングを行う必要があります。

    これは、Java言語のご先祖様とも言えるC言語とは対照的です。C言語は好きなときにメモリ領域の開放と確保を行うことができましたが、Java言語では様々な事情でそれができなくなっているのです。

    必要に応じて使い分ける

    以上のように、Javaで配列を扱う場合には、メモリの有効活用などに配慮する必要があります。そのため、大量のデータを扱う際には配列のみならず、動的にサイズを変更することが可能なArrayListのようなクラスを用いるなど、メモリ領域を圧迫しないような十分な配慮をするように心がけなくてはなりません。


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料10万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテキャンバナー ポテキャリバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア

    話題の記事

    まだデータがありません。

    関連ワード

    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE