【コラム】

ライトニングJava

2 Autoboxing/Unboxing(1) - プリミティブ型をコレクションフレームワークで

    後藤大地  [2005/04/18]

    さて、今回以後しばらくの間は、EoDに焦点をあててJavaを紹介していく予定だ。EoDは、Javaによるプログラミングをもっと簡単にしていこうという取り組みで、J2SE 5.0ですでに多くのEoDが実現されている。その中からまずは、Autoboxing/Unboxing機能を取り上げたい。

    よくいわれていた面倒くさいこと

    Javaプログラミングで面倒だといわれていたことに、整数や実数などの基本データ型(プリミティブ型)を、コレクションフレームワークで直接扱えないということがある。コレクションフレームワークとは、さまざまなオブジェクトの入れ物を集めたもののことで、Javaの場合はjava.utilパッケージにまとまっている。

    このコレクションフレームワークが使えるとなにかと便利である。データを追加するだけで自動的に整列されたり、検索ができたりと、重宝する。プログラミング中で使いたくなることが多いのだ。当然、整数だったり実数だったりといったものもコレクションフレームワークで扱いたくなる。

    リスト1 : 整数をIntegerオブジェクトに変換

    int int1 = 1;

    Integer integer1 = new Integer(int1);

    しかし、整数や実数といった値をコレクションフレームワークで扱いたいと思ったら、いったんそれらを変換してやらないといけない。なんでそんなことが起るかといえば、Javaが基本的に2種類の型を持っているからである。

    Javaにある2種類の型

    Javaには、大きく分けて基本データ型とオブジェクト型という2つの型がある。

    基本データ型というのは、byte・short・int・long・float・double・char・booleanという型のことで、数値や文字を表すために用いられる。入れ物としての大きさが定められていて、入れ物としての機能だけしかなく、メソッドを持ったりといった機能はない。

    逆に、オブジェクト型は、オブジェクトを保持している変数の型のことで、生成されるオブジェクトによってその振る舞いを変える。

    Javaはオブジェクト指向という考えにのっとって設計されたプログラミング言語である。純粋なオブジェクト指向言語であれば、すべてのデータをオブジェクトとして扱えるように設計するべきだが、Javaはそうはなっていない。これはJavaが開発された背景に影響されるところが多いのだが、ここでそれを云々するのはやめておく。結果からいえば、そのように設計したことで、多くの開発者の心を奪うことができたわけだ。

    Javaが発表された当初、人気が高まった背景の一つにはこの基本データ型がある。基本データ型は、C/C++言語のそれと同じようなもので、そうしたプログラマにウケがよかったのである。書き方も似ているから、C/C++のように基本データ型を使ってプログラムが作成できるということで、プログラマが比較的すんなりとJavaを受け入れることができたわけだ。

    基本データ型←→オブジェクト型変換

    Javaは、基本データ型をオブジェクト型に対応させたByte・Short・Integer・Long・Float・Double・Character・Booleanというクラスを用意している。つまり、基本データ型を引数に与えてラッパオブジェクトを生成して、それを使うように、ということだ。

    基本データ型のおかげで、プログラマ獲得の門戸を広げたJavaだが、実際にプログラミングを行うようになると、基本データ型とオブジェクト型という2つの型があることで、なにかと面倒なことがあることもわかってきた。冒頭で例を挙げたが、基本データ型とオブジェクト型の間で、さきほどのラッパクラスを使ってデータ変換をおこなう必要があるわけだ。

    変換が手間だということ以外に、実はもう一つの懸念がある。基本データ型が受け入れられた理由の一つに実行速度がある。基本データ型は処理が高速なのである。Javaに限ったことでもないが、オブジェクトの生成には時間(生成コスト)がかかる。なるべく余計なオブジェクトを生成しないというのは、高速なJavaプログラムを組む上での鉄則の一つだ。

    しかし、基本データ型をラッパオブジェクトに変換するとなると、その都度オブジェクトを生成することになる。これはせっかく基本データ型を使っているというのに、実行速度が遅くなりかねないことを意味している。実は今回のEoDでは、変換における処理コストの問題は解決していない。変換の手間の問題は解決がはかられている。これは注意しておかなければいけない点だ。

    Autoboxing/Unboxing機能

    こうした面倒なところを、もっと簡単にできるようにしましょうというEoDが、Autoboxing/Unboxing機能だ。端的にどういうことができるようになるかといえば、リスト2のようなソースコードが記述できるようになる。

    リスト2 : Autoboxing/Unboxing機能を使ったソースコード

    Integer integer1 = new Integer(1);
    int int1;

    int1 = integer1;
    integer1 = int1;

    基本データ型であるintと、オブジェクト型であるIntegerは、それぞれ違う型なので、値を代入するには、まず変換をしてやらなければならない。

    Autoboxing/Unboxing機能というのは、その変換を自動的にやってくれる機能なのだ。この機能が使えると、整数や実数を、あたかもオブジェクトのようにコレクションフレームワークで扱えるようになる。これは思った以上に便利だ。

    次回はこのAutoboxing/Unboxing機能についてもう少し詳しく見ていくことにする。

    提供: 毎日就職ナビ

    学生のための就職情報サイト「毎日就職ナビ」。4,000社以上の新卒採用情報が常時掲載され、社内の雰囲気が伝わる情報画面、さまざまな項目での会社検索、エントリーや説明会検索など、機能も充実。無料適職診断、就活Q & A、エントリーシート添削講座など、就職活動に役立つ記事も満載です。研究者、エンジニアを目指す学生の方々も是非エントリーしてください。お待ちしています!

    毎日コミュニケーションズ 就職情報事業本部はプライバシーマークを取得しています。

    新着記事

    特設サイトの情報

      求人情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      転職ノウハウ

      あなたの仕事適性診断

      4つの診断で、自分の適性を見つめなおそう!

      Heroes File ~挑戦者たち~

      働くこと・挑戦し続けることへの思いを綴ったインタビュー

      はじめての転職診断

      あなたにピッタリのアドバイスを読むことができます。

      転職Q&A

      転職に必要な情報が収集できます

      スカウト転職する

      企業からアプローチのメッセージが届きます。

      マイナビニュースマガジン