プログラムでは、社員の名前や年齢のような値を、名前を付けて覚えておきます。これが 変数 です。Java では、変数に入れる値の種類(型)を必ず書きます。この章では、変数の使い方と、この教材で使う型、値の計算に使う演算子を学びます。
この章で学ぶこと
- 変数の宣言、代入、初期化
- 基本型(
int・long・double・float・boolean)とString - 計算の演算子と、整数の割り算の決まり
- 型の自動変換
- 値を変えられない変数(定数)と
final
4.1 この章で作るもの
この章では、ch04 パッケージに練習用のクラス Variable を作ります。章の最後には、実行するとコンソールに次のように表示されるようになります。
雷禅 海皇さんは26歳です
1年後は27歳です
社員の数:3人
売上:12345678900円
平均年齢:25.666666666666668歳
在籍中:true
年齢の合計:77
3人の平均(整数):25
3人の平均(小数):25.666666666666668
3 を 2 で割った余り:1
年齢の上限:99
| ファイル | 作業 | 内容 |
|---|---|---|
ch04/Variable.java |
新規 | 変数・型・演算子を確かめる練習用のクラス |
4.2 Variable.java を作る
-
srcを右クリックし、新規 → パッケージ でch04パッケージを作ります。 -
ch04パッケージを右クリックし、新規 → クラス で、名前Variable、「public static void main(String[] args)」に チェックを入れて クラスを作ります。 -
// TODOの行を消して、緑の行を入力します。ch04/Variable.javapackage ch04; public class Variable { public static void main(String[] args) { String name = "雷禅 海皇"; int age = 26; System.out.println(name + "さんは" + age + "歳です"); age = age + 1; System.out.println("1年後は" + age + "歳です"); } } -
保存して実行します。
コンソール雷禅 海皇さんは26歳です 1年後は27歳です
4.3 変数の宣言と代入
変数 は、値を入れておく名前付きの入れ物です。変数を使うには、まず 宣言 します。宣言は、型 と 変数名 を並べて書きます。
型 変数名 = 値; // 宣言と同時に値を入れる(初期化)
型 変数名; // 宣言だけ
変数名 = 値; // 後から値を入れる(代入)
| コード | 意味 |
|---|---|
String name = "雷禅 海皇"; |
String(文字列)型の変数 name を宣言し、"雷禅 海皇" を入れる |
int age = 26; |
int(整数)型の変数 age を宣言し、26 を入れる |
age = age + 1; |
age の今の値(26)に 1 を足した結果(27)を、age に入れ直す |
= は「等しい」ではなく、「右の値を左の変数に入れる」という意味です(代入)。age = age + 1; は、数学では成り立ちませんが、Java では「右を先に計算して、左に入れる」と読みます。変数に入れた値は、別の値を代入するまで変わりません。
変数名の決まり
- 英字で始め、英字・数字・
_を使う。name、age、deptId、birthDate - 2つ以上の単語をつなぐときは、2つ目からの単語の先頭を大文字にする(
birthDate、empId)。この書き方を キャメルケース という - 先頭は小文字にする(クラス名は大文字で始めるので、見分けやすくなる)
- 大文字と小文字は区別される。
ageとAgeは別の変数 -
int・class・publicのような、Java で意味が決まっている言葉(予約語)は使えない
【ご注意】同じ名前の変数は、同じブロックの中で2回宣言できない
int age = 26; と書いた後に、もう一度 int age = 27; と書くと、「重複ローカル変数 age」というエラーになります。値を変えたいときは、型を付けずに age = 27; と代入だけを書きます。
【ご注意】値を入れる前の変数は使えない
int age; と宣言しただけで値を入れずに System.out.println(age); と書くと、「ローカル変数 age が初期化されていない可能性があります」というエラーになります。宣言と同時に値を入れる(初期化する)習慣を付けましょう。
4.4 基本型
Java の型には、基本型(数や真偽の値をそのまま持つ型)と、参照型(クラスの型など。第8章)があります。この教材で使う基本型は、次の5つです。
| 型 | 入れられる値 | 書き方の例 | 使いどころ |
|---|---|---|---|
int |
整数(約 −21億 〜 21億) | int age = 26; |
年齢、人数、ID など、ほとんどの整数 |
long |
大きな整数(約 ±922京) | long sales = 12345678900L; |
int に入りきらない整数。値の最後に L を付ける |
double |
小数 | double average = 25.5; |
平均、割合など。小数は、ふつう double を使う |
float |
小数(double より精度が低い) |
float rate = 0.5F; |
値の最後に F を付ける。この教材では使わない |
boolean |
true(真)か false(偽) |
boolean working = true; |
「はい/いいえ」の2択。条件分岐(第5章)で使う |
-
Variable.javaに緑の行を書き足します。ch04/Variable.javapackage ch04; public class Variable { public static void main(String[] args) { String name = "雷禅 海皇"; int age = 26; System.out.println(name + "さんは" + age + "歳です"); age = age + 1; System.out.println("1年後は" + age + "歳です"); int count = 3; long sales = 12345678900L; double average = 77 / 3.0; boolean working = true; System.out.println("社員の数:" + count + "人"); System.out.println("売上:" + sales + "円"); System.out.println("平均年齢:" + average + "歳"); System.out.println("在籍中:" + working); } } -
保存して実行します。
コンソール雷禅 海皇さんは26歳です 1年後は27歳です 社員の数:3人 売上:12345678900円 平均年齢:25.666666666666668歳 在籍中:true
12345678900 は int の範囲(約21億)を超えているので、long に入れます。このとき、値の最後に L を付けます。L を付けないと、「型 int のリテラル 12345678900 は範囲外です」というエラーになります。
【知識メモ】リテラル
26、12345678900L、25.5、true、"雷禅 海皇" のように、コードに直接書いた値を リテラル といいます。整数のリテラルは int、小数のリテラルは double として扱われます。そのため、long には L、float には F を付けて、型を変えます。Spring入門では 1L という書き方が出てきます(第9章の定数で使います)。
【知識メモ】ほかの基本型
Java には、ほかに byte・short(小さな整数)と char(1文字)があります。この教材と Spring入門では使いません。
4.5 String
String は、文字列を入れる型です。基本型ではなく、クラス です(クラスは第8章で学びます)。String のようなクラスの型や配列の型は、参照型 といいます。参照型の変数が値をどのように持つかは、8.6「参照」で説明します。クラスの名前は大文字で始めるという決まりがあるので、String の S も大文字です。
String の値は " で囲んで書きます。文字が1つもない ""(空文字列)も、文字列です。文字列どうしは + でつなげられ、数や boolean を + でつなぐと、それらも文字列になります(第3章 3.5)。
String firstName = "海皇";
String lastName = "雷禅";
String fullName = lastName + " " + firstName; // "雷禅 海皇"
String message = fullName + "さんは" + 26 + "歳"; // "雷禅 海皇さんは26歳"
文字列の比較や、文字数を調べる方法は、第5章で学びます。
4.6 演算子
計算の演算子
数の計算には、次の 演算子 を使います。
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
+ |
足す | 26 + 27 + 24 |
77 |
- |
引く | 27 - 26 |
1 |
* |
掛ける | 3 * 4 |
12 |
/ |
割る | 77 / 3 |
25(整数どうしは小数点以下を切り捨て) |
% |
割った余り | 3 % 2 |
1 |
-
Variable.javaに緑の行を書き足します。ch04/Variable.java(main メソッドの後半)System.out.println("在籍中:" + working); int total = 26 + 27 + 24; System.out.println("年齢の合計:" + total); System.out.println("3人の平均(整数):" + total / 3); System.out.println("3人の平均(小数):" + total / 3.0); System.out.println("3 を 2 で割った余り:" + 3 % 2); } } -
保存して実行します。
コンソール(後半)年齢の合計:77 3人の平均(整数):25 3人の平均(小数):25.666666666666668 3 を 2 で割った余り:1
【ご注意】整数どうしの割り算は、小数点以下が切り捨てられる
77 / 3 は、int どうしの計算なので、結果も int の 25 になります。小数の結果がほしいときは、77 / 3.0 のように、どちらかを小数にします。int と double の計算は、int が自動で double に変換されてから行われ、結果は double になります。
計算の順番は、算数と同じです。*・/・% が +・- より先に行われ、( ) で囲んだ部分が最も先に行われます。"3人の平均(整数):" + total / 3 では、/ が + より先なので、total / 3 が計算されてから文字列につながります。
代入を短く書く演算子
「変数の今の値に足して、入れ直す」という処理はよく使うので、短く書く演算子があります。
| 書き方 | 同じ意味 |
|---|---|
age += 1; |
age = age + 1; |
total -= 10; |
total = total - 10; |
age++; |
age = age + 1;(1 だけ足すとき) |
age--; |
age = age - 1;(1 だけ引くとき) |
++ は、第6章の繰り返しで回数を数えるときによく使います。
型の自動変換
小さい範囲の型の値は、大きい範囲の型の変数に、そのまま代入できます。int の値を long や double の変数に入れるときは、自動で変換されます。
int age = 26;
long bigAge = age; // int → long は自動で変換される
double realAge = age; // int → double も自動で変換される(26.0 になる)
int back = realAge; // double → int はエラー(小数点以下が失われるため)
【知識メモ】キャスト
小数を無理に整数にしたいときは、int back = (int) realAge; のように、値の前に (型) を書きます。これを キャスト といい、小数点以下は切り捨てられます。この教材と Spring入門では使いません。
4.7 定数と final
年齢の上限のように、プログラムの中で値を変えてはいけないものには、宣言に final を付けます。final を付けた変数を 定数 といい、後から代入しようとするとエラーになります。
-
Variable.javaのmainメソッドの最後に、緑の行を書き足します。ch04/Variable.java(main メソッドの最後)System.out.println("3 を 2 で割った余り:" + 3 % 2); final int MAX_AGE = 99; System.out.println("年齢の上限:" + MAX_AGE); } } -
保存して実行します。最後に、次のように表示されます。
コンソール(最後の行)年齢の上限:99 -
試しに、
MAX_AGE = 100;という行を書き足してみてください。「final のローカル変数 MAX_AGE には代入できません」というエラーになります。確かめたら、その行は消します。
定数の名前は、ふつうの変数と区別するために、MAX_AGE のように すべて大文字にして、単語を _ でつなぐ 決まりです。
【便利な使い方】値に名前を付ける
99 という数がコードの中に直接書いてあると、後で読む人には、それが何の数なのか分かりません。MAX_AGE という名前を付けておけば、意味が分かり、上限を変えるときも1か所を直すだけで済みます。Spring入門では、クラスの定数として private static final long serialVersionUID = 1L; という行が出てきます。static の意味は第9章で学びます。
4.8 うまくいかないときは
| 症状 | 考えられる原因と対処 |
|---|---|
| 「型の不一致: double から int には変換できません」 | 小数の値を int の変数に入れようとしています。変数の型を double にするか、値を整数にしてください。 |
| 「型 int のリテラル 12345678900 は範囲外です」 |
int に入らない大きな数です。変数を long にして、値の最後に L を付けてください。 |
| 「重複ローカル変数 age」 | 同じ名前の変数を2回宣言しています。2回目は型を付けず、age = 27; のように代入だけを書いてください。 |
| 「ローカル変数 age が初期化されていない可能性があります」 | 値を入れる前に変数を使っています。宣言と同時に値を入れてください。 |
| 「age を変数に解決できません」 | 宣言していない名前を使っているか、名前の大文字と小文字が違います。宣言した行と比べてください。 |
平均が 25 になり、小数にならない |
整数どうしの割り算です。total / 3.0 のように、どちらかを小数にしてください。 |
ほかのコンパイルエラーは、付録A「よくあるコンパイルエラー」 も参考にしてください。
4.9 まとめと確認問題
まとめ
-
変数 は
型 変数名 = 値;で宣言する。=は「右の値を左に入れる」(代入) - 整数は
int、大きな整数はlong(値にL)、小数はdouble(floatは値にF)、真偽はboolean(true/false)、文字列はString - 変数名はキャメルケース(
birthDate)、定数名はすべて大文字(MAX_AGE)、クラス名は大文字で始める(String) - 計算は
+-*/%。整数どうしの/は小数点以下を切り捨てる。+=、++で代入を短く書ける -
int→long→doubleの向きには自動で変換される。逆はエラー -
finalを付けた変数は 定数。後から値を変えられない
この章で使った書き方は、付録B「文法早見表」の「変数と型」 にまとめています。
確認問題
問1 「京都府」という文字列を入れる変数 address を宣言して、値を入れるコードを書いてください。
解答を見る
String address = "京都府";
問2 次のコードを実行すると、age の値はいくつになりますか。int age = 26;age = age + 1;age++;
解答を見る
28 です。26 に 1 を足して 27、++ でさらに 1 足して 28 になります。
問3 System.out.println(7 / 2); と System.out.println(7 / 2.0); は、それぞれ何と表示しますか。
解答を見る
3 と 3.5 です。整数どうしの割り算は小数点以下が切り捨てられ、どちらかが小数なら小数の結果になります。
問4 long count = 3000000000; はエラーになります。どう直せばよいですか。
解答を見る
値の最後に L を付けて、long count = 3000000000L; と書きます。L が無いと、値が int のリテラルとして扱われ、範囲外になります。
問5 final を付けた変数に、後から値を代入するとどうなりますか。
解答を見る
コンパイルエラーになります。final を付けた変数(定数)は、最初に入れた値から変えられません。