Java プログラミング

【Javaの名前空間を理解しよう】パッケージでクラス名の衝突を防ぐ方法

※当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

勉強

ひでまる
ひでまる
こんにちは!ひでまるです!

こんな方におすすめ

  • プログラミング初心者の方
  • Javaを勉強中の方

 

ひでまる
ひでまる
今回はJavaの名前空間を説明していくよ〜

自分の学習記録として記事に残していきます!
プログラミングを学習している方、一緒にレベルアップしていきましょう!

 

記事の信頼性

  • 元プログラミングスクール講師で100人以上の生徒を担当
  • Java Silverの資格取得
  • 現役エンジニア

 

 

パッケージの名前空間

コード

ss

パッケージを使わないと、同じクラス名が使えない

Javaでは「同じクラス名は使えない」というルールがあります。

サンプルコードで見てみます。

◎フォルダ構成

src/
  greetings/
    english/
      Morning.java
    french/
      Morning.java
    spanish/
      Morning.java
  Main.java

 

◎サンプルコード

// src/greetings/english/Morning.java
public class Morning {
    public String morning() {
        return "Good morning";
    }
}

// src/greetings/french/Morning.java
public class Morning {
    public String morning() {
        return "Bonjour le matin";
    }
}

// src/greetings/spanish/Morning.java
public class Morning {
    public String morning() {
        return "Buenos días";
    }
}


// src/Main.java
public class Main {
    public static void main(String[] args) {
        Morning englishMorning = new Morning();
        System.out.println(englishMorning.morning());
    }
}

すべて同じクラス名「Morningクラス」を作成し、英語、フランス語、スペイン語の朝の挨拶を返すようにしています。

しかし、これでは、「Morningクラス」が重複しているため「error: duplicate class: Morning public class Morning {....」のように「同じクラス名が複数の場所で定義されているので実行できません」というエラーが出てしまいます。

一言で言えば、Java側でMorningクラスが複数存在するので、どのMorningクラスを使えばよいかわからなくなっているのが原因です。

例えるなら、学校で佐藤くんと読んだときに、はい!はい!はい!と3名答えてしまう感じです。
なので「〇〇クラスの番号5番の佐藤くん」というように具体的に呼べば問題解決になります。

この、「〇〇クラスの番号5番の佐藤くん」というのが「名前空間」と呼びます。

 

パッケージを使うと、同じクラス名でも使えるようになる

それでは、Morningクラスをパッケージ化して、同じクラス名でも使えるようにしていきます。

それぞれのMorignクラスに下記のパッケージを記述します。

  • package greetings.english;
  • package greetings.french;
  • package greetings.spanish;

このように記述することで、greetingsのenglishに属するMorignクラスと定義することができます。
パッケージを指定するときはフォルダ構成と合わせるようにしてください

◎フォルダ構成

src/
  greetings/
    english/
      Morning.java
    french/
      Morning.java
    spanish/
      Morning.java
  Main.java

 

◎サンプルコード

// src/greetings/english/Morning.java
package greetings.english;
public class Morning {
    public String morning() {
        return "Good morning";
    }
}

// src/greetings/french/Morning.java
package greetings.french;
public class Morning {
    public String morning() {
        return "Bonjour le matin";
    }
}

// src/greetings/spanish/Morning.java
package greetings.spanish;
public class Morning {
    public String morning() {
        return "Buenos días";
    }
}


// src/Main.java
public class Main {
    public static void main(String[] args) {
        greetings.english.Morning englishMorning = new greetings.english.Morning();
        System.out.println(englishMorning.morning());

       greetings.french.Morning frenchMorning = new greetings.french.Morning();
       System.out.println(frenchMorning.morning());

       greetings.spanish.Morning spanishMorning = new greetings.spanish.Morning();
       System.out.println(spanishMorning.morning());
    }
}

 

◎実行結果
Good morning
Bonjour le matin
Buenos días

「greetings.english.Morning englishMorning = new greetings.english.Morning(); System.out.println(englishMorning.morning());」のように呼び出すときは、パッケージ名.クラス名で指定することで、〇〇に属するMorningクラスを見つけることができます。

このようにパッケージ化をすることで別のパッケージであれば、同じ名前のクラスを使うことができます。

 

最後に

今回はJavaの名前空間について勉強していきました!

プログラミングを学習している人の助けになれば嬉しいです。

-Java, プログラミング