この章では、変数とデータ型、算術演算子、型変換について説明していきます
変数
変数とは、データを格納するための箱のようなものでプログラムを実行している途中の値を記憶するために用います
変数には、データ型(形式)が存在しています
以下の手順で変数を利用します
- 変数の宣言
変数を作成することを変数の宣言と言います
変数の宣言は以下のように記述します
型名 変数名;
変数に入れる値の種類を型名で指定します
型名の後に変数の名前を指定します
※型名については「データ型」を、変数名の命名規則は「識別子」で説明します
整数型のnumという変数を宣言する場合、以下のように記述します
int num;
Javaでは、宣言した変数に値を代入したり、計算を行うために参照したりしながら命令文を実行していきます
プログラムで必要になる変数は、すべて、はじめに宣言する必要があります
- 値の代入
宣言した変数に値を入れることを代入といいます
変数に値を代入する構文は次の通りです
変数名 = 値;
変数名には、宣言済みの変数の名前を記述し、値には代入する値を記述します
代入する値は、変数名を宣言したときのデータ型に一致する値しか代入できません=
(イコール)は代入演算子と言い、代入するときに使用します
num=10;
たとえば、「num」という変数に10を代入する場合、上記のように記述します
これで変数「num」に10という値が入ります
- 値の参照
変数名を記載することで、変数名の値を参照することができます
変数を宣言し、値を代入後、中身を表示するサンプルプログラムを以下に示します
public class Sample {
public static void main(String[] args){
double d; //変数の宣言
d = 3.14; //値の代入
System.out.println(d);//値の参照
}
}
実行結果
3.14
前述したサンプルプログラムの変数の宣言と値の代入を一度に行うこともできます
double d = 3.14;
このように記述すると3.14が代入された状態の変数dを作成することができます
変数の宣言時に初期値(はじめの値)を代入することを初期化
と呼びます
識別子
Javaの識別子とは、プログラム内の各変数やメソッド、クラスなどを個別に識別するために使用される名前のことを言います
識別子の命名には以下のルールがあります
- 英字(A~Z、a~z)、数字(0~9)、アンダースコア(_)が使用できる
- ただし、先頭の文字に数字は利用できない
- 大文字と小文字は区別される
- Javaの予約語ではないこと
※予約語とは、Javaであらかじめ用途が決められた単語のこと
以上のルールを守っていれば、変数名やメソッド名、クラス名は自由に決められますが、命名した変数やメソッド、クラスが何を表すのか想像できるようなわかりやすい名前にするのがよいでしょう
データ型
Javaのデータ型とは、変数や関数の戻り値などで使用する値の種類や形式を指定するもので、大きく基本型(プリミティブ型)
と参照型
に分類できます
・基本型(プリミティブ型)
基本的な数値や文字などの単純なデータを表す型で、変数を宣言した際、領域が確保され、値が変数の領域に格納されます
・参照型
オブジェクトや配列などの複雑なデータを表す型で、確保した変数の領域に値が格納されるわけではなく、値が格納されたメモリの場所が格納されます
データ型によって、メモリ上に確保される領域の大きさや値の範囲が決まります
Javaで使用するプリミティブ型のデータ型は次のとおりです
型 | 扱える値の範囲 | 説明 | |
---|---|---|---|
論理型 | boolean | 真偽値 true(真)またはfalse(偽) | true,false |
文字型 | char | 1文字(16ビットUnicode文字) | ‘a’,’b’,’c’,…’あ’,’い’,… |
整数型 | byte | -128~127 | 8ビット符号付き整数 |
short | -32768~32767 | 2バイト符号付き整数 | |
int | -2147483648~2147483647 | 4バイト符号付き整数 | |
long | -9223372036854775808~9223372036854775807 | 8バイト符号付き整数 | |
浮動小数点型 | float | ±1.40239846×10^-45~±3.40282347×10^38 | 4バイト単精度浮動小数点数 |
double | ±4.94065645841246544×10^-324~±1.79769313486231570×10^308 | 8バイト倍精度浮動小数点数 |
整数を表す型にはbyte型、int型、short型、long型があります。違いは扱える数値の範囲です
整数型の変数に代入する際には、どの範囲に収まるかを判断して使い分ける必要があります
一般的にはint型を使うことが多いです
小数点を含む値を代入するには、float型あるいはdouble型を使用します
数値の精度により使い分けます
一般的にはdouble型を使うことが多いです
char型の変数には文字を1つだけ代入できます
文字列(複数の文字)を代入することはできません
文字はシングルコーテーション(”)で囲みます
boolean型は真偽値を扱い、true(真)、false(偽)の値を持ちます
プリミティブ型の各データ型で変数を宣言するサンプルプログラムを以下に示します
int x = 10; // int型の変数xに10を代入
double y = 3.14; // double型の変数yに3.14を代入
char c = 'A'; // char型の変数cに'A'を代入
boolean b = true; // boolean型の変数bにtrueを代入
算術演算子
算術演算子とは四則演算を行うための演算子のことです
算術演算子の一覧は以下の通りです
演算子 | 読み方 | 意味 | 使用例 |
---|---|---|---|
+ | プラス | 加算 | 5+2 |
- | マイナス | 減算 | 5-2 |
* | アスタリスク | 乗算 | 5*2 |
/ | スラッシュ | 除算 | 5/2、5.5/2.5 |
% | パーセント | 剰余 | 5%2 |
%
演算子は整数値で整数値を割る場合にのみ使用されます。double型、float型を与えるとコンパイル時にエラーとなります/
演算子は除算を行いますが、整数値同士と小数点を含む場合とでは挙動が異なります
・int(整数)型同士の除算の場合は商が計算されます
・double型、float型同士の場合は小数点まで計算されます
変数同士の算術演算子を用いたサンプルプログラムを以下に示します
public class Sample {
public static void main(String[] args){
int a = 5;
int b = 2;
//加算
System.out.println(a+b); //実行結果:7
//減算
System.out.println(a-b); //実行結果:3
//乗算
System.out.println(a*b); //実行結果:10
//除算
System.out.println(a/b); //実行結果:2
double x=5.0;
double y=2.0;
System.out.println(x/y); // 実行結果:2.5
//剰余
System.out.println(a%b); //実行結果:1
}
}
実行結果
7
3
10
2
2.5
1
+
は、文字列を連結する場合にも使用されます
文字列の連結の場合は、1つの文字列にする役割を持っています
※文字列については、後の章で説明します
System.out.println("a+b=" + 5);
実行結果
a+b=5
代入演算子
=
(イコール)は代入演算子と言い、代入するときに使用すると説明しました
もう少し説明すると、右辺の値を左辺の変数に代入する役割を持っています
従って、以下のように使用することもできます
int num = 3;
num = num + 2;
ystem.out.println(num) // 実行結果:5
numを3で初期化します
そのあと、変数numの値に2加算した結果を変数numに代入します
代入演算子を別の演算子と組み合わせる
num = num + 2
のように変数の値を増減させる計算には、以下のような演算子が存在します
演算子 | 意味 | 使用例 |
---|---|---|
+= | 加算して代入 | a+=2; (a=a+2と等しい) |
-= | 減算して代入 | a-=2; (a=a-2と等しい) |
*= | 乗算して代入 | a*=2; (a=a*2と等しい) |
/= | 除算して代入 | a/=2; (a=a/2と等しい) |
%= | 剰余して代入 | a%=2; (a=a%2と等しい) |
代入演算子を使ったサンプルプログラムを以下に示します
public class Sample {
public static void main(String[] args){
int x = 10;
System.out.println("x=" + x); //実行結果:10
x += 5; // xに5を加えて、xに代入
System.out.println("x+5=" + x); //実行結果:15
x -= 3; // xから3を引いて、xに代入
System.out.println("x-3=" + x); //実行結果:12
x *= 2; // xに2を掛けて、xに代入
System.out.println("x*2=" + x); //実行結果:24
x /= 4; // xを4で割って、xに代入
System.out.println("x/4=" + x); //実行結果:6
x %= 2; // xを2で割った余りを、xに代入
System.out.println("x%2=" +x); //実行結果:0
}
}
実行結果
x=10
x+5=15
x-3=12
x*2=24
x/4=6
x%2=0
インクリメント演算子・デクリメント演算子
変数に1だけ加算、減算する場合には、以下のような記述方法もあります
演算子 | 読み方 | 意味 | 使用例 |
---|---|---|---|
++ | インクリメント | 左辺の変数の値を1増やします。 | a++;(後置き) ++a;(前置き) |
— | デクリメント | 左辺の変数の値を1減らします | a–;(後置き) –a;(前置き) |
インクリメントとデクリメントには後起きと前置きが用意されています
前置きも後置きもどちらも変数の値を 1 だけ増加または減少させるという点では同じ動作をします
サンプルプログラムを以下に示します。
public class Sample{
public static void main(String []args){
int a = 8;
int b = 8;
a++;
System.out.println("a = " + a);
++b;
System.out.println("b = " + b);
}
}
実行結果
a = 9
b = 9
しかし、以下のサンプルのようにインクリメントした後に変数に代入した場合、結果が異なってきます。
public class Sample{
public static void main(String []args){
int a = 8;
int b;
System.out.println("a = " + a);
b = a++;
System.out.println("後置きインクリメントの結果");
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("----");
a = 8;
System.out.println("a = " + a);
b = ++a;
System.out.println("前置きインクリメントの結果");
System.out.println("a = " + a);
System.out.println("b = " + b);
}
}
実行結果
a = 8
後置きインクリメントの結果
a = 9
b = 8
----
a = 8
前置きインクリメントの結果
a = 9
b = 9
後置演算(a++,a–)の場合:
先に代入してから++やーー処理を実行します
これは次のようなステップで処理を行っています
① a = 8;
② b = a;
③ a = a + 1;
前置演算(++a、–a)の場合:
先に++やーー処理をしてから代入します
これは次のようなステップで処理を行っています
① a = 8;
② a = a + 1;
③ b = a;
このようにインクリメント演算子、デクリメント演算子を代入演算子などの他の演算子と組み合わせる場合、1増える(1減らす)タイミングが変わってきます
このような書き方はバグの原因になりやすいので、単独で使用することをお勧めします
型変換
変数の代入で説明したように、変数には、変数を宣言したときの型と同じ型をもつ値しか代入できません
しかし、扱える値の範囲が大きい型へ代入する場合に限り、異なるデータ型同士の値を計算したり、変数に代入したりする際に、自動的に型変換が行われることがあります
- 数値型の拡大変換
int型の値をlong型の変数に代入する際やfloat型の値をdouble型の変数に代入する場合、代入する値を代入先の変数の型に自動変換してから代入が行われます
public class Sample{
public static void main(String []args){
int num = 1;
long lnum = num;
System.out.println(((Object)num).getClass().getSimpleName());
System.out.println(((Object)lnum).getClass().getSimpleName());
}
}
実行結果
Integer
Long
numをLong型に変換してからlnumに代入しています
((Object)num).getClass().getSimpleName()は、変数の型を調べるための関数です
- 計算
異なる数値型の値を計算する際、両方のオペランドがより大きな共通の型に変換されてから計算が行われます
※オペランドとは、演算の対象となる値や変数のことです
例えば a + 5の場合、a,5がオペランドです
public class Sample{
public static void main(String []args){
int x = 10;
double y = 2.5;
double z = x + y;
System.out.println(((Object)x).getClass().getSimpleName());
System.out.println(((Object)z).getClass().getSimpleName());
}
}
実行結果
Integer
Double
xが自動的にdouble型に変換され、double型同士の演算を実施後、zに代入し、zはdouble型になっています
また、プログラマが強制的に型変換することもでき、これをキャストといいます
以下のように記述します
変数 = (代入先の型名)変数
キャストを実行したサンプルプログラムを以下に示します
public class Sample{
public static void main(String []args){
double x = 3.14;
int y = (int)x; // xの小数点以下が切り捨てられ、yに代入される
System.out.println(((Object)x).getClass().getSimpleName());
System.out.println(((Object)y).getClass().getSimpleName());
System.out.println("y="+y);
}
}
実行結果
Double
Integer
y=3
このサンプルプログラムでは、double型の変数xをint型に変換するためにキャストを行っています
キャストは、異なるデータ型の間で値を変換する操作で、この場合、xの小数点以下が切り捨てられ、整数部分のみがint型の変数yに代入されます
キャストによってデータが失われる可能性があるので、特に、より大きな型の値をより小さな型の変数に代入する場合は注意が必要です
また、不適切なキャストは、実行時エラーを引き起こす可能性があります
キャストを使用する際は、データの損失や実行時エラーに注意し、適切な場面で利用するようにしましょう
【演習問題】
- ⼆つの整数を定義しその和を出⼒するプログラムを作成しましょう
実行結果
2 + 3 = 5
- 1のプログラムをもとに、定義した2つの整数の和、差、積、商、剰余を求めるプログラムを作成してみましょう
実行結果
13 + 8 = 21
13 - 8 = 5
13 * 8 = 104
13 / 8 = 1
13 % 8 = 5
- double型の変数を定義し、円の⾯積を求めるプログラムを作成してみましょう
ただし、円周率は3.14として計算します
実行結果
半径:1.250000の円の⾯積は4.906250です
コメント