検索

キーワード


【Java】 変数の種類や定数の特徴、定数にまつわる列挙型の解説

  • 公開日:2020-08-26 13:40:11
  • 最終更新日:2021-01-26 09:59:55
【Java】 変数の種類や定数の特徴、定数にまつわる列挙型の解説

こんにちは、駆け出しプログラマーの若江です!

ここでは初学者として学習を終えた私が、アウトプットの意味も込めて変数・定数について紹介させていただきます。

できる限り初学者が理解しやすい内容として紹介させていただくので、参考となれば幸いです!


関連記事リンク:インスタンスの紹介 / アクセス修飾子の紹介 / 命名規約の紹介 / ArrayListの紹介 / for文の紹介 / メソッドの紹介 / static修飾子の紹介 / コンストラクターの紹介 / final修飾子の紹介

変数の種類/定数の特徴と書き方

変数は一時的にデータを保持する入れ物のような役割を持っています。

保持したデータは柔軟に加工することができるため、

計算処理の結果をデータとして保持することや、新たなデータに更新するなどの特徴があります。

また変数が保持しているデータを何度でも見に行くことができ、プログラムの至る所で使われるため、

参照する変数を明確に特定できるように、その変数特有の名前を付けて管理します。


定数は変数と対照的な部分を持っており、保持するデータを一度決めるとそのデータを持ち続けます。

データ内容の変更ができないため、誤って書き換えられてしまうと困るデータや、

データ内容の変化が特に必要ないものに対して定数を使います。


ここでは変数と定数の種類と特徴について紹介させていただきます。


3種類の変数

変数は使われる場所によって有効な範囲が異なるため、

ここでは3種類の変数について紹介させていただきます。


グローバル変数

本来の意味で「グローバル変数」とは、いつでもどこからでも使うことができる変数を指します。

しかし Java では方針上、意図的にグローバル変数が存在しません。

そのためグローバル変数のような扱い方をしたい場合は static修飾子を利用します。

 ※ static修飾子については別記事より紹介させていただきます。

Java でのグローバル変数は「クラス変数」や「static変数」とも呼ばれています。

グローバル変数は、最も有効範囲の広い変数です。


◆グローバル変数例

public static String str = "Grobal";

public = アクセス修飾子、static = static修飾子、String = 型、str = 変数名、"Grobal" = 文字列です。

※アクセス修飾子は別記事にて紹介させていただきます。


インスタンス変数

クラスをインスタンス化した際に、インスタンス内で有効な変数です。

非static (staticでない、グローバルでない)フィールドの変数を指します。

インスタンス変数は「メンバー変数」や「フィールドとも呼ばれています。

 ※フィールドに関しては後ほど詳しく紹介させていただきます。

 ※インスタンスがわからないという方は関連記事リンクのインスタンスの紹介よりご確認ください。


◆ FieldTestクラスのインスタンス変数例

public class FieldTest {

	public String str = "Instance";

}

FieldTest クラスの フィールド str がインスタンス変数です。

メソッドやコンストラクタから直接アクセスが可能となっており、

有効範囲の広さはグローバル変数と次に紹介するローカル変数の間に位置します。


ローカル変数

メソッドやコンストラクタ内、もしくは if文や while文、for文内などのみで有効な変数です。

処理の間のみ有効な変数となり、最も有効範囲の狭い変数となります。


サンプルコードでは有効な範囲をわかりやすくするために、

コンパイルエラーのコードも含ませています。

 

◆ローカル変数例(メソッド)

public class LocalTest {

	// str の有効範囲外でコンパイルエラー
	public String word = str;

	// String型の str は「 { 」~「 } 」内で有効
	public void sample(String str) {
		System.out.println(str);
	}	
}

◆ローカル変数(for文)

public class LocalTest {

