Java/基礎 変数と代入演算

出典: フリー教科書『ウィキブックス(Wikibooks)』
Jump to navigation Jump to search

データ型[編集]

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には、数値や文字、論理値などのデータ型と、オブジェクトのデータ型があります。前者の型をプリミティブ型、後者の型をリファレンス型、といったように二分されます。

ここでは詳細には踏み込みませんが、arr.lengthobj.toString() のように、.名前 のようにピリオドに続けてメソッドなどにアクセスできるのがリファレンス型、できないのがプリミティブ型です。オブジェクトの型(クラスの型)の他に配列やインターフェースの型などもリファレンス型です(インターフェースのインスタンスを作ることはできませんが、インターフェース型の変数などは可能です)。

プリミティブ型[編集]

プリミティブ型には、次のものがあります。

データ型 種類 データの幅 データの表現範囲
int 整数 32ビット (-2147483648 ~ 2147483647)
long 整数 64ビット (-9223372036854775808L ~ 9223372036854775807L)
short 整数 16ビット (-32768~ 32767)
byte 整数(オクテット) 8ビット -128 ~ 127
double 浮動小数点数 64ビット IEEE 754 規格の倍精度浮動小数点数
float 浮動小数点数 32ビット IEEE 754 規格の単精度浮動小数点数
char Unicode
(UTF-16)
16ビット UTF-16の16ビットぶん。charという名前だがサロゲートペアにより16ビットの範囲を超えたUnicodeについては、「その半分」を表現する
boolean 真偽値 (1ビット) trueかfalse
Wikipedia
ウィキペディアプリミティブ型の記事があります。
参考:

「単精度整数」などといった表現がネットのコンテンツや書籍にはたいへんしばしば見られますが、Javaの仕様書などにはありません。整数の精度(絶対精度)は、適切に丸められたならば常に「真の値±0.5」だということを考えてみれば、言うまでもないでしょう。

算術演算子を紹介した際にも説明しましたが、算術演算を行う際にはデータ型に注意が必要です。 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(偽)です。

リファレンス型[編集]

Wikipedia
ウィキペディアクラスの記事があります。
Wiktionary
ウィクショナリークラスの記事があります。
Wikipedia
ウィキペディアリファレンス型の記事があります。

Javaでは型はプリミティブ型とリファレンス型に大別され、クラスの型はリファレンス型になります。他にインタフェースと、配列の型も、具体的には「何々型の配列」という型になりますが、リファレンス型になります。

Javaでは、データ型をユーザ定義するには、クラスを使います。もっとも、現段階ではまだオブジェクト指向についてほとんど考慮していませんから、クラス(とリファレンス型)について深く言及することはしません。

変数宣言と代入演算[編集]

値は変数に格納することができます。 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;

は、代入演算です。 代入とは、変数に値を割り当てることを意味します。 ここではabにそれぞれ1を代入しています。 1int型ですから、int型の変数であるabに全く問題なく代入することができます。

変数宣言と代入は、次のようにまとめて書くこともできます。

int a = 1;
int b = 1;

また、同じデータ型の変数は、カンマで区切って、まとめて書くことができます。

int a, b;

上の書き方は、int型の変数abを宣言したことを意味します。 代入演算も同時に行う場合は、次のように書きます。

int a = 1, b = 1;


このページ「Java/基礎 変数と代入演算」は、書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にノートへどうぞ。