読み込み中...

Javaとスーパークラスの完全ガイド!初心者向け8つのステップで理解しよう

初心者向けJavaとスーパークラスの徹底解説記事のサムネイル Java
この記事は約26分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

結論から言うと、Javaでスーパークラスを使う目的は、共通するフィールドやメソッドを親側へ集め、サブクラス側では差分だけを表すことです。その考え方を押さえると、初心者向けのプログラミング学習でも、extendssuper@Overrideprotectedの使い方が整理しやすくなります。

そのため、スーパークラスは「共通化すればよいもの」を何でも詰め込む場所ではなく、サブクラスに自然に受け継がせたい振る舞いを置く設計上の土台として扱います。Javaの継承は単一継承なので、サンプルコードを読むときも、親子関係が本当に必要かという注意点まで合わせて確認すると理解が深まりますし、ここがポイントです。

動作確認環境
  • Java 21 LTS / javac 21
  • Oracle Java SE Documentation / JShell 21相当の文法
📖 この記事で学べること
  • Javaにおけるスーパークラスとサブクラスの関係
  • extendssuper@Overrideの使い方
  • 初心者向けのサンプルコードを通した継承の読み方
  • カスタマイズ時に起きやすい注意点と対処法
  • 保守しやすいプログラミング設計へつなげる考え方

Javaとは

Javaは、Oracleが管理する汎用プログラミング言語で、クラスを中心にプログラムを組み立てるオブジェクト指向の考え方を採用しています。公式情報はOracle Java Documentationで確認でき、言語仕様はJava Language Specificationに整理されています。

一般に、Javaのコードは.javaファイルへ書き、javacでコンパイルして.classに変換し、javaコマンドで実行するのが基本です。この流れではpublic classmainString[] argsSystem.out.printlnなどの定型がよく登場するため、初心者向けの学習でも早い段階で目にします。

その特徴は、同じ概念を複数のアプリケーションへ転用しやすい点にあります。たとえばユーザー、商品、車両、動物のような対象をclassで表し、値はfield、処理はmethodとして分けると、プログラミング上の責務が読み取りやすくなるのが目安です。

基本概念

Javaの基本概念は、classを設計図、objectを設計図から作られた実体として分けると理解しやすくなります。その関係を前提に、newでインスタンスを作り、constructorで初期値を渡し、methodで処理を呼び出します。

これらの概念がつながると、スーパークラスの使い方も自然に見えてきますが、これは押さえたい点です。共通する処理を親クラスに置き、違いだけを子クラスで表せば、同じ処理を何度も書かずに済むためです。

概念主な記法役割注意点
クラスclassデータと処理のまとまりを定義します責務を広げすぎないようにします
オブジェクトnewクラスから作る実体です生成時の初期値を確認します
フィールドString name状態を保持しますprivateprotectedを選びます
メソッドvoid greet()振る舞いを表します引数と戻り値をそろえます
継承extends親クラスの要素を受け継ぎますJavaでは単一継承です
オーバーライド@Override親の処理を子で置き換えますシグネチャの一致を確認します
親の参照superスーパークラス側へアクセスしますコンストラクタでは先頭で呼びます
アクセス修飾子public/protected/private参照できる範囲を決めます公開範囲を広げすぎないようにします

この表の中で特に押さえたいのは、extends@Overrideの組み合わせです。スーパークラスから共通処理を受け継ぎ、サブクラスで必要な部分だけ変える流れが、Javaの継承を読む入口になります。

スーパークラスとは

スーパークラスとは、他のクラスに継承される親クラスを指します。たとえばAnimalを親にしてDogCatを作ると、名前を持つ、挨拶する、といった共通の振る舞いを親側に集められますし、これが一つの目安です。

その一方で、犬が吠える、猫が鳴くといった個別の処理はサブクラス側に置きます。この分け方により、スーパークラスは共通部分、サブクラスは差分という役割を持つ構造になります。

ただし、共通処理があるからといって、必ず継承を選ぶ必要はありません。Javaのプログラミングでは、親子関係が自然に説明できる場合は継承、部品として組み合わせたい場合は委譲やインターフェースを検討すると扱いやすくなるのがポイントです。