	public static void main(String[] arg) {

		// int 型のローカル変数 i は for文内のみで有効
		for(int i = 0; i < 10; ++i) {
			System.out.println(i);
		}

		// i は有効範囲外のためコンパイルエラー
		System.out.println(i);
	}
}


余談

メソッドの引数に final 修飾子を付けると、引数への代入が不可となります。

public class Test {

	// メソッド内の「num = 5」のような代入は不可
	public void num(final int num) {
		num = 5; // コンパイルエラーとなる
	}
}

引数を、受け取ったままのデータとして扱いたい場合は上記のような書き方ができます。



フィールドとは?

クラス自体が持つ情報のことをフィールドと呼びます。

車で例えるなら、車名や製造日、燃料の残量や車検を受けた日など車の「状態」がフィールドにあたります。

ちなみにクラスに存在するメソッドは機能や動作です。

車のフィールドと比較して例えると、走るや止まる、クラクションを鳴らす、シートを倒すなどの「動作」がメソッドです。


・フィールドの基本構文: アクセス修飾子 型 変数名;

基本構文をもとにしたサンプルコードも合わせて確認しましょう。

サンプルコードでは文字列の値を代入しています。


◆フィールド例

public class FieldTest {

	// String型のフィールド
	public String str = "sample";
}

上記は "sample" の文字列を持った FieldTest クラスです。


余談

フィールドはオブジェクトのインスタンス毎に割り当てられた変数のことで、

インスタンスを生成することにより、そのオブジェクト固有の値として利用します。

フィールドへ「static」を付けると、同じクラスに対する全てのインスタンスが

同じ値を共有する staticフィールドとなります。

また staticフィールドはインスタンス生成せずに使うことができます。


◆ staticフィールドの例

【インスタンス生成されるクラス】

public class Test {

	// staticフィールド
	public static int number;
	// static メソッド
	public static void num(int num) {
		number += num; // 受け取った引数を staticフィールドへ加算する
	}
}

【上記をインスタンス生成するクラス】

public class Test2 {

	public static void main(String[] args) {

		// staticフィールドへ 10 加算
		Test test1 = new Test();
		test1.num(10);
		System.out.println(test1.number); // 結果:10 を表示

		// 上記に続けて Testクラスの別インスタンスから staticフィールドへ 20加算
		Test test2 = new Test();
		test2.num(20);
		System.out.println(test2.number); // 結果:30 を表示
		System.out.println(test1.number); // 結果:30 を表示
	}
}


このように test1 と test2 でインスタンスが異なっていても、

同じクラスから生成されたインスタンスのデータはお互いに共有されます。



定数とは?

定数は final修飾子を利用して使われます。

final修飾子は1度値を持つと、それ以降変更が不可となる修飾子です。

また定数はその性質上、初期化が必須となります。

・定数の基本構文: アクセス修飾子 final 型 定数名 = 初期値 ;

 ※基本的に定数名は英字の大文字を使います。詳細は関連記事「命名規約」をご覧ください。


◆定数の例

public class Test {

	public final String WELCOME = "いらっしゃいませ";
}


定数の使用方法は変数と同じです。

インスタンス生成をして上記定数 WELCOME を呼んでみましょう。

◆定数を利用するクラス例

public class Test2 {

	public static void main(String[] arg) {

		Test test = new Test();
		System.out.println(test.WELCOME); // 結果:「いらっしゃいませ」 を表示
	}
}


また定数も static を付けることでグローバルな扱いとなります。

◆ static な定数の例

public class Test {

	public static  final String WELCOME = "いらっしゃいませ";
}

◆ static な定数の呼び出し例

public class Test2 {

	public static void main(String[] arg) {

		System.out.println(Test.WELCOME); // 結果:「いらっしゃいませ」 を表示
	}
}


このようにインスタンスを生成しなくても、「クラス名.定数名」で static な定数を呼び出せます。


列挙型(enum)の書き方

定数を紹介したので定数にまつわる列挙型にも簡単に触れておきたいと思います。

