Javaの基本構文を初心者向けに解説【変数・制御構文・クラスまで網羅】

Mirai

Javaの基本構文って覚えること多すぎる。変数とか制御構文とかクラスとか、どこから手をつければいいかわからないよ〜。

Zetto

わかる。でも基本の型さえ押さえればあとはパターンの組み合わせだから、意外とシンプルなんだよ。

この記事では、Javaの基本構文について体系的に解説します。

Zettoのライタープロフィール

本記事の専門性
現役エンジニアのZettoです。Java Goldの資格を保有しており、フリーランスエンジニアとしてインフラ設備・大手商業施設の在庫管理・医療機器販売関連など複数のJava案件を経験しています。

Javaの基本構文を曖昧なまま進めてしまうと、どういうロジックを書けばいいかわからなかったり、エラーが出るたびに詰まったりして学習が止まりがちです。

この記事を読めば、Javaの変数・データ型・制御構文・クラスまで、基本構文の全体像が一通り理解できます。

ぜひ参考にしてみてください。

目次

Javaのコードが動く仕組みをざっくりおさえよう

Javaコード動作の仕組み

Javaのコードを書く前に、プログラムがどのように動くかの流れを頭に入れておきましょう。

  • コンパイルと実行の流れ(javacとjavaコマンド)
  • mainメソッドとエントリーポイントの役割
  • コメントの書き方(1行コメントと複数行コメント)

順番に見ていきましょう。

コンパイルと実行の流れ(javacとjavaコマンド)

Javaは書いたソースコードをそのまま実行するのではなく、一度コンパイルという変換処理を挟みます。

具体的な流れは次の通りです。

  • .javaファイルにソースコードを書く
  • javacコマンドでコンパイルし、.classファイル(バイトコード)を生成する
  • javaコマンドでJVM(Java仮想マシン)がバイトコードを実行する
  • 同じ.classファイルがWindowsでもMacでも動く(「Write Once, Run Anywhere」)
// コンパイル
javac Hello.java

// 実行
java Hello

この仕組みのおかげでJavaはプラットフォームに依存しない言語として広く普及したんですよね。

mainメソッドとエントリーポイントの役割

Javaプログラムは必ずmainメソッドから処理が始まります。

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

mainメソッドの構成要素は次の通りです。

  • public ― どこからでもアクセス可能
  • static ― インスタンスを作らずに呼び出せる
  • void ― 戻り値なし
  • String[] args ― コマンドライン引数を受け取る配列

クラス名とファイル名は一致させる必要があります。

Hello.javaというファイル名なら、クラス名もHelloにするのがルールです。

ここを間違えるとコンパイルエラーになるので注意しましょう。

コメントの書き方(1行コメントと複数行コメント)

コメントはコードに説明を加えるためのもので、プログラムの実行には影響しません。

// これは1行コメントです

/*
  これは
  複数行コメントです
*/

/**
 * これはJavadocコメントです(API仕様書の自動生成に使う)
 * @param args コマンドライン引数
 */
public static void main(String[] args) {
    // 処理内容をここに書く
    System.out.println("コメントのサンプル");
}

実務では、コードを読む人(将来の自分を含む)が理解しやすいように、要所にコメントを入れる習慣をつけておくといいかなと思います。

ここまでで、Javaのコードが動く仕組みの基本がつかめたと思います。

Zetto

コンパイルと実行の流れ、mainメソッドの構造、コメントの書き方、この3つを頭に入れておくと、これ以降のコードがずっと読みやすくなります。

Javaの基本構文① 変数・データ型・演算子

変数・データ型・演算子

変数とデータ型はプログラミングの土台になる部分です。

  • 変数の宣言と初期化のルール
  • 主要なデータ型一覧(int・double・boolean・char)
  • String型の基本と文字列操作メソッド
  • 算術・比較・論理演算子の使い方

順番に見ていきましょう。

変数の宣言と初期化のルール

変数は「データを入れる箱」です。Javaでは変数を使う前に、どんな種類のデータを入れるか(データ型)を宣言する必要があります。

// 宣言のみ
int age;

// 宣言と初期化を同時に行う
int age = 25;