関連する基礎として、コレクション型の理解を深めるならJava List型完全ガイドも役立ちます。List型の使い方を押さえると、継承したオブジェクトをまとめて扱う場面が読みやすくなります。

Javaでのスーパークラスの使い方

Javaでスーパークラスを使うときは、親クラスを作り、子クラスの宣言でextendsを付けますが、覚えておくと役立つでしょう。その子クラスから親のコンストラクタを呼ぶ場合はsuper(...)を使い、親のメソッドを置き換える場合は@Overrideを付けるのが一般的です。

この使い方では、アクセス修飾子の選び方がコードの読みやすさに直結します。外部から呼ばせたい処理はpublic、サブクラスからだけ使わせたい値はprotected、外部にも子にも直接触らせたくない値はprivateにします。

基本的な作成方法

スーパークラスの作成方法は、通常のクラス定義と大きく変わりません。違いは、あとからサブクラスに引き継がれる前提で、フィールド、コンストラクタ、メソッドの公開範囲を慎重に決める点にあるのが一般的です。

具体的には、共通の状態をnameのようなフィールドに持たせ、共通の処理をgreet()のようなメソッドとして定義します。そのうえで、サブクラスではsuper(name)によって親の初期化処理を呼び出します。

サンプルコード1:基本形

このサンプルコードでは、Animalをスーパークラスとして定義するのが現実的です。protected String nameを使うことで、サブクラスから名前を参照できる形にしています。

public class Animal {
    // 属性: 名前
    protected String name;

    // コンストラクタ
    public Animal(String name) {
        this.name = name;
    }

    // メソッド: 挨拶
    public void greet() {
        System.out.println(name + "が挨拶をします");
    }
}

結果: このコードはAnimal.javaとして保存できるスーパークラスの定義です。単体ではmainを持たないため、期待される出力はまだありません。

そのAnimalを継承するには、子クラス側でextends Animalを書きます。親のコンストラクタに名前を渡す処理はsuper(name)で表し、独自のbark()も追加できます。

public class Dog extends Animal {
    // コンストラクタ
    public Dog(String name) {
        super(name);
    }

    // メソッド: 吠える
    public void bark() {
        System.out.println(name + "が吠えます");
    }

    // メソッド: 挨拶 (オーバーライド)
    @Override
    public void greet() {
        System.out.println(name + "がワンワンと挨拶をします");
    }
}

結果: このコードはDog.javaとして保存できるサブクラスの定義です。greet()は親の処理を置き換え、bark()は犬専用の処理として追加されます。

このとき、@Overrideは単なる目印ではありません。メソッド名、引数、戻り値の互換性が崩れている場合にコンパイル時点で検出しやすくなるため、初心者向けの対処法としても有効です。

public class Main {
    public static void main(String[] args) {
        Animal genericAnimal = new Animal("動物");
        genericAnimal.greet();

        Dog shiro = new Dog("シロ");
        shiro.greet();
        shiro.bark();
    }
}

結果: Animal.javaDog.javaMain.javaを同じディレクトリでコンパイルした場合、期待される出力は次のコードブロックの内容です。

動物が挨拶をします
シロがワンワンと挨拶をします
シロが吠えます

結果: 期待される出力として、親クラスのgreet()と子クラスでオーバーライドされたgreet()の違いが確認できます。

サンプルコード2:初心者向け実用例

初心者向けの実用例として、商品を表すクラスをスーパークラスにします。商品名と価格は多くの商品に共通するため、商品クラスへまとめると、サブクラス側のサンプルコードが短くなると整理できます。

public class 商品 {
    private String 商品名;
    private int 価格;

    public 商品(String 商品名, int 価格) {
        this.商品名 = 商品名;
        this.価格 = 価格;
    }

    public String get商品名() {
        return 商品名;
    }

    public int get価格() {
        return 価格;
    }
}

結果: このコードは商品.javaとして保存できる親クラスです。privateな値は直接参照せず、get商品名()get価格()から取得する設計になります。

その商品をさらに具体化した電子機器では、保証期間だけを追加します。共通部分を親へ置いているため、価格や商品名を扱う処理を子クラスで書き直す必要がありません。

public class 電子機器 extends 商品 {
    private int 保証期間; // 保証期間は月単位で表現

