Java/基礎 変数と代入演算
出典: フリー教科書『ウィキブックス(Wikibooks)』
目次 |
[編集] データ型
Javaプログラムに登場するすべての値は、何らかのデータ型に属します。
たとえば、
System.out.println(1 + 1);
という文には、数字の「1」という値が出てきています。
わたしたち人間は「1」を、「数字」として認識したり、あるいはもう少し細かく「自然数」とか「整数」として認識したりするかもしれません。 しかしJavaプログラムでは、これはint型というデータ型の値として識別されます。
int型の「int」は、integer(整数)のことです。 その名の通りint型は、Javaプログラムにおいて整数を表す最も一般的な型だと言えます。 しかし、数学的な意味で言う「整数」とは定義が異なります。 int型は−2147483648から2147483647までの範囲、すなわち32ビットで表現できる整数だけを意味するという、非常にプログラミング言語らしい概念です。
データ型はもちろんint型だけではありません。 たとえば、上記のコードに出てくる1のことを「1.0」と書いたとしましょう。 すると、「1.0」はint型ではなく、double型として認識されますし、その影響は(原則的に)実行結果にも及びます。 小数点を含んだ数値表現は、自動的に別のデータ型として認識され、データ型が異なれば、その影響は処理の流れにも及ぶということです。
double型の「double」とは、double-precision(倍精度)を意味します。 「倍精度」というのは聞き慣れない言葉ですが、これは倍精度浮動小数点数というものを意味しています。 これはわたしたちの言う「実数」に近いものですが、int型の場合と同様、実数とdouble型は同じ概念ではありません。 当たり前ですが、double型は、あくまで倍精度浮動小数点数で表せる数値を意味するのです。 倍精度浮動小数点の厳密な仕様はIEEE 754で定められています。
さて、ここではint型とdouble型を例に挙げましたが、このように、Javaプログラムに登場する値は、必ず何らかの型に属します。 そしてプログラマは、こうしたデータ型を意識しながらプログラムを書くことになります。
[編集] データ型の種類
Javaにint型とdouble型があることを紹介しましたが、もちろんデータ型はこれだけではありません。 Javaには、数値や文字、論理値を表すデータ型や、オブジェクトを表すデータ型(つまり、クラスのこと)があります。
前者(つまり数値、文字、論理値を表すデータ型)は、後者(つまりクラス)と性質を異にします。 その違いを一言で説明するなら、後者はオブジェクト指向的ですが、前者はそうではありません。 そのため、前者はプリミティブ型(基本型)と呼ばれています。後者は要するにクラスのことですが、プリミティブ型に対する用語としてリファレンス型(参照型)とも呼ばれます。
[編集] プリミティブ型
プリミティブ型には、次のものがあります。
| データ型 | 種類 | 名称 | データの幅 | データの表現範囲 |
|---|---|---|---|---|
| int | 整数 | 符号付き単精度整数 | 32ビット | − 231˜231 − 1 (-2147483648 ~ 2147483647) |
| long | 整数 | 符号付き倍精度整数 | 64ビット | − 263˜263 − 1 (-9223372036854775808L ~ 9223372036854775807L) |
| short | 整数 | 符号付き半精度整数 | 16ビット | − 215˜215 − 1 (-32768~ 32767) |
| byte | 整数 | 符号付きバイト型整数 | 8ビット | -128 ~ 127 |
| double | 実数 | 符号付き倍精度浮動小数点数 | 64ビット | IEEE 754 規格の倍精度浮動小数点数 |
| float | 実数 | 符号付き単精度浮動小数点数 | 32ビット | IEEE 754 規格の単精度浮動小数点数 |
| char | 文字 | 文字型 | 16ビット | 0~ 65535の整数に対応したUnicode文字。サロゲートペアにより16ビットの範囲を超えた文字も利用可能 |
| boolean | 論理値 | 論理型 | 1ビット | trueとfalse |
整数を表すデータ型は4種類ありますが、通常使うのはint型とlong型です。 long型の「long」は、long intの意味です。 つまりデータ幅を拡張したint型がlongです(short型も同様)。 int型に収まり切らない大きな数値には、long型が使われます。
算術演算子を紹介した際にも説明しましたが、算術演算を行う際にはデータ型に注意が必要です。 int型同士の演算結果は、int型になります。 int型の上限は、おおよそ21億4700万強ですが、演算結果がこれを超える場合でも、自動的にlong型に拡張するようなことはなく、単純にオーバーフローします。
たとえば11億×2を「1100000000 * 2」と書くと、オーバーフローが発生し、演算結果は不正になります。このとき、特にエラーや例外が発生することはありません。
計算結果をlong型で得るには、被演算数の少なくともどちらか一方をlong型として指定します。long型として指定するには、数値の末尾に「L」もしくは「l」を付加します。たとえば「1100000000L * 2」のようにします。
char型は、1文字の文字を表すデータ型です。 文字は、'1'のようにクォーテーション(')で囲んで表します。 Unicode文字を表すので、たとえば 'あ' のように、非ASCII文字であっても表すことができます。
またchar型は、画面上に文字として現れない制御文字も表すことができます。 この場合、エスケープシーケンスとしてバックスラッシュ文字を利用します。 エスケープシーケンスを使った表現には、たとえば '\n'(改行文字)や '\t'(タブ文字)などがあります。 また、バックスラッシュ自身やクォーテーションも同様にして表現します。たとえば '\\'(バックスラッシュを表す)、'\(クォーテーションを表す)という具合です。
boolean型は、論理値を表します。論理値はtrue(真)もしくはfalse(偽)で表します。
[編集] リファレンス型
リファレンス型というのは、クラスのことです。
クラスというのは、プログラマの感覚としては「プログラムのパーツ」としての意味合いが強いかもしれません。 しかし、「データ型」という観点から見れば、クラスの実装はすなわちデータ型の自作を意味しています。 もっとも、現段階ではまだオブジェクト指向についてほとんど考慮していませんから、これについて深く考慮することはしません。
[編集] 変数宣言と代入演算
値は変数に格納することができます。 Javaの場合、変数の使用に当たっては変数宣言を行っておく必要があり、 また変数宣言では、どんな型の値を格納するかを明示する必要があります。
変数宣言の最も基本的な書式は、次の通りです。
データ型 変数名;
たとえば、次のコードでは、mainメソッド内でint型の変数としてaという名前とbという名前を使うことを宣言しています。
class Main {
public static void main(String[] args) {
int a;
int b;
a = 1;
b = 1;
System.out.println(a + b);
}
}
変数宣言に続いて行っている
a = 1; b = 1;
は、代入演算です。 代入とは、変数に値を割り当てることを意味します。 ここではaとbにそれぞれ1を代入しています。 1はint型ですから、int型の変数であるa、bに全く問題なく代入することができます。
変数宣言と代入は、次のようにまとめて書くこともできます。
int a = 1; int b = 1;
また、同じデータ型の変数は、カンマで区切って、まとめて書くことができます。
int a, b;
上の書き方は、int型の変数aとbを宣言したことを意味します。 代入演算も同時に行う場合は、次のように書きます。
int a = 1, b = 1;