// 宣言後に代入
int score;
score = 100;

変数名のルールは次の通りです。

  • 英字・数字・_$が使える
  • 数字から始めることはできない
  • 大文字と小文字は区別される(ageAgeは別物)
  • 予約語(intclassなど)は使えない

変数名はキャメルケース(例:userNametotalPrice)で書くのがJavaの慣習です。

主要なデータ型一覧(int・double・boolean・char)

Javaの基本データ型(プリミティブ型)の中でよく使うものは次の通りです。

  • int:整数(例:int count = 10;
  • double:小数(例:double price = 3.14;
  • boolean:真偽値(例:boolean flag = true;
  • char:1文字(例:char grade = 'A';
  • long:大きな整数(例:long bigNum = 10000000000L;
int count = 10;
double price = 1980.5;
boolean isLogin = false;
char initial = 'T';

charはシングルクォート、後述するStringはダブルクォートで囲む点に注意しましょう。

String型の基本と文字列操作メソッド

Stringは厳密にはプリミティブ型ではなくクラスですが、最もよく使う型の一つです。

Oracle Java SE 公式ドキュメントにはStringクラスの全メソッドが記載されているので、詳細はそちらを参照してください。

String name = "Taro";

// 文字列の長さを取得
int len = name.length(); // 4

// 大文字・小文字変換
String upper = name.toUpperCase(); // "TARO"
String lower = name.toLowerCase(); // "taro"

// 文字列の連結
String message = "こんにちは、" + name + "さん";

// 特定の文字列を含むか調べる
boolean contains = name.contains("ar"); // true

// 部分文字列の取得
String sub = name.substring(1, 3); // "ar"

// 文字列の比較(==ではなくequalsを使う)
boolean isSame = name.equals("Taro"); // true

文字列の比較には==ではなくequals()メソッドを使うのが鉄則です。

==は参照先のアドレスを比較するため、内容が同じでもfalseになるケースがあります。これは初心者がハマりやすいポイントです。

算術・比較・論理演算子の使い方

演算子の種類と使い方は次の通りです。

// 算術演算子
int a = 10;
int b = 3;
System.out.println(a + b);  // 13(加算)
System.out.println(a - b);  // 7(減算)
System.out.println(a * b);  // 30(乗算)
System.out.println(a / b);  // 3(整数除算)
System.out.println(a % b);  // 1(剰余)

// 比較演算子(結果はboolean)
System.out.println(a > b);  // true
System.out.println(a == b); // false
System.out.println(a != b); // true

// 論理演算子
boolean x = true;
boolean y = false;
System.out.println(x && y); // false(かつ)
System.out.println(x || y); // true(または)
System.out.println(!x);     // false(否定)

int同士の割り算は小数点以下が切り捨てられます。

10 / 33になるので、小数が必要な場合はdoubleを使いましょう。

ここまでで変数・データ型・演算子の基本が押さえられました。

Mirai

Stringのequalsとか、intの割り算の挙動とか、知らないとハマりそうだね。

Zetto

そうそう、この辺は最初に知っておくと後でデバッグに悩まなくて済むから、しっかり頭に入れておくといいよ。

Javaの基本構文② 制御構文・配列・メソッド・クラス

制御構文・配列・メソッド・クラス

プログラムの流れを制御し、処理をまとめる仕組みを学びましょう。

  • 条件分岐(if文・switch文)の書き方
  • 繰り返し処理(for文・while文)の使い分け
  • 配列の宣言・初期化とループ処理
  • メソッドの定義・引数・戻り値の基本
  • クラスの基本構造とインスタンス化

順番に見ていきましょう。

条件分岐(if文・switch文)の書き方

条件によって処理を分けたいときはif文やswitch文を使います。

// if文の基本
int score = 75;

if (score >= 80) {
    System.out.println("合格:優");
} else if (score >= 60) {
    System.out.println("合格:良");
} else {
    System.out.println("不合格");
}

// switch文の基本
String day = "Monday";

switch (day) {
    case "Monday":
        System.out.println("月曜日");
        break;
    case "Tuesday":
        System.out.println("火曜日");
        break;
    default:
        System.out.println("その他の曜日");
        break;
}

switch文ではbreakを忘れると次のcaseにも処理が流れてしまう(フォールスルー)ので注意しましょう。

特定の値で処理を分けるシンプルな分岐ならswitch、複雑な条件ならifという使い分けが基本です。

繰り返し処理(for文・while文)の使い分け

同じ処理を繰り返すときはループ構文を使います。

// for文(繰り返し回数が決まっているとき)
for (int i = 0; i < 5; i++) {
    System.out.println("カウント: " + i);
}

// 拡張for文(配列やコレクションの全要素を処理するとき)
int[] numbers = {10, 20, 30, 40, 50};
for (int num : numbers) {
    System.out.println(num);
}

// while文(条件が真の間、繰り返す)
int count = 0;
while (count < 3) {
    System.out.println("whileループ: " + count);
    count++;
}

// do-while文(最低1回は必ず実行したいとき)
int n = 0;
do {
    System.out.println("do-while: " + n);
    n++;
} while (n < 3);

繰り返し回数が事前にわかっている場合はfor文、条件が真の間繰り返す場合はwhile文が自然な選択です。

配列の宣言・初期化とループ処理

配列は同じ型のデータを複数まとめて管理できるデータ構造です。

// 配列の宣言と初期化(サイズ指定)
int[] scores = new int[5];
scores[0] = 80;
scores[1] = 90;

// 宣言と同時に値を設定
int[] points = {100, 85, 70, 95, 60};

// 配列の長さを取得
System.out.println(points.length); // 5

// for文で配列を処理
for (int i = 0; i < points.length; i++) {
    System.out.println("index " + i + ": " + points[i]);
}

// 拡張for文で配列を処理
for (int p : points) {
    System.out.println(p);
}

配列のインデックスは0から始まります。

5要素の配列なら[0][4]でアクセスでき、[5]にアクセスするとArrayIndexOutOfBoundsExceptionが発生するので注意が必要です。

メソッドの定義・引数・戻り値の基本

メソッドは処理のまとまりに名前をつけて再利用できる仕組みです。

public class Calculator {

    // 引数あり・戻り値ありのメソッド
    public static int add(int a, int b) {
        return a + b;
    }

    // 引数なし・戻り値なしのメソッド(void)
    public static void greet() {
        System.out.println("こんにちは!");
    }

    // 引数ありで文字列を返すメソッド
    public static String buildMessage(String name) {
        return "ようこそ、" + name + "さん!";
    }

    public static void main(String[] args) {
        int result = add(3, 5);
        System.out.println(result); // 8

        greet();

        String msg = buildMessage("Taro");
        System.out.println(msg); // ようこそ、Taroさん!
    }
}

メソッドを使うメリットは次の通りです。

  • 同じ処理を何度も書かずに済む
  • 修正が1箇所で済むのでバグを減らせる
  • コードが読みやすくなる
  • テストがしやすくなる

クラスの基本構造とインスタンス化

Javaはオブジェクト指向言語なので、クラスという設計図を元にインスタンス(実体)を作って使います。

Oracle Java OOP Conceptsでオブジェクト指向の概念が詳しく解説されています。

// Personクラスの定義
public class Person {

    // フィールド(属性)
    String name;
    int age;

    // コンストラクタ(インスタンス生成時に呼ばれる)
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // メソッド(振る舞い)
    public void introduce() {
        System.out.println("名前: " + name + "、年齢: " + age);
    }
}

// Mainクラスでインスタンス化
public class Main {
    public static void main(String[] args) {
        // newキーワードでインスタンスを生成
        Person person1 = new Person("Taro", 25);
        Person person2 = new Person("Hanako", 30);

        person1.introduce(); // 名前: Taro、年齢: 25
        person2.introduce(); // 名前: Hanako、年齢: 30
    }
}

クラスは「設計図」でインスタンスは「その設計図から作った実体」です。

Personクラスという設計図からperson1person2という2つの実体を作り、それぞれが独立してデータを持てる点がオブジェクト指向の強みです。

ここまでで制御構文からクラスまでの基本的な構文が一通り押さえられたと思います。

Zetto

クラスとインスタンスの概念は最初は抽象的に感じるかもしれませんが、実際にコードを書いて動かすうちに自然と体に馴染んでいきます。焦らずじっくり慣れていきましょう。

実務で差がつく重要ポイント

実務の重要ポイント

基本構文を覚えたら、現場で実際に使われるパターンと、初心者がつまずきやすいエラーも把握しておきましょう。

  • 現場でよく使うJavaコードパターン5選
  • 初心者がつまずくエラーと対処法(NullPointerExceptionなど)

順番に見ていきましょう。

現場でよく使うJavaコードパターン5選

実務でよく見かけるJavaのコードパターンは次の通りです。

// パターン1:ArrayListの使用(可変長の配列代わり)
import java.util.ArrayList;
ArrayList list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("JavaScript");
for (String lang : list) {
    System.out.println(lang);
}

// パターン2:HashMapの使用(キーと値のペアで管理)
import java.util.HashMap;
HashMap map = new HashMap<>();
map.put("apple", 100);
map.put("banana", 80);
System.out.println(map.get("apple")); // 100

// パターン3:try-catchによる例外処理
try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("エラー発生: " + e.getMessage());
} finally {
    System.out.println("処理終了");
}

// パターン4:Stringのフォーマット
String name = "Taro";
int age = 25;
String msg = String.format("名前: %s、年齢: %d", name, age);
System.out.println(msg);

// パターン5:static定数の定義
public static final double TAX_RATE = 0.10;
double price = 1000;
double tax = price * TAX_RATE;

1社目の研修でJavaを2ヶ月で学んだ後、すぐに実務に入ったのですが、こうしたパターンに早く慣れておくべきだったと今でも感じます。

研修で構文は覚えても、実務のコードで頻出するパターンを知っているかどうかで現場への馴染み方がかなり変わります。

初心者がつまずくエラーと対処法(NullPointerExceptionなど)

初心者が遭遇しやすいエラーと対処法は次の通りです。

  • NullPointerExceptionnullのオブジェクトに対してメソッドを呼び出したときに発生。変数がnullでないかをif文でチェックする習慣をつける
  • ArrayIndexOutOfBoundsException ― 配列の範囲外にアクセスしたときに発生。array.lengthを使って範囲を確認する
  • ClassCastException ― 型変換に失敗したときに発生。instanceofで型を確認してからキャストする
  • StackOverflowError ― 再帰処理が終了条件なしに繰り返されたときに発生。再帰の終了条件(ベースケース)を確認する
  • NumberFormatException ― 数字に変換できない文字列をInteger.parseInt()などに渡したときに発生。入力値の検証を行う

エラーメッセージはJavaが「どこで何が起きたか」を教えてくれる情報です。

最初は英語のメッセージに怖気づくかもしれませんが、エラー名でそのまま検索すると解決策が見つかることがほとんどです。

ここまでで実務で意識したいポイントが整理できました。

Mirai

NullPointerExceptionって本当によく見るよね。なんでnullチェックがそんなに大事なの?

Zetto

nullのまま処理しようとするとプログラムが止まるから、「値があるかどうか」を確認してから使うのが安全なコードを書く基本なんだよ。

Java基本構文の演習問題

Java基本構文演習問題

理解を深めるために、演習問題を3つ用意しました。

  • 演習問題1:変数とデータ型を使った計算プログラム
  • 演習問題2:条件分岐と繰り返しを組み合わせた処理
  • 演習問題3:クラスとメソッドを使ったオブジェクト操作

実際に手を動かしながら確認していきましょう。

演習問題1:変数とデータ型を使った計算プログラム

問題

税率10%を考慮した税込価格を計算して表示するプログラムを書いてください。条件は以下の通りです。

  • int型で商品価格を定義する(例:1500円)
  • double型の定数として税率を定義する
  • 税込価格を計算して、String.formatで整形して出力する

解答例

public class TaxCalculator {
    public static void main(String[] args) {
        int price = 1500;
        final double TAX_RATE = 0.10;

        double taxIncluded = price * (1 + TAX_RATE);

        String result = String.format("商品価格: %d円、税込価格: %.0f円", price, taxIncluded);
        System.out.println(result);
        // 出力例:商品価格: 1500円、税込価格: 1650円
    }
}

解説

finalキーワードで変数を定数として宣言すると、後から値を変更できなくなります。

税率のように変わらない値を管理するのに役立ちます。String.format%dは整数、%.0fは小数点以下0桁の浮動小数点数を意味します。

演習問題2:条件分岐と繰り返しを組み合わせた処理

問題

1から20までの整数を出力し、3の倍数のときは数字の代わりに「Fizz」と表示するプログラムを書いてください。

解答例

public class FizzBuzz {
    public static void main(String[] args) {
        for (int i = 1; i <= 20; i++) {
            if (i % 3 == 0) {
                System.out.println("Fizz");
            } else {
                System.out.println(i);
            }
        }
    }
}

解説

i % 3 == 0は「iを3で割った余りが0かどうか」という判定です。

余り(%)演算子が倍数の判定に使えることを体感できます。この問題を応用して「5の倍数はBuzz」「15の倍数はFizzBuzz」と拡張してみると、条件分岐の理解がさらに深まります。

演習問題3:クラスとメソッドを使ったオブジェクト操作

問題

商品を表すProductクラスを作り、名前と価格を持つインスタンスを2つ生成して、それぞれの情報を表示するプログラムを書いてください。

getTaxIncludedPrice()メソッドで税込価格(10%)も返せるようにしてください。

解答例

public class Product {
    String name;
    int price;

    // コンストラクタ
    public Product(String name, int price) {
        this.name = name;
        this.price = price;
    }

    // 商品情報を表示するメソッド
    public void display() {
        System.out.println("商品名: " + name + "、価格: " + price + "円");
    }

    // 税込価格を返すメソッド
    public double getTaxIncludedPrice() {
        return price * 1.10;
    }
}

public class Main {
    public static void main(String[] args) {
        Product p1 = new Product("りんご", 200);
        Product p2 = new Product("バナナ", 150);

        p1.display();
        System.out.println("税込: " + p1.getTaxIncludedPrice() + "円");

        p2.display();
        System.out.println("税込: " + p2.getTaxIncludedPrice() + "円");
    }
}

解説

this.name = namethisは「このインスタンス自身」を指します。

コンストラクタの引数名とフィールド名が同じとき、thisをつけることでフィールドを指定します。

クラスにメソッドを持たせることで「商品に関する処理はProductクラスが責任を持つ」という設計になります。これがオブジェクト指向の考え方の出発点です。

ここまでの3問を自分でコーディングして動かせたなら、Javaの基本構文はしっかり身についてきている証拠です。

Zetto

演習問題はただ答えを写すのではなく、自分で考えて書いて、エラーが出たら調べるというサイクルが大切です。エラーと格闘した時間がそのまま実力になっていきますよ。

Java基本構文をマスターして次のステップへ進もう

次のステップへ進む

この記事では、Javaの基本構文として次の内容を解説しました。

  • コンパイルと実行の仕組み・mainメソッドの役割
  • 変数・データ型・演算子の基礎
  • 制御構文(if・switch・for・while)の使い方
  • 配列・メソッド・クラスの基本
  • 実務でよく使うコードパターンと頻出エラーへの対処
  • 演習問題3問

Javaは覚えることが多く見えますが、実際には決まった構造の組み合わせです。

僕自身、1社目でJavaを学び始めた頃は「自分はプログラミングの才能がないのかな…」と感じた時期がありましたが、基本構文のパターンが体に馴染んでからは、読めるコードの幅が一気に広がりました。

次のステップとしては、継承・インターフェース・ポリモーフィズムなどオブジェクト指向の深い部分に進むといいかなと思います。

Javaの基本構文をしっかり固めることが、現場で活躍するエンジニアへの着実な一歩になります。

ぜひ演習問題を繰り返しながら、体に染み込ませていきましょう。

Mirai

基本構文の全体像がつかめてきた!

Zetto

基本構文が固まったら、次はオブジェクト指向(継承・インターフェース)に進むとJavaの理解がぐっと深まりますよ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次