    public 電子機器(String 商品名, int 価格, int 保証期間) {
        super(商品名, 価格);
        this.保証期間 = 保証期間;
    }

    public int get保証期間() {
        return 保証期間;
    }
}

結果: このコードは電子機器.javaとして保存できるサブクラスです。super(商品名, 価格)により、スーパークラス側の初期化処理が呼ばれます。

これらを使う側では、通常のオブジェクト生成と同じようにnewを使います。商品電子機器は別の型ですが、共通する取得メソッドを同じ感覚で呼び出せますし、ここを基本と考えるとよいでしょう。

public class メイン {
    public static void main(String[] args) {
        商品 item1 = new 商品("エアコン", 70000);
        電子機器 item2 = new 電子機器("洗濯機", 50000, 24);

        System.out.println("商品名: " + item1.get商品名() + ", 価格: " + item1.get価格() + "円");
        System.out.println("商品名: " + item2.get商品名() + ", 価格: " + item2.get価格() + "円, 保証期間: " + item2.get保証期間() + "ヶ月");
    }
}

結果: 商品.java電子機器.javaメイン.javaを同じ場所で扱う場合、期待される出力は次の内容です。

商品名: エアコン, 価格: 70000円
商品名: 洗濯機, 価格: 50000円, 保証期間: 24ヶ月

結果: 期待される出力として、スーパークラスの値とサブクラスで追加した値が同時に表示されます。

この実用例では、カスタマイズの余地を残しながら、共通処理の重複を避けています。初心者向けのプログラミング学習では、日本語クラス名より英語名のほうが教材や公式情報と照合しやすい場合もありますが、構造の理解にはこのサンプルコードでも十分です。

💡 Tips: Javaの識別子にはUnicode文字を使えますが、チーム開発や検索性を考えると、ProductElectronicDeviceのような英語名が選ばれることも多くあると理解できます。

スーパークラスの応用例

スーパークラスの応用では、親型の変数に子クラスのインスタンスを代入するポリモーフィズムがよく使われます。これにより、呼び出し側はVehicleAnimalのような抽象度の高い型だけを見て、実際の振る舞いは子クラス側へ任せられます。

その考え方は、Javaのオーバーライドと相性がよいです。たとえばrun()speak()という同じ名前のメソッドでも、実体がCarなのかDogなのかによって期待される出力が変わりますし、ここがポイントです。

応用テクニック

応用テクニックとして特に押さえたいのは、変数の型と実体の型を分けて考えることです。Vehicle myVehicle = new Car();のように書くと、参照型はVehicleでも、実際に動くrun()Car側の実装になります。

一方、親型の変数から呼べるのは、親型に定義されたメソッドに限られます。子クラス固有のメソッドを呼びたい場合は、設計を見直すか、必要な場面で型判定やキャストを検討すると覚えるとよいでしょう。

同様に、アノテーションの理解を進めるならJavaアノテーションの解説も関連します。@Overrideの意味を把握すると、オーバーライドの注意点を機械的に確認しやすくなります。

サンプルコード3:応用例1

このサンプルコードでは、車両を表すVehicleをスーパークラスにし、Carで走り方を変えていると考えられます。親型の変数に子のインスタンスを入れる点が、ポリモーフィズムの見どころです。

class Vehicle {
    void run() {
        System.out.println("車両が走行します");
    }
}

class Car extends Vehicle {
    @Override
    void run() {
        System.out.println("車が高速で走行します");
    }
}

public class Main {
    public static void main(String[] args) {
        Vehicle myVehicle = new Car();
        myVehicle.run();
    }
}

結果: 期待される出力は「車が高速で走行します」です。参照型はVehicleですが、実体がCarなので、子クラス側のrun()が選ばれます。

この仕組みを使うと、呼び出し側のコードを大きく変えずに処理を差し替えられます。ただし、継承関係が不自然な場合は、無理にスーパークラスへ寄せず、interfaceや委譲も候補に入りますが、これは押さえたい点です。

サンプルコード4:応用例2

動物の鳴き声も、スーパークラスとサブクラスの関係を説明しやすい題材です。Animalspeak()を置き、Dogで犬らしい出力へ変えます。

