Javaの基本(前編)

Java基礎 3

1.本章での学習項目

Javaプログラムを記述する上で最低限必要な基本ルールと基本文法を学習する「Javaの基本」の前編です。
前編では、構文ルールやデータ型、演算子などを扱います。
条件処理や繰り返しを扱う後編はこちらよりご覧ください。

2.本章の講義

本章で学習する内容を動画としてまとめたものです。一通り見終わった後、学習に入るようにしましょう。

講義:Javaの基本①

3.Javaの構文ルール

Javaプログラムを書くにあたって、いくつか気をつけなければならない点を説明します。

3.1.一つの命令文の終わり

これから、多くの命令(コマンド)を学習しますが、基本的に一つの命令文の終わりには、「;(セミコロン:半角)」を記述する必要があります。
全角、半角も判定しますので、気をつけてましょう。

System.out.println("こんにちは世界!"); // セミコロンをつける

3.2.括弧

Javaは、様々な括弧を用いるプログラミング言語です。一つ一つの括弧には、それぞれ意味がありますので、適切に括弧を使用しなければなりません。
一纏まりの処理を「{}」という括弧で囲みます。

public class HelloWorld { // 「クラス」という処理の始まり
	/**
	 * @param args
	 */
	public static void main(String[] args) { // 「メソッド」という処理の始まり
		System.out.println("こんにちは世界!");
	} // 「メソッド」という処理の終わり
} // 「クラス」という処理の終わり

3.3.インデント

プログラムを記述するときには、一定のルールに従って、スペースや改行、インデント(数文字分のスペース)を入れることにより、読みやすいソースコードを作成することができます。
ただし、一つの命令(コマンド)の途中で、不用意にスペースや改行を入れると、エラーとなりますので、気をつけましょう。

// 命令の途中で改行するとエラーになります。
public class HelloWorld {
	public static void main(String[] args) {
		System.out.print // "System.out.println"という命令の途中で改行
			ln("こんにちは世界!");
		}
}

Javaの場合、「{}」の括弧の中は、インデントを入れて、一段右にシフトするように記述すると分かりやすいプログラムとなります。

// 「{}」の括弧の中は、インデント(タブキーで空白)を入れる
public class HelloWorld {
	public static void main(String[] args) {  ←インデント
		System.out.println("こんにちは世界!");  ←インデント
	}
}

本講座に記載されているサンプルソースなどを見て、読みやすいプログラムを書くようにしましょう。

3.4.コメント

プログラムソースは、長くなったり複雑になったりすると、処理内容が分かり難くなります。
コメントは、プログラムのソースコードの中に記述する注釈です。
処理内容を簡潔に記述することで、メンテナンス(プログラムの修正)がしやすくなります。

通常、システム開発では、プログラムを作成したプログラマとは別のプログラマが修正を行うことが多いため、コメントは重要になります。
コメントとして記述された部分は、プログラムとして実行されません。

コメントは、主に次の2種類があります。

  1. 一行コメント
    コメントの先頭に「//」を記述します。「//」から改行までがコメントとなります。

    // 1行コメント:これはコメントのため、プログラムとして処理されません。
    public class HelloWorld {
    	public static void main(String[] args) { // メインメソッド(コメント)
    		System.out.println("こんにちは世界!"); // 「こんにちは世界!」を画面表示(コメント)
    	}
    }
  2. 複数行コメント
    複数行に渡るコメントにしたい場合は、文言を「/*」から「*/」で囲みます。

    /* 複数行コメントです。複数行に渡るときに使います。
     *  このような感じです。
     *  こちらもプログラムとしては処理されません。
     */
    public class HelloWorld {
    	public static void main(String[] args) {
    		System.out.println("こんにちは世界!");
    	}
    }

4.文字列の画面表示

「はじめてのJava」の章で記述した文字列を画面表示するコマンドの復習をしましょう。
コンソールに文字列を表示するコマンドは、次のような構文になります。「””(ダブルクォーテーション)」の中に出力したい文字列を記述します。
このコマンドは、今後もよく使いますので、覚えましょう。

System.out.println("出力したい文字列");

「println」の「ln(エル・エヌ)」は、改行という意味です。
以下を実行すると、「あいうえお」で改行され、「あいうえお」と「かきくけこ」がコンソールに表示されます。

System.out.println("あいうえお");
System.out.println("かきくけこ");

改行をしたくない場合、「ln(エル・エヌ)」を付けず、「print」と記述します。
以下を実行すると、「あいうえおかきくけこ」とコンソールに表示されます。

System.out.print("あいうえお");
System.out.print("かきくけこ");

数字や、これから学習する変数は、「””(ダブルクォーテーション)」で囲まず記述すると、数字や変数に代入された値がそのまま表示されます。
また、円マークや改行などの一部の特殊な文字は、そのまま記述しても出力できません。
Javaではこれらの特殊な文字を表示する場合、次のような「エスケープシーケンス」を使います。
「エスケープシーケンス」とは、そのままでは表示できない特殊な文字を画面に表示するための制御文字です。

System.out.println("あ" + "\t" + "い"); // 「あ」と「い」の間にタブスペースを挿入する場合

Javaで使用できるエスケープシーケンスには以下のようなものがあります。

表 1. Javaのエスケープシーケンスの例
記述 名称 説明
\t 水平タブ Tab(タブ)スペース
\n 改行 改行
\" ダブルクォート ダブルクォーテーション
\' シングルクォート シングルクォーテーション
\\ 円マーク 円マーク

なお、「\(円マーク)」は、半角入力で、キーボードの「\」を押下します。

Information

文字コードの設定によっては、円マークがバックスラッシュで表示されることもありますが、同義として捉えてください。
なお、文字コードとは、各文字に対応付けられた固有の番号のことです。
様々な種類がありますが、主に「UTF-8」を使いますので、こちらを覚えておくと良いでしょう。

5.データ型、変数、定数、型変換

