こんにちは。ECF Techブログ
担当 Michiharu.Tです。
Javaプログラミング入門記事の第2章をお送りいたします。
第2章のテーマは「値の基本」です。
本連載の初回および章立ての一覧については下記のリンクから確認できます。
解説動画
2023/12/01 解説動画を掲載しました。
2-1 リテラルと型
プログラム中に直接記述できる値をリテラルと言います。また、書き方によって値の種類が決まります。この種類をデータ型または型と言います。
いくつかの値の書き方を使用したプログラム例を下に示します。
プログラム例
public class Main{ public static void main(String[] args){ System.out.println("Hello");//文字列 System.out.println(123);//整数 System.out.println(12.3);//小数点数 } }
解説
1章で登場した"
で囲んだ書き方だと値の種類は文字列と認識されます。123
は整数、12.3
は小数点数と認識されます。
2-1-1 型名
型にはそれぞれ正式な名称があります。これを型名と言います。代表的な書き方とその時に判定される型名を下表に示します。
書き方例 | 型名 | 型の説明 |
---|---|---|
123 |
int | 整数を表します。 |
12.3 |
double | 浮動小数点数を表します。 |
'A' |
char | 1文字を表します |
"Hello" |
String | 複数文字(文字列)を表します。 |
2-2 変数
変数は値を入れておくためのコンピュータ内の入れ物です。変数を使うことで複雑な処理を実現することができます。
2-2-1 変数の使い方
変数を使うための3つのステップを示します。
それぞれの書き方について、1つずつ確認します。
(1)変数の宣言
変数の宣言(変数宣言)とは、変数を準備することです。文法は次のようになります。
型名 変数名;
変数名は変数につけられる名前です。どのような値が入っているかが分かりやすい名前を付けるようにしましょう。
整数を入れる変数を準備したいときは
int val;
のように記述します。変数名はval
としました。
(2)値の代入
変数を作ったら値を入れます。変数に値を入れることを代入と言います。値を代入する文法は次のとおりです。
変数名 = 値;
変数val
に5
を入れておきたいときは下のように記述します。
val = 5;
(3)変数の利用
値が代入できたら、変数を使うことができます。変数名をプログラム中に書けばリテラルのように利用することができます。
3つの手順を含んだプログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ //変数の宣言 int val; //値の代入 val = 5; //変数の利用 System.out.println(val); } }
実行結果
5
解説
3つの命令文が記述されています。各文上のコメントがそれぞれ処理内容を示しています。コメントにあるとおり、
int val;
で変数を宣言val = 5
で変数に値を代入System.out.println(val)
で変数
という順番で処理を行っています。
2-2-2 変数の性質
変数の性質についていくつか説明します。
(1)変数宣言と同時に代入
次のように記述すると、変数の宣言と値の代入を1つの文で記述できます。
型名 変数名 = 値;
プログラム例を示します。この文は変数val
を宣言すると同時に5
を代入します。
int val = 5;
(2)再代入と上書き
変数は何度でも値を代入できます。値を再度代入すると、もとの値が上書きされます。プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int val = 5; val = 8; System.out.println(val); } }
実行結果
8
解説
この例では最初に変数宣言と同時に5
が代入されます。ですが、次の行で8
を再代入しているため、System.out.println(val);
では8が表示されます。
(3)変数の複数宣言
変数は複数宣言できます。プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int a = 5; int b = 8; System.out.println(a); System.out.println(b); } }
実行結果
5 8
解説
2つの変数a
とb
を宣言し、それぞれ5
と8
を代入しています。
int a; int a;
(4)変数と型
変数宣言の時に記述した型と値の型は一致させる必要があります。たとえば次のような記述はエラーとなります。
int val = 3.5;
エラーメッセージは次のとおりです。
Main.java:3: エラー: 不適合な型: 精度が失われる可能性があるdoubleからintへの変換 int val = 3.5; ^ エラー1個
変数の型がint型であるのに対し、値はdouble型と判断されます。そのため、型が合わずエラーとなります。
もう1つエラーになる例を示します。
char c = "こんにちは"; //char型の変数にString型の値を代入
コメントに記載のとおり、変数の型と異なる値を代入しています。
2-3 基本データ型
Javaの型には基本データ型と参照型の2種類があります。ここでは基本データ型についてご紹介します。
基本データ型は次の8種類です。
型名 | 概要 | リテラルの書き方例 | サイズ |
---|---|---|---|
long | 大きな整数値 | 123456789012L | 8バイト |
int | 整数値 | 12345678 | 4バイト |
short | 小さな整数値 | - | 2バイト |
byte | ごく小さな整数値 | - | 1バイト |
double | 浮動小数点数 | 12.3 | 8バイト |
float | 低精度の浮動小数点数 | 12.3f | 4バイト |
char | 1文字 | 'あ' | 2バイト |
boolean | 真偽値 | true | - |
- long型のリテラルは値の末尾に
L
またはl
をつけます。 - float型のリテラルは値の末尾に
f
またはF
をつけます。 - boolean型のリテラルは
true
かfalse
の2つのみです。 - サイズは値1つの情報量です。この値が大きいほど表現できる値の幅が大きくなります。
まずは利用頻度の高いint,double,booleanを覚えておくと良いでしょう。
文字列を表すString型は基本データ型には含まれません。String型は参照型に分類されます。参照型については後の章でご紹介予定です。
さまざまなリテラルを使ったプログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int i = 10; float f = 3.14f; char c = 'あ'; boolean b = false; System.out.println(i); System.out.println(f); System.out.println(c); System.out.println(b); } }
実行結果
10 3.14 あ false
解説
4種類の変数とその型に合った値の代入を行っています。それぞれの変数をSystem.out.println
で表示しています。
2-3-1 数値型の最大値・最小値
整数型のlong、int、short、byteおよび、浮動小数点数型のdouble、floatについて、最大値・最小値を表示するプログラムをご紹介します。
プログラム例
public class Main{ public static void main(String[] args){ //整数型の最大値 System.out.println(Long.MAX_VALUE);//long System.out.println(Integer.MAX_VALUE);//int System.out.println(Short.MAX_VALUE);//short System.out.println(Byte.MAX_VALUE);//byte //浮動小数点数型の最大値 System.out.println(Double.MAX_VALUE);//double System.out.println(Float.MAX_VALUE);//float } }
実行結果
9223372036854775807 2147483647 32767 127 1.7976931348623157E308 3.4028235E38
解説
プログラム中のコメントにあるとおり、long、int、short、byte、double、floatの順に各最大値を表示しています。doubleとfloat型は指数を使った表記となっています。たとえば3.4028235E38
は、3.4028235×1038であることを表します。
続いて最小値です。
プログラム例
public class Main{ public static void main(String[] args){ //整数型の最小値 System.out.println(Long.MIN_VALUE); //long System.out.println(Integer.MIN_VALUE); //int System.out.println(Short.MIN_VALUE);//short System.out.println(Byte.MIN_VALUE);//byte //浮動小数点数型の最小値 System.out.println(Double.MIN_VALUE);//double System.out.println(Float.MIN_VALUE);//float } }
実行結果
-9223372036854775808 -2147483648 -32768 -128 4.9E-324 1.4E-45
解説
最大値のプログラムでMAX
だった部分がMIN
に変わっています。
オレンジ色は表現可能な範囲、灰色の部分は0に近い精細な値のため表現できない範囲です。
2-3-2 リテラル値のエラーパターン
次にリテラル値の書き方でエラーを引き起こすケースについてご紹介します。
System.out.println(123456789012); //(1) float f = 1.23; //(2)
- (1)は
123456789012
がint型と判断されます。ですが、int型の表現範囲を超えた値となっているためエラーとなります。数値部分を123456789012L
などと表記する必要があります。 - (2)は
1.23
がdouble型と判断されます。代入しようとしている変数はfloat型なので、型が合わずエラーとなります。1.23f
などと表記する必要があります。
2-4 代入のルール
変数に値を代入する際のルールについて確認します。変数に代入が可能なのは、原則として同じ型の値のみ。ですが一部例外的なルールもあります。この例外的なルールをプログラム例と共にご紹介します。
2-4-1 大は小を兼ねる
サイズの大きな変数には、サイズの小さな値を代入できます。下は正しく動作するプログラム例です。
double d = 123; //double型の変数にint型の値を代入 short s = 30000;//short型の変数にint型の値を代入
1行目の123
はint型のリテラルです。double型はint型よりもサイズの大きな型なので、double型の変数にint型の値が代入できます。
一方で2行目の30000
はint型のリテラルです。short型はint型よりもサイズの小さな型なので、この代入には違和感があります。
この代入が可能な理由はshort型の表現範囲にあります。short型の表現可能な値は -32768〜32767 までです。30000
はこの範囲に収まっているため、代入が許可されています。
2-4-2 変数は型で判断される
変数の値を利用する場合、値のサイズは型で判断されます。たとえば次のような例を見てみましょう。
long a = 123; int b = a;
始めにlong型の変数aに123
を代入しています。次にint型の変数bに変数aの値を代入しようとしています。aの値は123
なのでint型の変数bに十分収まりますが、変数aはlong型であるため、変数bのint型より大きい型と見なされ、コンパイルエラーとなります。
2-5 識別子
識別子はクラス名や変数名などの、プログラマ自身が名前づけできるものの総称です。識別子の名前づけには次のようなルールがあります。
- 大文字と小文字は区別される
- 先頭に数値は使用できない。
- 予約語は使用できない。
true
,false
,null
は使用できない。
正しい変数宣言の例を示します。
int hello; int _2; int $; int あ;
-
,_
など)で構成するようにしましょう。もう1つ、正しく動作する例を示します。
int value = 5; int Value = 10; System.out.println(value); System.out.println(Value);
実行結果
5 10
1つめの変数名はvalue
、2つめの変数名は先頭1文字だけ大文字でValue
となっています。この2つの変数は別物として区別されるため正しく動作しますが、紛らわしいため、変数宣言の方法としては推奨されません。
次にエラーとなる変数宣言の例を示します。エラー理由はコメント部分に記載しています。
int 2nd; //先頭が数値になっている int if; //予約語を使っている
2-5-1 予約語
予約語はJavaの構文の一部として用いられる単語のことです。これらを識別子として使うことはできません。
abstract | assert | boolean | break | byte | case |
catch | char | class | const | continue | default |
do | double | else | enum | extends | final |
finally | float | for | if | goto | implements |
import | instanceof | int | interface | long | native |
new | package | private | protected | public | return |
short | static | strictfp | super | switch | synchronized |
this | throw | throws | transient | try | void |
volatile | while | _ |