class Animal {
    void speak() {
        System.out.println("動物が音を出します");
    }
}

class Dog extends Animal {
    @Override
    void speak() {
        System.out.println("犬が吠えます");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Dog();
        myAnimal.speak();
    }
}

結果: 期待される出力は「犬が吠えます」です。Animal myAnimalという親型の参照でも、実体がDogならDog側のspeak()が呼ばれます。

これにより、複数のサブクラスを同じ親型として扱う設計ができます。たとえばList<Animal>に犬や猫を入れて順にspeak()を呼ぶ形は、Javaのプログラミングでよく見る応用です。

スーパークラスの注意点

スーパークラスの注意点は、継承がコードを短くする一方で、親子関係を強く固定してしまう点にあると言えるでしょう。サブクラスが増えるほど親クラスの変更影響も広がるため、共通化の範囲を狭く保つ設計が扱いやすくなります。

初心者がつまずきやすいのは、オーバーライドしたつもりで別メソッドを作ってしまうケースです。引数が違うとoverloadになり、親のメソッドは置き換わらないため、@Overrideで検出できる形にしておくと対処法が明確になります。

⚠️ 注意: Javaではクラスの多重継承はできません。複数の型として扱いたい場合は、interfaceや合成を使う設計も検討するのが基本です。

一般的な問題点

一般的な問題点は、不適切なメソッドのオーバーライド、深すぎる継承階層、スーパークラスへの責務の集めすぎです。これらはすべて、コードを読んだときに「どのクラスが何を担当するのか」を見えにくくします。

そのため、親クラスには安定した共通処理だけを置き、変わりやすい処理はサブクラスや別クラスへ逃がす考え方が現実的です。finalabstractinterfaceなどを使い分けると、変更できる範囲も表現しやすくなります。

不適切なメソッドのオーバーライド

不適切なオーバーライドでは、親と同じつもりのメソッドが、実際には異なる引数を持つ別メソッドになることがあるのが目安です。この違いはコンパイルエラーにならない場合もあるため、@Overrideを付けて検出する使い方が有効です。

継承の深い階層構造

継承階層が深いと、処理の出どころを追うだけで時間がかかります。BaseMiddleChildのように何段も続く場合は、共通処理を別クラスへ切り出す対処法も考えられます。

スーパークラスの不適切な利用

スーパークラスへ多くの処理を入れすぎると、サブクラスが本来不要なメソッドまで継承するのがポイントです。これは「親で使えるから子でも使える」という見た目を作るため、設計の意図が薄くなる注意点があります。

サンプルコード5:問題と解決策

次のサンプルコードは、オーバーライドしたつもりでも引数が変わってしまった例です。displayMessage()displayMessage(String message)は別のシグネチャなので、同じ処理の置き換えにはなりません。

問題点:不適切なメソッドのオーバーライド

// スーパークラス
public class SuperClass {
    public void displayMessage() {
        System.out.println("スーパークラスのメッセージ");
    }
}

// サブクラス
public class SubClass extends SuperClass {
    public void displayMessage(String message) {
        System.out.println(message);
    }
}

public class Main {
    public static void main(String[] args) {
        SubClass subclass = new SubClass();
        subclass.displayMessage(); // エラー: 引数が必要
    }
}

結果: このまま複数のpublic classを一つのファイルに置くと別のコンパイルエラーも起きます。意図としては、displayMessage(String message)が親のdisplayMessage()を置き換えていないため、期待する対処法にならない例です。

この問題は、メソッド名だけでなく引数リストまでそろえることで解消できます。加えて@Overrideを付けると、誤ったシグネチャをコンパイラが指摘しやすくなるのが一般的です。

解決策:メソッドの正しいオーバーライド

// スーパークラス
public class SuperClass {
    public void displayMessage() {
        System.out.println("スーパークラスのメッセージ");
    }
}

// サブクラス
public class SubClass extends SuperClass {
    @Override
    public void displayMessage() {
        System.out.println("サブクラスのメッセージ");
    }
}

public class Main {
    public static void main(String[] args) {
        SubClass subclass = new SubClass();
        subclass.displayMessage(); // "サブクラスのメッセージ"と表示されます
    }
}

