変数

Javaも他の言語と同様、変数があります。変数とは一時的に値を保持しておくもので、プログラムを作成する上で無くてはならない重要なものです。ここではJavaの変数およびその型について説明します。


変数の型

変数には取り扱う値によって型を指定する必要があります。Javaには様々な型が用意されていますが、大きく分けて次の2種類に分類されます。

▲PageTop

プリミティブ型(基本データ型)

プリミティブ型は、算術演算などに使われる整数値や浮動小数点数、その他、真偽値、文字など基本となるデータを取り扱う型です。


プリミティブ型一覧

表記 サイズ 値の範囲 備考
論理型 boolean - true/false 真偽値
文字型 char 2byte 0 ~ 216-1 Unicode の一文字
符号付整数型 byte 1byte -27 ~ 27-1
short 2byte -215 ~ 215-1
int 4byte -231 ~ 231-1
long 8byte -263 ~ 263-1
浮動小数点型 float 4byte 単精度浮動小数点数 IEEE 754 規格
double 8byte 倍精度浮動小数点数 IEEE 754 規格

※C言語などは処理効率を優先させる為に基本となる型のサイズは処理系に依存させていますがJavaでは処理系に依存しない('Write once, run anywhere' )が基本理念であるためプリミティブ型のデータサイズは固定となっています。

▲PageTop

参照型(オブジェクト型)

プリミティブ型以外はすべて参照型となります。クラスインターフェースなどを型として利用できるところが、オブジェクト指向言語の特徴でもあります。文字列を扱う「String」型や配列型なども参照型になります。参照型とプリミティブ型の違いなど詳細はこちらを参照してください。


基本データ型のラッパークラス

Javaでは基本データ型もオブジェクトとして取り扱えるように、各基本データ型に対応する変換クラスが用意されています。このようなクラスをラッパークラスと呼びます。


基本データ型 対応するラッパークラス 変換例
boolean java.lang.Boolean new Boolean(true); , Boolean.valueOf(true);
char java.lang.Character new Character('A'); , Character.valueOf('A')
byte java.lang.Byte new Byte("1"); , Byte.valueOf("1");
short java.lang.Short new Short("1"); , Short.valueOf("1")
int java.lang.Integer new Integer(1); , Integer.valueOf(1);
long java.lang.Long new Long(1L); , Long.valueOf(1L);
float java.lang.Float new Float(1F); , Float.valueOf(1F);
double java.lang.Double new Double(1D); , Double.valueOf(1D);

※J2SE1.4以前ではコレクションやマップなどに対して直接プリミティブ型の値を取り扱う事ができずラッパークラスに変換して使用していましたが、J2SE5.0からは「オートボクシング(Autoboxing)/アンボクシング(Auto-Unboxing )」が導入され自動変換されるようになりました。

▲PageTop

変数の使用

変数を使用するには、次のように宣言します。

データ型 変数名;

また変数を”,”(カンマ)で区切って複数の変数を宣言する事も出来ます。

データ型 変数名1, 変数名2, ・・・;

例えばint型の変数aに10代入する場合は次のようになります。

int a;
a = 10;

また次のように宣言と同時に値の代入(初期化)することも可能です。

int a = 10;

▲PageTop

変数の命名規則

変数名には次の約束があります。


  1. 半角英数字( a ~ z , A ~ Z )、アンダースコア(_)、ダラー($)のいずれかの文字を使用すること。
  2. 数値を変数名の先頭にする事はできません。
  3. Javaの予約語は変数名にできません。
  4. 「true」、「false」、「null」および演算子記号は使用できません。
  5. 大文字と小文字は区別します。

・Javaの予約語
abstract   class       extends       import        private      switch          volatile

assert     const       final         instanceof    protected    synchronized    while

boolean    continue    finally       int           public       this

break      default     float         interface     return       throw

byte       do          for           long          short        throws

case       double      goto          native        static       transient

catch      else        if            new           strictfp     try

char       enum        implements    package       super        void
        

※「const」および「goto」はJavaで使用されていませんが、予約語になっています。

▲PageTop

型変換

異なった型の変数で演算や代入を行うとき、条件を満たせばJavaは自動的に型変換(暗黙の型変換)を行います。また強制的に型を指定する事も可能で、これを明示的型変換(キャスト)といいます。


暗黙の型変換

暗黙の型変換が行われるのは主に次のような場合です。


1.式内の各オペランドの型が異なるとき。

この場合、一番大きい型に統一されます。このような型変換を「型の昇格」と呼びます。型の順位は次のようになります。

char < short < int < long < float < double

但し、int型よりも小さい型はすべてint型に統一されます。これを「汎整数拡張」といいます。


2.異なる型へ代入するとき。

この場合は、左辺の型に変換されます。基本的にJavaはより小さい型への変換は禁止していますが、下記の場合にのみ変換が行われます。

「byte」、「short」、「char」の変数に、int型のリテラルや定数(int型の変数ではない)を代入する場合で、代入される変数の型の
範囲が代入値をカバーできている場合は縮小変換されます。

3.文字列を連結するとき。

+演算子の一方のオペランドがStringオブジェクトである場合、もう一方のオペランドが文字列に変換されて連結されます。


・サンプル(Sample0201.java)

public class Sample0201 {
    public static void main(String[] args) {
        float  float_value = 0.5f;
        int    int_value = 1;
        final int final_int_value=10;
        String str_value = "abc";

        float f = float_value + int_value; // int型がfloat型に昇格して計算されfloat型に代入される。
        byte  b = final_int_value; // int型がbyte型に縮小され代入される。
        String s = str_value + 1; // int型がString型に変換され代入される。

        System.out.println("x="+ f);
        System.out.println("y="+ b);
        System.out.println("s="+ s);
    }
}

・出力結果

C:\dev\java>javac Sample0201.java [Enter]

C:\dev\java>java Sample0201 [Enter]
x=1.5
y=10
s=abc1
        

明示的型変換(キャスト)

「キャスト演算子」を使用することで、一時的に型を変換することが出来ます。


・サンプル(Sample0202.java)

public class Sample0202 {
    public static void main(String[] args) {
        int    a = 5;
        int    b = 2;
        float  x;
        float  y;

        x = a / b; // int型同士の演算なので算出結果もint型になる。
        y = (float)a / b; // 一方のオペランドをfloat型に「キャスト」する事で式内最大のfloat型に揃えられる。

        System.out.println("x="+ x);
        System.out.println("y="+ y);
    }
}

・出力結果

C:\dev\java>javac Sample0202.java [Enter]

C:\dev\java>java Sample0202 [Enter]
x=2.0
y=2.5
        

その他、クラスによる型変換

ラッパークラスやStringクラスを使用することで型変換を行うことができます。


元の型 変換後の型 変換例
文字列 数値型 byte型 byte value = Byte.parseByte(string)
short型 short value = Short.parseShort(string)
int型 int value = Integer.parseInt(string)
long型 long value = Long.parseLong(string)
float型 float value = Float.parseFloat(string)
double型 double value = Double.parseDouble(string)
数値型 byte型 文字列 String string = String.valueOf(bytevalue)
short型 String string = String.valueOf(shortvalue)
int型 String string = String.valueOf(intvalue)
long型 String string = String.valueOf(longvalue)
float型 String string = String.valueOf(floatvalue)
double型 String string = String.valueOf(doublevalue)

※上記の使用方法はあくまで一例です。詳細はJDK API仕様を参照してください。

▲PageTop