byte型でのメモリ節約はint型への暗黙の変換に注意JavaTips 〜Javaプログラミング編

» 2006年12月20日 10時00分 公開
[平野正喜@IT]

 Javaのint型はC言語などと異なり32bitの固定長を取ります。そのため、絶対値の小さな整数値を大量に扱う場合、int型よりメモリ占有量の小さいbyte/short型を使うことで、ヒープメモリの消費量を抑えることができる場合があります。

 一例として、int型、short型、byte型で大きな配列を同数作り、メモリ消費量を比較するプログラムを作成しました。

int型、short型、byte型のメモリ消費量を比較するプログラム int型、short型、byte型のメモリ消費量を比較するプログラム

 実行結果をご覧のとおり、int型に対してshort型は約52%、byte型は約28%のメモリ消費になっています。

int型への暗黙の変換が発生することを考慮しないと思わぬトラブルに

 このように、メモリ利用効率が高いbyte/short型ですが、安易に利用すると思わぬトラブルに出合うことがあります。その原因になりやすいのが、int型への暗黙の変換です。

 一例として、Aさんが作ったクラスに「その型の最大値または最小値を返す」というint型用のメソッドがあり、byte型用のオーバーロードが用意されていたとしましょう。そして、Bさんがこのクラスとメソッドを使うクラスを作成して実行した結果です。

変更前の状態。byte型の最大値が得られている 変更前の状態。byte型の最大値が得られている

 ご覧のとおり、「最大値は」の後に、byte型の最大値が表示されています。

 さて、Aさんが、何らかの理由でbyte型用のオーバーロードを削除したとしましょう。簡単に考えると、Bさんのクラスはコンパイルエラーになりそうな気がしますが、そうではありません。例外も発生せず、予想外の結果になります。

変更後の状態。なぜかint型の最大値が得られている 変更後の状態。なぜかint型の最大値が得られている

 この現象はint型への暗黙の変換によって起こります。Bさんの作ったクラスが呼び出していたbyte型のメソッドがなくなったのですが、コンパイラはすぐにエラーにはせず、byte型をint型に拡張して再度マッチングします。この結果、num2Max(int)が見つかり、これが採用されてしまったわけです。

 byte/short型を用いる場合は、int型への暗黙の変換が発生することを考慮し、思わぬトラブルを避けることをお勧めします。

Profile

RunDog.org

平野正喜


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。