結果: 各クラスを適切なファイルへ分けた場合、期待される出力は「サブクラスのメッセージ」です。@Overrideにより、親クラスのメソッドを正しく置き換える意図も読み取れます。

このような注意点は、オーバーライドを扱う別記事ともつながります。詳しい書き方を確認するなら、Javaでマスターするオーバーライドを合わせて読むと、サンプルコードの比較がしやすくなるのが現実的です。

スーパークラスのカスタマイズ方法

スーパークラスのカスタマイズでは、親に用意された処理をサブクラスで変える方法と、親の共通処理を残したまま子で処理を足す方法があります。Javaでは前者に@Override、後者にsuper.method()を使う形がよく見られます。

ただし、カスタマイズしやすさだけを優先してすべてをprotectedにすると、サブクラスが親の内部構造へ依存しやすくなると整理できます。外部に見せる操作はpublicメソッドへ集め、内部状態はprivateに近づけると変更に強くなります。

カスタマイズの基本

カスタマイズの基本は、親の役割を壊さず、子クラスの差分だけを加えることです。たとえばAnimalgreet()は挨拶する処理として残し、Dogでは挨拶文だけを変えると、読み手が意図を追いやすくなります。

このとき、親の処理を完全に置き換えるのか、親の処理に追加するのかを分けて考えますし、これが一つの目安です。完全に置き換えるなら子側で出力を作り直し、追加するならsuper.greet()を呼んでから独自処理を続けます。

ところで、文字列のエスケープや出力内容の整形が絡む場合は、Javaエスケープ処理の解説も関連します。出力メッセージを作るサンプルコードでは、引用符や改行の扱いが読みやすさに影響すると理解できます。

サンプルコード6:カスタマイズ方法

次の例では、Animalgreet()Dogでカスタマイズします。スーパークラス側に名前を保持し、サブクラス側では挨拶文だけを変えます。

// スーパークラスAnimalを定義します
public class Animal {
    // name属性を定義します
    String name;

    // コンストラクタを定義します
    public Animal(String name) {
        this.name = name;
    }

    // greetメソッドを定義します
    public void greet() {
        System.out.println("こんにちは、私は" + name + "です");
    }
}

// スーパークラスAnimalを継承したサブクラスDogを定義します
public class Dog extends Animal {
    // コンストラクタを定義します
    public Dog(String name) {
        super(name);
    }

    // スーパークラスのgreetメソッドをオーバーライドします
    @Override
    public void greet() {
        System.out.println("わんわん、私は" + name + "です");
    }
}

public class Main {
    public static void main(String[] args) {
        // サブクラスDogのインスタンスを作成します
        Dog dog = new Dog("タロウ");

        // サブクラスのgreetメソッドを呼び出します
        dog.greet();
    }
}

結果: クラスを適切なファイルへ分けた場合、期待される出力は「わんわん、私はタロウです」です。Doggreet()が、スーパークラスの処理を犬向けの表現へ切り替えます。

このカスタマイズは単純ですが、設計上の意味は明確です。親クラスは「名前を持つ動物」、子クラスは「犬として挨拶する動物」という役割を持ち、差分がgreet()に閉じています。

ℹ️ 補足: 公式ドキュメントによれば、ObjectはJavaのクラス階層の根に位置すると覚えるとよいでしょう。明示的に親クラスを書かないクラスも、最終的にはObjectを継承します。

一方で、サブクラスが増えるほど、親クラスの変更は広く波及します。カスタマイズ前には、親へ置くべき共通処理か、別クラスへ分けるべき処理かを確認すると、あとからの対処法が少なく済みますが、覚えておくと役立つでしょう。

スーパークラスの詳細な対処法

スーパークラスの詳細な対処法では、変数の隠蔽、メソッドのオーバーライド、アクセス修飾子の誤用を分けて考えます。Javaではフィールドとメソッドで解決のされ方が異なるため、同じ「親子で同名」でも結果が変わります。

具体的には、同名フィールドはオーバーライドではなく隠蔽に近い挙動になり、親側の値を参照するにはsuper.numのように書きますし、ここを基本と考えるとよいでしょう。メソッドの場合は、シグネチャが一致すればオーバーライドとして扱われます。