プログラムは、数字や文字などのデータを処理していきます。
ここでは、データを処理するときに必要な変数やデータ型などの扱い方について学習します。
ここで紹介する文法は、Java言語だけでなく、プログラミング言語共通のものです。

5.1.変数

変数とは、データを入れておくための入れ物です。

数字や文字などがデータとなりますが、プログラムで処理するときに、これらのデータを一時的にメモリに記憶させて処理をします。
その時、そのメモリ領域に名前をつけてデータを記憶させます。このメモリ領域に固有の名前を付けたもののことを、変数と言います。

数学で言うと、xやyのようなものです。変数に格納したデータは、必要な時に取り出して利用します。
また、処理の途中で違うデータを入れなおすこともできます。


hensu

プログラムで記述すると以下のようになります。

x = 10; // 変数xに10を入れます
x = 20; // 変数xに20を入れなおします
x = 10 * 20; // 変数xに10×20の結果、200を入れなおします

数学とは異なり、変数には数字だけでなく文字データも入れることができます。
文字データを入れるときは、「””(ダブルクォーテーション)」でデータを囲みます。
プログラムで記述すると以下のようになります。

y = "おはよう"; // 変数yに「おはよう」を入れます
y = "こんにちは"; // 変数yに「こんにちは」を入れなおします
y = "こんばんは"; // 変数yに「こんばんは」を入れなおします

5.2.データ型

さて、次は、データ型について説明します。

変数を使うときには、お約束として変数の宣言をする必要があります。
前に説明したとおり、コンピュータは、曖昧な命令では処理を実行してくれません。
変数を使うときも、使う前にコンピュータに「自分は、xという名前の変数をこういうデータの種類で使いますから、メモリーを用意してください」と宣言しておく必要があります。
これを変数の宣言と言います。

データ型は、データの種類のことです。
「文字」と「数字」などのように、データの種類によって用意する変数の形式(入れ物の形)が異なります。
変数を扱うときには、適切なデータ型で宣言する必要があります。また、変数には必ず「変数名」をつける必要があります。

変数の宣言の書式は、以下のとおりとなります。

データ型 変数名;

上記の変数の説明で使用したxとyの場合は、以下のような宣言になります。

int x; // intは、整数のデータ型です
String y; // Stringは、文字列のデータ型です

Javaのデータ型は大別して、以下のように、「基本データ型(プリミティブ型)」と「参照型(リファレンス型)」に分けられます。


datatype

「基本データ型(プリミティブ型)」は8種類のみで新たに作成する事はできません。
「基本データ型(プリミティブ型)」は、大きく分けると文字型と数値型、boolean型があります。
また、数値型の場合、型に大きさがあり、入れる値の大きさによって使い分けをします。
小さい型に大きな数字を入れると、内部的に桁あふれが発生し、おかしな数字になってしまいます。
また、必要もないのに大きいデータ型を使うことは、メモリーの無駄になりますので、適切なデータ型を使用するようにしましょう。

基本データ型には含まれませんが、上記で説明したString型は文字列のデータ型となり、文字列を扱うときには最もよく使うデータ型です。
String型は、参照型のクラス型変数に分類されます。

boolean型は特殊な型で、trueかfalseのどちらかの値が入ります。
trueは「真」という意味で、何かの条件に合っている場合を示し、falseは「偽」という意味で、条件に合っていない場合を示します。

「参照型(リファレンス型)」とはクラス、インターフェイス、配列の事で、これらは後の章で解説します。

以下が基本データ型になります。

表 2. 基本データ型一覧
データ型の分類 データ型 記憶できるデータの種類と値の範囲
数値型 byte 整数(1バイト、-128から127)
数値型 short 整数(2バイト、-32768から32767)
数値型 int 整数(4バイト、-2147483648から2147483647)
数値型 long 整数(8バイト、-9223372036854775808から9223372036854775807)
数値型 float 小数(4バイト単精度浮動小数点)
数値型 double 小数(8バイト倍精度浮動小数点)
文字型 char 文字(2バイト、1文字のみ)
boolean型 boolean true(真)かfalse(偽)
Information

変数名のルール

変数を使うときには必ず「変数名」をつける必要がありますが、基本的には自由にその名前をつけることができます。
ただし、以下のような制限がありますので注意しましょう。

  • 数字で始めることはできません。
  • Javaで使っているキーワード(予約語と言います)は、使用できません。(class、+、/など)

変数名は、どんなデータが入っているか、推測しやすい名前をつけた方がいいでしょう。また、Javaでは以下のような暗黙のルールがあります。

  • 一つの変数名で複数の単語をくっつけて命名するときは、二つ目以降の単語の一文字目は大文字にします。
  • 変数名とメソッド名は小文字から始めます。
  • クラス名は、大文字から始めます。
  • 定数は、全て大文字で、単語と単語は、アンダーバーでくっつけます。
  • パッケージ名は、全て小文字で表します。

これらは守らないとエラーになるわけではありませんが、Javaの世界では通例となっています。
また、実際のシステム開発では命名規約と呼ばれるものがあり、変数名などの命名のルールが定義されていることがあります。
そういった場合には、命名規約を遵守する必要があります。

5.3.代入

変数にデータ(値)を入れることを代入と言います。


dainyu

代入には、「=(イコール:半角)」を使用します。「=」の左側に代入したい変数名を書き、右側に代入したいデータを書きます。
代入の書式は、以下のとおりとなります。

変数名 = データ(値);

変数を使用するためには、データ型の項で学習したように、変数の宣言をしておく必要があります。
実際に変数を宣言し、その変数にデータ(値)を代入した場合は、以下のようになります。


dainyu2

代入をプログラムで書くと、以下のようになります。
文字列の場合、「””(ダブルクォーテーション)」で文字列を囲みましょう。
また、1文字の場合、「”(シングルクォーテーション)」で文字を囲む必要があります。

