Javaのint型はC言語などと異なり32bitの固定長を取ります。そのため、絶対値の小さな整数値を大量に扱う場合、int型よりメモリ占有量の小さいbyte/short型を使うことで、ヒープメモリの消費量を抑えることができる場合があります。
一例として、int型、short型、byte型で大きな配列を同数作り、メモリ消費量を比較するプログラムを作成しました。
実行結果をご覧のとおり、int型に対してshort型は約52%、byte型は約28%のメモリ消費になっています。
このように、メモリ利用効率が高いbyte/short型ですが、安易に利用すると思わぬトラブルに出合うことがあります。その原因になりやすいのが、int型への暗黙の変換です。
一例として、Aさんが作ったクラスに「その型の最大値または最小値を返す」というint型用のメソッドがあり、byte型用のオーバーロードが用意されていたとしましょう。そして、Bさんがこのクラスとメソッドを使うクラスを作成して実行した結果です。
ご覧のとおり、「最大値は」の後に、byte型の最大値が表示されています。
さて、Aさんが、何らかの理由でbyte型用のオーバーロードを削除したとしましょう。簡単に考えると、Bさんのクラスはコンパイルエラーになりそうな気がしますが、そうではありません。例外も発生せず、予想外の結果になります。
この現象はint型への暗黙の変換によって起こります。Bさんの作ったクラスが呼び出していたbyte型のメソッドがなくなったのですが、コンパイラはすぐにエラーにはせず、byte型をint型に拡張して再度マッチングします。この結果、num2Max(int)が見つかり、これが採用されてしまったわけです。
byte/short型を用いる場合は、int型への暗黙の変換が発生することを考慮し、思わぬトラブルを避けることをお勧めします。
Copyright © ITmedia, Inc. All Rights Reserved.