具体的な対処法

初心者がつまずきやすいのは、変数名やメソッド名だけを見て、親側と子側の関係を判断してしまう点です。Javaのプログラミングでは、フィールドなら参照型、メソッドなら実体型の影響を意識すると、挙動を整理しやすくなります。

そのため、対処法としては、同名フィールドを避ける、@Overrideを必ず付ける、privateprotectedの使い分けを明確にする、という確認が有効です。うるう年判定のような条件分岐を別題材で練習したい場合は、Javaでうるう年を判定する解説も参考になると考えられます。

  1. 変数のオーバーライド誤りを避け、同名フィールドはsuperで明示します。
  2. メソッドのオーバーライド誤りを防ぐため、@Overrideを付けます。
  3. アクセス修飾子の誤用を減らすため、publicprotectedprivateの役割を分けますし、ここがポイントです。

これらの対処法は、スーパークラスのカスタマイズにもそのまま関係します。親の内部状態に子が依存しすぎると、親のフィールド名を変えただけで複数のサブクラスが壊れる可能性があります。

サンプルコード7:対処法例

次のサンプルコードは、親と子に同じ名前のnumがある場合の参照方法を表すると言えるでしょう。子側のnumと親側のnumを区別するため、親側にはsuper.numでアクセスします。

// サンプルコード7-1:変数のオーバーライド誤りの対処法例
public class SuperClass {
    int num = 100;
}

public class SubClass extends SuperClass {
    int num = 200;

    public void displayNum() {
        System.out.println("サブクラスのnum: " + num);
        System.out.println("スーパークラスのnum: " + super.num);
    }

    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        subClass.displayNum();  // 結果:サブクラスのnum: 200, スーパークラスのnum: 100
    }
}

結果: クラスを適切なファイルへ分けた場合、期待される出力は次の内容です。numだけなら子側、super.numならスーパークラス側の値を参照します。

サブクラスのnum: 200
スーパークラスのnum: 100

結果: 期待される出力として、サブクラスのnumとスーパークラスのnumが別々に表示されます。

この例から分かるように、フィールドの同名定義はコードの読み手を迷わせることがあるのが基本です。対処法として、名前を分ける、親の値を取得メソッドに隠す、子側で同名フィールドを作らない、という設計を選ぶと誤読を減らせます。

ただし、学習目的ではsuperの役割を理解するよい題材になります。実務的な設計では、getNum()のようなメソッド経由にするか、親子で同じフィールド名を避けるほうが扱いやすいでしょう。

⚠️ 注意: 出力例は期待される出力として示しているのが目安です。掲載コードは学習用の短い例であり、複数のpublic classを含む場合はJavaのファイル分割規則に合わせて保存します。

まとめ

Javaのスーパークラスは、共通する状態や処理を親クラスへ集め、サブクラスで差分を表すための仕組みです。初心者向けに整理すると、extendsで継承し、superで親へつなぎ、@Overrideで処理を置き換える流れになります。

その使い方を誤ると、メソッドを置き換えたつもりでオーバーロードになったり、同名フィールドで参照先が分かりにくくなったりするのがポイントです。注意点を減らすには、親に置く処理を絞り、アクセス修飾子を選び、サンプルコードごとに親子の責務を確認することが大切です。

一方、スーパークラスはJavaプログラミングの設計を広げる入口にもなります。カスタマイズ、ポリモーフィズム、例外的な対処法までつなげて考えると、単なる文法ではなく、変更しやすいコードを作るための判断材料として使えます。

これから学習を進める場合は、短い親子クラスを自分で読み替え、privateprotectedpublicを変えたときのコンパイル結果を確認すると理解が定着しやすくなるのが一般的です。Javaのスーパークラスは、サンプルコードを写すだけでなく、なぜ親に置くのかを考えることで使い方が見えてきます。

関連記事

著者: Japanシーモア編集部

Japanシーモアは、Web/IoT/APP/SYS 分野のプログラミング情報を体系的に提供するメディアです。本記事は編集部による執筆とAI支援を組み合わせて制作し、公開前に編集部が校正しています。誤りや改善案がございましたらお問い合わせよりご連絡ください。

※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。