変数と型
1. 変数の基本
変数はデータを格納するためのメモリ上の場所です。Javaでは、変数を使用する前に宣言する必要があります。
変数の宣言と初期化
// 変数の宣言
データ型 変数名;
// 例
int age;
String name;
// 宣言と同時に初期化
int score = 85;
String message = "こんにちは";
命名規則
- 変数名は英字、数字、アンダースコア(_)、ドル記号($)を使用できます
- 数字で始めることはできません
- 予約語(if, for, classなど)は使用できません
- 慣習として、変数名はキャメルケース(最初の単語は小文字、以降の単語の先頭は大文字)を使用します
// 良い変数名の例
int studentAge;
String firstName;
double totalAmount;
// 避けるべき変数名の例
int 1number; // 数字で始まっている
String class; // 予約語を使用している
double total_amount; // Javaではアンダースコアよりキャメルケースが一般的
2. プリミティブ型
Javaには8つのプリミティブ型があります。これらは単純な値を直接格納します。
整数型
型 | サイズ | 範囲 | デフォルト値 |
---|---|---|---|
byte | 8ビット | -128 〜 127 | 0 |
short | 16ビット | -32,768 〜 32,767 | 0 |
int | 32ビット | -2,147,483,648 〜 2,147,483,647 | 0 |
long | 64ビット | -9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807 | 0L |
// 整数型の例
byte smallNumber = 100;
short mediumNumber = 10000;
int largeNumber = 1000000;
long veryLargeNumber = 9223372036854775807L; // longリテラルには末尾にLをつける
浮動小数点型
型 | サイズ | 精度 | デフォルト値 |
---|---|---|---|
float | 32ビット | 約6〜7桁の精度 | 0.0f |
double | 64ビット | 約15桁の精度 | 0.0d |
// 浮動小数点型の例
float price = 19.99f; // floatリテラルには末尾にfをつける
double pi = 3.14159265359;
文字型
型 | サイズ | 説明 | デフォルト値 |
---|---|---|---|
char | 16ビット | Unicode文字(0〜65,535) | '\u0000' |
// 文字型の例
char grade = 'A';
char japaneseChar = '漢';
char unicodeChar = '\u3042'; // 'あ'のUnicode
論理型
型 | サイズ | 値 | デフォルト値 |
---|---|---|---|
boolean | 1ビット | true または false | false |
// 論理型の例
boolean isActive = true;
boolean hasPermission = false;
3. 参照型
参照型はオブジェクトへの参照(メモリアドレス)を格納します。主な参照型には、クラス、インターフェース、配列があります。
String(文字列)
Stringは最も一般的に使用される参照型の一つです。
// 文字列の例
String greeting = "こんにちは";
String name = "田中";
String message = greeting + ", " + name + "さん!"; // 文字列の連結
System.out.println(message); // 出力: こんにちは, 田中さん!
配列
配列は同じ型の複数の値を格納するためのコンテナです。
// 配列の宣言と初期化
int[] numbers = new int[5]; // 5つの整数を格納できる配列
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40;
numbers[4] = 50;
// 初期化子を使用した宣言
String[] fruits = {"りんご", "バナナ", "オレンジ"};
// 配列の要素へのアクセス
System.out.println(fruits[1]); // 出力: バナナ
// 配列の長さ
System.out.println(fruits.length); // 出力: 3
クラスとオブジェクト
クラスはオブジェクトの設計図であり、オブジェクトはクラスのインスタンスです。
// クラスのインスタンス化
Scanner scanner = new Scanner(System.in);
Date today = new Date();
ArrayList names = new ArrayList<>();
null値
参照型変数は、どのオブジェクトも参照していないことを示すnull値を持つことができます。
String text = null; // textはどの文字列オブジェクトも参照していない
// nullチェック
if (text != null) {
System.out.println(text.length());
} else {
System.out.println("textはnullです");
}
4. 型変換
Javaでは、ある型の値を別の型に変換することができます。
自動型変換(暗黙的型変換)
小さい型から大きい型への変換は自動的に行われます。
// 自動型変換の例
byte b = 100;
int i = b; // byteからintへの自動変換
int j = 200;
long l = j; // intからlongへの自動変換
long m = 300;
float f = m; // longからfloatへの自動変換
// 変換の順序: byte → short → int → long → float → double
明示的型変換(キャスト)
大きい型から小さい型への変換は明示的に行う必要があります。データの損失が発生する可能性があります。
// 明示的型変換の例
double d = 100.5;
int n = (int) d; // doubleからintへの明示的変換(小数部分は切り捨て)
System.out.println(n); // 出力: 100
int large = 1000;
byte small = (byte) large; // intからbyteへの明示的変換(データ損失の可能性)
System.out.println(small); // 出力: -24(オーバーフローが発生)
文字列と数値の変換
文字列と数値型の間の変換には、特別なメソッドを使用します。
// 文字列から数値への変換
String numStr = "123";
int num = Integer.parseInt(numStr);
double dNum = Double.parseDouble("45.67");
// 数値から文字列への変換
String str1 = Integer.toString(456);
String str2 = String.valueOf(789);
String str3 = "" + 101112; // 文字列連結を使用した変換
5. 定数
定数は値が変更できない変数です。Javaではfinal修飾子を使用して定数を宣言します。
// 定数の宣言
final double PI = 3.14159;
final int MAX_USERS = 1000;
final String APP_NAME = "はとはとアプリ";
// 定数は再代入できない
// PI = 3.14; // コンパイルエラー
// 定数の命名規則は通常、大文字とアンダースコアを使用
final int CONNECTION_TIMEOUT = 30000;
6. 変数のスコープ
変数のスコープは、その変数がアクセス可能なコードの範囲を定義します。
クラスレベル変数(フィールド)
クラス内で宣言され、メソッドの外にある変数。クラス全体からアクセス可能です。
public class ScopeExample {
// クラスレベル変数(フィールド)
private int classVar = 10;
private static int staticVar = 20;
public void method1() {
System.out.println(classVar); // クラス変数にアクセス可能
classVar = 15; // 変更可能
}
public void method2() {
System.out.println(classVar); // method1で変更された値(15)が表示される
}
}
ローカル変数
メソッド内で宣言された変数。そのメソッド内でのみアクセス可能です。
public void calculateArea() {
// ローカル変数
int width = 5;
int height = 10;
int area = width * height;
System.out.println("面積: " + area);
} // ここでwidth, height, areaのスコープは終了
public void anotherMethod() {
// System.out.println(width); // エラー: widthはこのスコープでは見えない
}
ブロックスコープ
中括弧{}で囲まれたブロック内で宣言された変数。そのブロック内でのみアクセス可能です。
public void blockScopeExample() {
// メソッドレベルのローカル変数
int a = 1;
{
// ブロックスコープの変数
int b = 2;
System.out.println(a); // aにアクセス可能
System.out.println(b); // bにアクセス可能
}
System.out.println(a); // aにアクセス可能
// System.out.println(b); // エラー: bはこのスコープでは見えない
for (int i = 0; i < 3; i++) {
// forループのスコープ内の変数
int c = i * 2;
System.out.println(c);
}
// System.out.println(i); // エラー: iはループの外では見えない
// System.out.println(c); // エラー: cはループの外では見えない
}
7. 練習問題
問題1: 変数の宣言と初期化
以下の情報を格納するための適切な型の変数を宣言し、初期化してください。
- あなたの年齢
- あなたの身長(メートル単位)
- あなたの名前
- あなたが学生かどうか
問題2: 型変換
以下のコードを完成させて、文字列として入力された2つの数値を整数に変換し、その和を計算して表示するプログラムを作成してください。
問題3: 配列の操作
5つの整数を格納する配列を作成し、その合計と平均を計算して表示するプログラムを作成してください。