Hensu1.java
public class Hensu1 { // クラスの宣言(後で学習します)
	public static void main(String[] args) { // メインメソッド(後で学習します)
		int x; // 変数xの宣言
		String y; // 変数yの宣言
		char z; // 変数zの宣言

		x = 10; // xに10を代入
		y = "こんにちは"; // yに文字列「こんにちは」を代入(「""(ダブルクォーテーション)」使用)
		z = 'あ'; // zに文字「あ」を代入「''(シングルクォーテーション)」使用)
	}
}

変数の宣言と同時に、変数に値を代入することもできます。

Hensu2.java
public class Hensu2 {
	public static void main(String[] args) {
		int x = 10; // 変数xの宣言と代入
		String y = "こんにちは"; // 変数yの宣言と代入
		char z = 'あ'; // 変数zの宣言と代入
	}
}

代入では、変数にデータ(値)そのものではなく他の変数を代入することもできます。

Hensu3.java
public class Hensu3 {
	public static void main(String[] args) {
		int x = 10; // 変数xの宣言と10を代入
		int z = x; // 変数zの宣言とxの値(10)を代入
	}
}

変数には、データ(値)を代入するだけではなく、計算結果を代入することもできます。
また、値を出力するために、変数を使用することも可能です。変数の計算については、後で詳しく説明します。

Hensu4.java
public class Hensu4 {
	public static void main(String[] args) {
		int x = 10; // 変数xの宣言と10を代入
		System.out.println(x); // xの値(10)を出力

		int z = x + 2; // 変数zの宣言とxの値(10)に2を加算した12を代入
		System.out.println(z); // zの値(12)を出力
	}
}

代入では、データ(値)の種類(文字や整数、小数など)が、宣言したデータ型と合致している必要があります。


dainyu3

// 文字データは int 型に代入できないため、以下のコードはエラー
int a = "こんにちは";

また、代入するデータ(値)のサイズが宣言したデータ型のサイズよりも大きかった場合、桁あふれがおきますので、気をつけましょう。
代入時は、型の範囲に注意する必要があります。


dainyu4

// 変数aはint型であり、
// 2147483648という数値はint型の範囲より大きい数字であるため、エラー
int a = 2147483648;

また、long型の変数にint型の範囲よりも大きい数字を代入するときには、注意が必要です。
int型の範囲より大きい整数(整数リテラル又は単にリテラルと呼びます)を、long型の変数に代入する値としてそのまま記述した場合、このような整数は全てint型として判断されてしまい、たとえlong型の変数に代入していたとしても、エラーになります。

以下のように、2147483648という数字は、int型の範囲を越えるためエラーになります。

// 変数aはlong型であるため、型の大きさとしては問題ありませんが、
// 2147483648という数値そのものがint型の範囲より大きい数字であるため、エラー
long a = 2147483648;

そのため、long型の変数にint型の範囲より大きい整数を代入するときには、代入する数字の最後に「L(エル:大文字)」または、「l(エル:小文字)」を記述する必要があります。
以下のように「L」又は「l」を数字の最後に記述すると、その整数はlong型となり、エラーになりません。

// 数値の後ろにLを付けると、その数値はlong型となり、エラーなく代入できます
long a = 2147483648L;

小数点を含む数値は、そのまま記述すると、double型になります。float型で表現したい場合は、数字の後ろに「F」か「f」を書く必要があります。

float b = 3.14F; // 3.14は、float型となります

このように、整数の場合はint型、小数の場合はdouble型が基本の型となります。このような「L」、「l」、「F」、「f」といった記述のことを「サフィクス」と言います。これらの記述は忘れやすいため、注意しましょう。

Information

変数の初期化

変数は、何もデータ(値)が代入されていないと利用できません。変数の宣言のみで、代入が一度もされていないことを、「変数が初期化されていない」と言います。
Javaでは、変数の宣言をした後は、初期値を代入しておく必要があります。変数に何らかの値を代入することを「初期化」と言います。

5.4.定数

変数の宣言の前にfinalというキーワードを記述することによって、その変数は、定数と呼ばれる特殊な変数となります。

変数には、宣言した型に合ったデータであれば、処理の中で何回でもデータを代入し直すことができます。
定数の場合、定数に一度何かデータを代入するとそれが固定値となり、それ以降、プログラム処理の中で違うデータに変更することはできません。
例えば、1年365日の365やファイル名など、固定値として扱い、変更されたくない値は、定数で定義します。

定数の書式は、以下のとおりとなります。

final データ型 変数名 = データ(値);

以下の例のように定数名は全て大文字で宣言するのが通例です。

final int HOUR = 24;
final float PAI = 3.14F;

5.5.型変換(キャスト)

これまで説明してきたように、変数にはデータ型が指定されており、基本的に、そのデータ型と異なるデータ型のデータ(値)は、その変数に代入することはできません。
そのため、文字列の数値型変数への代入、またはその逆もエラーになります。
ただし、数値型の場合、データの範囲の大きい型に小さい型を代入することは可能です。

しかし、小さい型の変数に大きい型のデータを代入することはできません。
例えば、int型の変数に代入できる数値は、long型の変数にも代入できますが、int型の変数に代入できる数値であっても、short型の変数に代入できるとは限りません。


cast1

以下の例のように、範囲の小さいint型のデータを範囲の大きいfloat型に代入すると、エラーにはなりません。

// 100を代入したint型の変数をfloat型bに代入しても、エラーになりません
int a = 100;
String y = "こんにちは"; // 変数yの宣言と代入
float b = a; // 100.0 として代入されます

以下の例では、float型のデータをint型に代入しているため、エラーになります。

// 3.14を代入したfloat型の変数bをint型の変数aに代入するとエラー
float b = 3.14F;
int a = b; // エラーになります