列挙型は複数の定数をクラス内にまとめておくことで可読性の向上が実現できます。

列挙型でまとめる定数を「列挙子」と呼びます。

・列挙型の基本構文: アクセス修飾子 enum クラス名 { 列挙子1, 列挙子2列挙子3 .. }


◆列挙型の例

public enum EnumColors {
	RED,
	GREEN,
	YELLOW
}


列挙型の呼び出し方も定数と同じ方法で呼び出せます。

◆列挙型を呼び出すクラスの例

public class EnumTest {
	public static void main(String[] args) {

		System.out.println(EnumColors.RED); // 結果:RED を表示
	}
}

 ※列挙型の詳しい紹介は別記事でさせていただきます。


型推論の書き方

JavaSE10 以降よりローカル変数で新たに利用可能となった機能が型推論です。

 ※JavaSE10 より前のバージョンではコンパイルエラーとなりますので注意が必要です。

ローカル変数から読み取れる型に対しては「var」を付けることで型宣言を省略することができます。

例えば、「 "HELLO" 」は String型であることが読み取れます。

最初に宣言する型を「var」へ置き換えるのが型推論の書き方です。

・型推論の基本構文: var 変数名 = 値 ;


通常の宣言であれば、

String str = "HELLO";

となりますが、 "HELLO" は文字列のため String だな。と読み取れるため、

var str = "HELLO";

と書き換えることができます。


型推論の役割は、コーディングの負担軽減と可読性向上を目的とされています。

◆ 型推論を使わなかった場合

String name = "あいうえお";
int number = 10;
double d = 1.5;
short s = 5;
char c = 'a';

◆型推論を使った場合

var name = "あいうえお";
var number = 10;
var d = 1.5;
var s = 5;
var c = 'a';

統一性が出て読みやすくなりましたね。


ただし型推論は使えるケースと使えないケースがあります。

先述した通り、型推論はローカル変数として使うことができる機能です。

そのためインスタンス変数では使用できません。

また、当然ですが宣言した構文から推測ができない変数にも型推論は使えません。


型推論が使えないケース❌

◆インスタンス変数❌

// インスタンス変数に利用は不可
public class VarTest {
	var str = "a"; // コンパイルエラーとなる
}

◆変数の型推論が不可能❌

public class VarTest {

	public void sample() {
		var str; // 型推論ができないためコンパイルエラーとなる
	}
}

◆変数の値がnull❌


public class VarTest {

	public void sample() {
		var str = null; // 型推論ができないためコンパイルエラーとなる
	}
}



型推論が使えるケース⭕

◆ローカル変数かつ推論が可能⭕

public class VarTest {

	public void sample() {
		var str = "a"; // String と推論が可能
	}
}

◆コレクションのインスタンス生成から推論⭕

// ArrayList<String> array = new ArrayList<String>(); の型推論
var array = new ArrayList<String>();

◆変数に代入するメソッドの戻り値から推論⭕

public class VarTest {

	// 受け取った値に 1 を足して返すメソッド
	public static int sample(int a) {
		return a + 1;
	}

	public static void main(String[] arg) {
		var a = sample(1); // 「sample(int)」から型の推測が可能
		System.out.println(a); // 結果:2 を表示
	}
}


便利な機能のため、どこかで見かけることがあるかもしれません。

自身でも使ってみて慣れておくと良いかもしれませんね。



まとめ

変数が柔軟にデータを受け取ることで複雑なプログラムへの対応を可能にしています。

また定数はデータを固定することで扱いやすくしています。

プログラム内を巡るデータにとって必須の変数、定数をしっかりと理解しておきましょう。


関連記事リンク

インスタンスの紹介 / アクセス修飾子の紹介 / 命名規約の紹介 / ArrayListの紹介 / for文の紹介 / メソッドの紹介 / static修飾子の紹介 / コンストラクターの紹介 / final修飾子の紹介


【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様