このように、大きいサイズのデータ型のデータを、それより小さいサイズのデータ型の変数に代入する場合は、型を変換する必要があります。
型変換によって、代入を強制的に行うことができます。この型変換をキャストと言います。
キャストは、変換先のデータ型を括弧で囲んで、型変換させたいデータの前に記述します。

以下のように、float型のデータをint型へ代入するときに、そのデータをint型へキャストすることにより、エラーが発生しなくなります。
ただ、キャストを行うことにより、データの精度が落ちることがあります。
そのため、特に精度が求められる計算などを行うプログラムの場合、安易にキャストを使わないように注意しましょう。

以下の例では、float型の数値である「3.14」の小数点以下が切り落とされて、整数の3に変換されています。

// 3.14を強制的にint型に型変換(キャスト)
float b = 3.14F;
int a = (int) b; // 整数の3で代入されます

5.6.型推論

ここまでは、「変数を扱うときには、適切なデータ型で宣言する必要がある。」と説明をしてきましたが、Java 10より、型を指定しなくても、自動で変数のデータ型を推定してくれる機能が実装されました。
この機能により、変数の宣言を以下のように行うことが可能になりました。

// int型とString型の変数を「var」を用いて宣言します。
var a = 100;
var b = "こんにちは";

varは、variable(変数)のことを表し、intやStringなどのデータ型の代わりに用いて、変数の宣言をします。
これにより、変数宣言の簡略化が可能になりました。

ただし、varはすべての変数宣言で用いることができるわけではありません。
詳細な説明は省略しますが、以下の条件を満たしている必要があります。

  • 右辺を見ればデータ型が明白である場合
  • メソッド内で宣言されている変数(ローカル変数)である場合

また、データ型の記述をvarに置き換えることにより、宣言されている変数が何型なのか、プログラムを見直した時にわかりづらいといったデメリットもあります。
特別な理由がない限り、varは使用せずに、データ型を記述して変数宣言を行うようにしましょう。

6.練習問題1

それでは、データ型、変数、定数、キャストの練習問題に挑戦してみましょう。
それぞれの問題ごとに、新規にクラスを作成して、プログラムを作成してください。
クラスの名前は、特に指定しませんので、「Mondai1」など適当な名前を付けて、クラスを作成してください。

6.1.問題1

整数のデータ型の変数「x」を宣言してください。
そのあと、変数「x」に「10」を代入し、変数「x」の値を画面に表示してください。

Mondai6_1.java
/**
 * 処理概要:変数xの宣言と代入
 */
public class Mondai6_1 {
	public static void main(String[] args) {
		// int型変数xの宣言
		int x;

		// 変数xに10を代入
		x = 10;

		// 変数xの値を出力
		System.out.println(x);
	}
}

変数を使用するためには、まず最初に変数の宣言「データ型 変数名」の記述が必要です。
整数を格納する変数の場合、整数のデータ型を使用して変数の宣言を行います。

代入は、変数xが左辺、代入する値10が右辺で「=」を使って代入します。
以下のように変数の宣言と代入を同時に行うこともできます。

int x = 10;

「System.out.println(x);」でコンソールに出力します。
変数に格納されている値を出力する場合、「””(ダブルクォーテーション)」で囲う必要はありません。

6.2.問題2

整数のデータ型の変数「age」を宣言し、その変数「age」に「20」を代入し、変数「age」の値を画面に表示してください。
そのあと、続いて変数「age」に「25」を代入し、「age」の値を画面に表示してください。

Mondai6_2.java
/**
 * 処理概要:変数ageの宣言と代入後、異なる値を再代入
 */
public class Mondai6_2 {
	public static void main(String[] args) {
		// int型変数ageの宣言と値20の代入
		int age = 20;

		// 変数ageの値を出力
		System.out.println(age);

		// 変数ageに値25を再代入
		age = 25;

		// 再代入した変数ageの値を出力
		System.out.println(age);
	}
}

変数の代入および再代入の問題です。
int型変数ageを宣言し、20を代入した後に、変数ageの値をコンソールに出力します。
そのあとに、25を再代入し、再度変数ageの値をコンソールに出力します。

再代入のときに、「int age = 25;」と記述すると、変数宣言の重複となり、エラーになります。
変数を宣言した後に、値を代入する場合、その変数はプログラム上ですでに認識されていますので、もう一度データ型を指定して変数の宣言をする必要はありません。

6.3.問題3

整数のデータ型の変数「population」を宣言し、その変数「population」に「6800000000」を代入し、変数「population」の値を画面に表示してください。

※この問題の解答は掲載しておりません。Tech Fun ITスクールのJava研修では、講師が丁寧に解説しています。

6.4.問題4

文字列のデータ型の変数「address」を宣言し、その変数「address」に「東京都千代田区」を代入し、変数「address」の値を画面に表示してください。
そのあと、その変数「address」に「東京都台東区」を再代入し、「address」の値を画面に表示してください。

Mondai6_4.java
/**
 * 処理概要:文字列型変数addressの宣言と代入および再代入
 */
public class Mondai6_4 {
	public static void main(String[] args) {
		// String型変数addressに文字列を代入
		String address = "東京都千代田区";

		// 変数addressの値を出力
		System.out.println(address);

		// 変数addressに文字列を再代入
		address = "東京都台東区";

		// 変数addressの値を出力
		System.out.println(address);
	}
}

String型変数addressに文字列を代入し、System.out.printlnでコンソールに出力します。
文字列を代入する場合、代入する文字列を「””(ダブルクォーテーション)」で囲って表記しないとエラーになるため注意しましょう。
addressに文字列を再代入しますが、addressの前に再度Stringと記述してしまうと、変数の宣言が重複してしまいますので、気をつけましょう。

6.5.問題5

文字列のデータ型の変数「aisatsu」を宣言し、その変数「aisatsu」に「”おはようございます”、”こんにちは”、”こんばんは”」を代入し、変数「aisatsu」の値を画面に表示してください。
※ 「”(ダブルクォーテーション)」は特殊文字です。文字列として扱う「”(ダブルクォーテーション)」の前には、「\(円マーク)」を付加し、エスケープシーケンスを使用しましょう。

※この問題の解答は掲載しておりません。Tech Fun ITスクールのJava研修では、講師が丁寧に解説しています。

6.6.問題6

整数のデータ型の変数「oldTime」と「newTime」を宣言し、「oldTime」に「8」を、「newTime」に「10」を代入し、それぞれの値を画面に表示してください。
そのあと、「oldTime」に「newTime」の値を代入し、「oldTime」の値を画面に表示してください。

Mondai6_6.java
/**
 * 処理概要:整数型変数oldTimeおよびnewTimeの宣言と代入および再代入
 */
public class Mondai6_6 {

	public static void main(String[] args) {

		// int型変数の宣言
		int oldTime;
		int newTime;

		// 変数に値を代入
		oldTime = 8;
		newTime = 10;

		// 変数の値を出力
		System.out.println(oldTime);
		System.out.println(newTime);

		// 変数oldTimeに変数newTimeの値を代入
		oldTime = newTime;

		// 変数oldTimeの値を出力
		System.out.println(oldTime);
	}
}

int型変数oldTimeとnewTimeを定義し、それぞれに値を代入し、コンソールに出力します。
そのあとに、oldTimeにnewTimeの値10を代入し、コンソールに出力します。

ある変数に入っている値を別の変数に代入する場合、データ型が同じであれば、通常の代入式で実現できます。

6.7.問題7

float型の定数「ENSYU_RITSU」を宣言し、定数値「3.14」を代入し、その定数値を画面に表示してください。

Mondai6_7.java
/**
 * 処理概要:float型定数の宣言と代入
 */
public class Mondai6_7 {
	public static void main(String[] args) {

		// float型定数ENSYU_RITSUの宣言と値の代入
		final float ENSYU_RITSU = 3.14F;

		// 定数ENSYU_RITSUの値を出力
		System.out.println(ENSYU_RITSU);
	}
}

定数を宣言する場合、変数の定義の前に「final」を付加します。
定数は、文法上のルールではありませんが、通例として大文字で定義します。
また、float型の変数および定数に値を代入する場合、値の後に「F」又は「f」を表記するように注意しましょう。

6.8.問題8

文字列のデータ型の定数「FILE_PATH」を宣言し、定数値「C:\temp\test.txt」を代入し、その定数値を画面に表示してください。
※「\(円マーク)」は特殊文字です。文字列として扱う「\」の前には、もう1つ「\(円マーク)」を付加し、エスケープシーケンスを使用しましょう。

Mondai6_8.java
/**
 * 処理概要:文字列型定数の宣言とエスケープシーケンスを利用した値の代入
 */
public class Mondai6_8 {
	public static void main(String[] args) {

		// 文字列型の定数FILE_PATHの宣言
		final String FILE_PATH;

		// 定数FILE_PATHに値の代入
		FILE_PATH = "C:\\temp\\test.txt";

		// 定数FILE_PATHの値を出力
		System.out.println(FILE_PATH);
	}
}

定数を宣言する場合、変数の定義の前に「final」を付加します。
文字列型の定数に「C:\temp\test.txt」を代入していますが、「\(円マーク)」が特殊文字であるため、そのままFILE_PATHに代入してしまうと、「\temp」と「\test」の部分で「\t」(タブスペース)と認識されてしまい、そのまま出力すると、「C:
emp est.txt」と表示されます。
そのため、代入する「\(円マーク)」の前にエスケープ文字としての「\(円マーク)」を付加し、「C:\\temp\\test.txt」と表記して、代入します。

6.9.問題9

float型の変数「hensu1」を宣言し、「5.4321」を代入してください。
また、int型の変数「hensu2」に「hensu1」の値をキャストして代入し、「hensu2」の値を画面に表示してください。

Mondai6_9.java
/**
 * 処理概要:float型の変数の宣言と代入およびint型の変数にキャストして代入
 */
public class Mondai6_9 {

	public static void main(String[] args) {

		// float型変数の宣言と代入
		float hensu1 = 5.4321F;

		// int型変数の宣言
		int hensu2;

		// hensu2にhensu1の値をキャストして代入
		hensu2 = (int) hensu1;

		// hensu2の値を出力
		System.out.println(hensu2);
	}
}

float型変数に代入された小数の値を、int型変数に代入する場合、キャストが必要です。
キャストして代入することによって、整数部のみが代入されるため、最終的な出力結果は「5」となります。

6.10.問題10

以下のソースのコメントに従い、問題に沿ったコードをプログラムソースの「/*ここに追加*/」の部分に追加し、 実行結果と同様に出力されるようにプログラムを完成させてください。

Mondai6_10.java
/**
 * 処理概要:varを使ったの変数の宣言と代入および、キャストと代入
 */
public class Mondai6_10 {
	public static void main(String[] args) {
		// float型の変数hensu1の宣言し「2147483648.234」の値を代入しましょう。
		var hensu1 = /* ここに追加 */;

		// 変数hensu2を宣言し、hensu1の値をキャストして代入しましょう。
		var hensu2 = /* ここに追加 */;

		// hensu2の値を出力
		System.out.println(hensu2);
	}
}
実行結果
2147483648

Mondai6_10.java
/**
 * 処理概要:varを使ったの変数の宣言と代入および、キャストと代入
 */
public class Mondai6_10 {
	public static void main(String[] args) {
		// float型の変数hensu1の宣言し「2147483648.234」の値を代入しましょう。
		var hensu1 = 2147483648.234F;

		// 変数hensu2を宣言し、hensu1の値をキャストして代入しましょう。
		var hensu2 = (long) hensu1;

		// hensu2の値を出力
		System.out.println(hensu2);
	}
}

varを使用することにより、変数宣言での型の記述を省略しています。
float型の変数を整数型にキャストして代入することによって、整数部のみが代入されます。
実行結果の値は、int型の範囲より大きい数字であるため、ここではlong型にキャストして代入する必要があります。

7.演算子

Javaには、いくつかの種類の演算子があります。演算子とは、データ(値)の計算処理を行ったりするものです。
ここでは、それらの演算子について学習します。

7.1.代入演算子

これは、「代入」の項で既に学習した演算子で、右辺(イコールの右側)の値を左辺(イコールの左側)に代入する演算子です。
通常、プログラムは、上から下、左から右に処理されますが、代入演算子の場合、右辺から左辺に代入するので、間違えないようにしましょう。

7.2.算術演算子

算術演算子とは、数学でもよく使用されている、加算、減算、乗算、除算などの演算子のことです。
基本的な算術演算子には、以下のようなものがあります。

算術演算子 説明 記述例
+(プラス) 加算、足す x + y
-(マイナス) 減算、引く x – y
*(アスタリスク) 乗算、掛ける x * y
/(スラッシュ) 除算、割る x / y
%(パーセント) 剰余、割った余り x % y

プログラムで書くと、以下のようになります。

Enzanshi1.java
public class Enzanshi1 {
	public static void main(String[] args) {
		int x = 10; // 変数xの宣言と10の代入
		int y = 2; // 変数yの宣言と2の代入

		int a = x + y; // 変数aの宣言とxとyの加算結果の代入
		int b = x - y; // 変数bの宣言とxとyの減算結果の代入
		int c = x * y; // 変数cの宣言とxとyの乗算結果の代入
		int d = x / y; // 変数dの宣言とxとyの除算結果の代入
		int e = x % y; // 変数eの宣言とxとyの剰余結果の代入
	}
}

同じデータ型の変数やデータ同士の演算は問題ありませんが、異なるデータ型同士の場合は、計算結果に注意が必要です。
計算式で使用されたデータのデータ型の中で、一番大きいサイズのデータ型が、計算結果のデータ型となります。
例えば、int型のデータとdouble型のデータで乗算した場合、計算結果は、double型となります。

以下のプログラムがその例となります。

Enzanshi2.java
public class Enzanshi2 {
	public static void main(String[] args) {
		int x = 10; // int型変数xの宣言と10の代入
		double y = 1.4142; // double型変数yの宣言と1.4142の代入

		double a = x * y; // 変数aの宣言とxとyの乗算結果の代入

		System.out.println(a); // 変数aの値14.142を出力
	}
}

また、int型の変数またはデータ同士の除算で割り切れない場合、計算結果の 小数点以下は切り捨てられて、int型の結果となります。
以下のプログラムがその例となります。

Enzanshi3.java
public class Enzanshi3 {
	public static void main(String[] args) {
		int x = 15; // int型変数xの宣言と15の代入
		int y = 2; // int型変数yの宣言と2の代入

		int a = x / y; // int型変数aの宣言とxとyの除算結果の代入
									 //(7.5の小数点以下は切り捨てられ、7が代入されます)

		System.out.println(a); // 変数aの値7を出力
	}
}

上記の例で、小数点以下も含めた正確な結果を出力したい場合は、計算の元となる二つの変数のどちらかをdouble型へキャストすることによって、計算結果の変数をdouble型にすると良いでしょう。
計算の元となる変数の1つを大きいデータ型に変換すると、範囲が大きいデータ型に合わせて計算されますので、正しい計算結果が取得できます。

Enzanshi4.java
public class Enzanshi4 {
	public static void main(String[] args) {
		int x = 15; // int型変数xの宣言と15の代入
		int y = 2; // int型変数yの宣言と2の代入

		double a = (double)x / y; // xをキャストした後に除算し、変数aに代入

		System.out.println(a); // 変数aの値7.5を出力
	}
}

7.3.インクリメント演算子とデクリメント演算子

インクリメント演算子は、数値型の変数に1を足す演算子です。デクリメント演算子は、1を引く演算子です。

演算子 説明 記述例
++(プラスプラス) 1を加算 i++、++i
–(マイナスマイナス) 1を減算 i–、–i

1を加算することを、インクリメントと呼び、1を減算することを、デクリメントと呼びます。
この「++」や「–」を変数の前に記述する場合と、後に記述する場合で、1を加算(または、減算)するタイミングが異なりますので、気をつけましょう。
プログラムで書くと、以下のようになります。以下の例は、インクリメントですが、デクリメントの場合も、同様になります。

Enzanshi5.java
public class Enzanshi5 {
	public static void main(String[] args) {
		int i = 1; // 変数iの宣言と1の代入
		int j = 1; // 変数jの宣言と1の代入

		int a = i++; // 変数aの宣言とiの値1を代入し、iに1を加算
		int b = ++j; // 変数bの宣言とjの値1に1を加算し、jの値2を代入
	}
}

インクリメント演算子はよく使いますので、この記述の仕方は覚えておいてください。

7.4.複合代入演算子

複合代入演算子は、「x = x + 5」を「x += 5」のように記述する演算子です。以下のようなものがあります。

複合代入演算子 説明 記述例
+=(プラス・イコール) 左辺の変数の値に右辺の値を加算し、その計算結果を左辺の変数に代入 x += 5
-=(マイナス・イコール) 左辺の変数の値から右辺の値を減算し、その計算結果を左辺の変数に代入 x -= 5
*=(アスタリスク・イコール) 左辺の変数の値に右辺の値を乗算し、その計算結果を左辺の変数に代入 x *= 5
/=(スラッシュ・イコール) 左辺の変数の値を右辺の値で除算し、その計算結果を左辺の変数に代入 x /= 5
%=(パーセント・イコール) 左辺の変数の値を右辺の値で除算した余りを左辺の変数に代入 x %= 5

複合演算子は、必ず使用する必要はありません。通常の算術演算子の形式で記述しても問題ありません。
少し記述が楽になる演算子、という程度に覚えておくと良いでしょう。

7.5.関係演算子

関係演算子を使用すると、左辺と右辺の値が比較されて、boolean型のtrueまたはfalseが結果として返ってきます。
関係演算子は、後述の条件分岐や繰り返し処理で頻繁に使用されるものです。

関係演算子には、以下のようなものがあります。

関係演算子 説明 記述例
==(イコール・イコール) 左辺と右辺が等しいか x == y
!=(エクスクラメーション・イコール) 左辺と右辺が等しくないか x != y
>(大なり) 左辺が右辺より大きいか x > y
>=(大なり・イコール) 左辺が右辺より大きいか、または等しいか x >= y
<(小なり) 左辺が右辺より小さいか x < y
<=(小なり・イコール) 左辺が右辺より小さいか、または等しいか x <= y

比較結果が正しい場合、trueとなり、正しくない場合、falseとなります。


compareenzan1


compareenzan2

Enzanshi6.java
public class Enzanshi6 {
	public static void main(String[] args) {
		int x = 10; // int型変数xの宣言と10の代入
		int y = 10; // int型変数yの宣言と10の代入
		System.out.println(x == y); // 変数xとyを比較した結果trueを出力

		y = 20; // yに20を代入
		System.out.println(x == y); // 変数xとyを比較した結果falseを出力
	}
}

7.6.論理演算子

複数の関係演算子を組み合わせるための演算子を論理演算子と言います。
論理演算子を使用することにより、複雑な条件を表す比較式を書くことができます。

論理演算子には、以下のようなものがあります。

論理演算子 説明 記述例
&&(アンド・アンド) 左辺の比較がtrue、かつ右辺の比較がtrueか x < y && x> z
||(パイプ・パイプ) 左辺の比較がtrue、または右辺の比較がtrueか x < y || x> z

プログラムで書くと、以下のようになります。

Enzanshi7.java
public class Enzanshi7 {
	public static void main(String[] args) {
		int x = 15; // int型変数xの宣言と15の代入
		int y = 20; // int型変数yの宣言と20の代入
		int z = 10; // int型変数zの宣言と10の代入

		// 左辺かつ右辺がtrueのため、trueが出力されます
		System.out.println(x < y && x > z);

		// 左辺がtrueのため、trueが出力されます
		System.out.println(x < y || x < z);
	}
}

7.7.文字列の連結

プログラミングの世界では、文字列をつなぎ合わせるために、「+(プラス)」を使用することができます。
「+」を使用して文字列をつなぎ合わせることを、文字列の連結と言います。

数字の演算とは、扱いが異なりますので、気をつけましょう。


stringenzan

プログラムで書くと、以下のようになります。

Enzanshi8.java
public class Enzanshi8 {
	public static void main(String[] args) {
		// String型変数xの宣言と「Javaは、」の代入
		String x = "Javaは、";

		// String型変数yの宣言と「楽しい」の代入
		String y = "楽しい";

		// 変数xとyと"です!"を連結して、「Javaは、楽しいです!」を出力
		System.out.println(x + y + "です!");
	}
}

文字列の変数ではなく、数値型の変数との連結も可能です。演算の中に、文字列が含まれていると、文字列の連結となります。

Enzanshi9.java
public class Enzanshi9 {
	public static void main(String[] args) {
		// String型変数xの宣言と「1日は」の代入
		String x = "1日は、";

		// int型変数yの宣言と24の代入
		int y = 24;

		// String型変数zの宣言と「時間」の代入
		String z = "時間";

		// 変数xとyとzを連結して、「1日は24時間」を出力
		System.out.println(x + y + z);
	}
}

8.練習問題2

演算や文字列連結の練習問題です。

8.1.問題1

int型の変数xとyを宣言し、xに200、yに2を代入してください。
xとyの加算結果、減算結果、乗算結果、除算結果、剰余結果をそれぞれ計算し、画面に表示してください。

Mondai8_1.java
/**
 * 処理概要:2つのint型変数の演算処理
 */
public class Mondai8_1 {
	public static void main(String[] args) {
		// int型変数x、yの宣言と値の代入
		int x = 200;
		int y = 2;

		// xとyの加算、減算、乗算、除算、剰余
		int a = x + y;
		int b = x - y;
		int c = x * y;
		int d = x / y;
		int e = x % y;

		// それぞれの演算結果を出力
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
		System.out.println(d);
		System.out.println(e);
	}
}

int型変数x、yを宣言し、値を代入した後に、2つの変数の加算、減算、乗算、除算、剰余を行っています。
計算結果をそれぞれint型変数a,b,c,d,eに代入し、コンソールに出力します。

8.2.問題2

int型の変数hensu1とhensu2を宣言し、hensu1とhensu2にそれぞれ200000を代入してください。
hensu1とhensu2の加算結果、減算結果、乗算結果、除算結果、剰余結果をそれぞれ計算し、画面に表示してください。
※乗算結果は、int型が扱う数値の範囲を超えてしまいますので、long型にキャストして計算するようにしましょう。

Mondai8_2.java
/**
 * 処理概要:2つのint型変数の演算処理
 */
public class Mondai8_2 {
	public static void main(String[] args) {
		// int型変数の宣言と値の代入
		int hensu1 = 200000;
		int hensu2 = 200000;

		// hensu1とhensu2の加算、減算、乗算、除算、剰余
		int a = hensu1 + hensu2;
		int b = hensu1 - hensu2;
		long c = (long) hensu1 * hensu2;
		int d = hensu1 / hensu2;
		int e = hensu1 % hensu2;

		// それぞれの演算結果を出力
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
		System.out.println(d);
		System.out.println(e);
	}
}

int型変数hensu1、hensu2を宣言し、値を代入した後に、2つの変数の加算、減算、乗算、除算、剰余を行っています。

hensu1とhensu2の乗算結果は、int型の数値範囲を超えてしまうため、計算結果を代入する変数cは、long型で定義します。
また、2つのint型の変数の演算の場合、計算結果もint型として処理されます。そのため、乗算を行った結果がint型の数値範囲を超える場合、内部的に桁あふれが発生します。
桁あふれとは、扱える数値範囲の最大値を超えてしまうことです。

正しく乗算結果を得るためには、hensu1かhensu2をlong型へ型変換(キャスト)して計算を行います。
int型の変数とlong型の変数の演算の場合、数値範囲が大きいlong型に合わせて計算が実行されますので、計算結果も正しい数値となります。

8.3.問題3

int型の変数ageを宣言し、20を代入してください。
変数ageを使用して、「私の年齢は、20歳です。」と画面に表示してください。
そのあと、変数ageをインクリメントし、「明日、21歳になります。」と画面に表示してください。
※文字列の連結処理を行いましょう。

Mondai8_3.java
/**
 * 処理概要:文字列連結処理
 */
public class Mondai8_3 {
	public static void main(String[] args) {
		// int型変数ageの宣言と値の代入
		int age = 20;

		// 変数ageと文字列を連結して出力
		System.out.println("私の年齢は、" + age + "歳です。");

		// 変数ageの値に1を加算
		age++;

		// 変数ageと文字列を連結して出力
		System.out.println("明日、" + age + "歳になります。");
	}
}

文字列連結の問題です。
int型変数ageの値20と文字列を「+」を使って連結し、「私の年齢は、20歳です。」と出力します。
その後、インクリメント演算子を使用して変数ageの値を1増加させ、再度文字列連結をしながら出力しています。

8.4.問題4

int型変数aを宣言して、1を代入してください。
そのあとに、「System.out.println(a++);」を実行してください。
そのあとに、「System.out.println(++a);」を実行してください。
「++(プラスプラス)」が変数の前にあるか、後にあるかによって、処理結果が異なることを確認しましょう。

Mondai8_4.java
/**
 * 処理概要:インクリメント演算子処理
 */
public class Mondai8_4 {

	public static void main(String[] args) {

		// int型変数aの宣言と値の代入
		int a = 1;

		// aの値1を出力した後に、aの値に1を加算
		System.out.println(a++);

		// aの値2に1加算した後に、aの値3を出力
		System.out.println(++a);
	}
}

インクリメント演算子は、変数の値を1つ増やすという処理を行うために使用されます。
この問題のようにSystem.out.printlnと組み合わせて処理する場合、「++」が変数の後にある場合と前にある場合で出力処理とインクリメントの処理の順番が異なります。

変数の後にある場合、出力の処理が先に行われ、インクリメントの処理が後に行われます。
変数の前にある場合、インクリメントの処理が先に行われ、出力の処理が後に行われます。

8.5.問題5

int型変数age1とage2を宣言し、age1に20、age2に25を代入してください。
関係演算子「!=」を使用して、age1とage2を比較した結果を画面に表示してください。
そのあとに、age1に25を代入し、関係演算子「!=」を使用して、age1とage2を比較した結果を画面に表示してください。

Mondai8_5.java
/**
 * 処理概要:関係演算子処理
 */
public class Mondai8_5 {
	public static void main(String[] args) {
		// int型変数age1,age2の宣言と値の代入
		int age1 = 20;
		int age2 = 25;

		// 比較結果を出力(結果はtrue)
		System.out.println(age1 != age2);

		// age1に値を再代入
		age1 = 25;

		// 比較結果を出力(結果はfalse)
		System.out.println(age1 != age2);
	}
}

関係演算子「!=」を使用して、2つの変数の値を比較しています。
比較した結果は、boolean型のtrueかfalseとなります。

「!=」は、「左辺と右辺は等しくないか」という意味になりますので、最初の比較結果は、trueになります。
そのあと、age1とage2の値を同じにすると、比較結果がfalseになります。

Information

0除算エラー

プログラムの世界では、通常、値を0で割る「0除算」を実行すると、エラーが発生します。
Javaでも、小数型の値の0除算は正常に処理されますが、整数型の値の0除算を行うとエラーが発生しますので、割り算を行うときには気をつける必要があります。

以下のサンプルをコピーして実行してみてください。

public class MyInfinity {

	public static void main(String[] args) {
		int x = 10;
		int y = 0;

		// 0除算
		int z = x / y; // ここでエラーが発生します。

		System.out.println(z); // 実行されません。
	}
}

0除算を行っているところでエラーが発生し、コンソール上にもエラーメッセージが表示され、プログラムが異常終了していることが確認できます。
このままでは、このプログラムは正常に処理されませんので、プログラムの中で何らかの対処が必要になります。
対処方法は、今後の章で学習しますので、まずは、0除算エラーというものがあるということを知っておくようにしましょう。

その他にも、プログラム実行時に発生するエラーが多数存在します。
いわゆる「バグ」と呼ばれるエラーで、プログラムを作成するときにはバグのないプログラムに仕上げる必要があります。

Javaの基本(後編)はこちら

執筆・編集

Tech Fun Magazine編集部
Tech Funの現役のITエンジニアが、システム開発の基礎知識や実践的なノウハウを執筆・編集しています。
Tech Fun ITスクールの研修講師として活躍するメンバーもおり、プログラミング初心者がつまづきやすいポイントを丁寧に解説しています。

ARTICLE
記事一覧

Java基礎

Java12からJava17までに導入された機能の紹介

システム開発の基本

プログラミングとテストの要点

データベース環境構築

データベース環境構築(Windows版) テストデータ作成

データベース環境構築

データベース環境構築(Windows版) MariaDBの設定

データベース環境構築

データベース環境構築(Mac版) テストデータ作成

データベース環境構築

データベース環境構築(Mac版) MariaDBの設定

Java基礎

はじめてのJava

Java基礎

Javaのデバッグ方法

Java基礎

ポリモフィズム

記事一覧を見る