Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
22
Help us understand the problem. What is going on with this article?
@Co_Pilot

Java入門 パッケージ管理

More than 5 years have passed since last update.

Java入門
パッケージ

前回はソースコードの分割をやりました。コード自体はスッキリとして保守性は高くなりますが、プロジェクトによってはクラスの数が膨大になり、かえって保守性が悪くなることがあります。それを防ぐために、Javaにはクラスをパッケージというグループに分けて管理できる仕様になっています。
クラスをパッケージに所属させるにはソースコードの先頭部分にpackage文を記入します。

package 所属させるパッケージ名;

前回のソースコードを編集してみます。

sample.java
// calcurator.mainパッケージに所属させる
package calculator.main;

public class Sample {
    public static void main(String[] args) {
        int a = 5;
        int b = 2;

        int subAnswer = calculator.method.Calculator.subtraction(a, b);
        int addAnswer = calculator.method.Calculator.add(a, b);

        System.out.println("5 + 2 = " + addAnswer);
        System.out.println("5 -  2 = " + subAnswer);
    }
}
calculator.java
// calculator.methodパッケージに所属させる
package calculator.method;
// 計算するクラス
public class Calculator {
    // 引き算メソッド
    public static int subtraction(int x, int y) {
        int answer = x - y;

        return answer;
    }
    // 足し算メソッド
    public static int add(int x, int y) {
        int answer = x + y;

        return answer;
    }
}

mainメソッドがあるクラスをcalculator.mainパッケージ
calculatorメソッドがあるクラスをcalculator.methodパッケージに所属させました。

パッケージ名は自由に指定できますが、小文字が基本です。

また、mainメソッドの各メソッドの呼び出しにも変更を加えました。呼び出すメソッドのパッケージ名もドット演算子で指定して上げる必要があります。
このように、クラス名を指定することを完全限定名【FQCN】といいます。

パッケージを使う理由

最初の方に、パッケージはクラスを管理するのに便利と書きましたが、他にも使うメリットはあるんです。
唐突ですがクラス名の重複はダメです。たとえ処理が違っていたとしても許されません。一人で開発する分には恐らくそのような問題は起きないと思いますが、これが大人数で開発するとなると被る可能性は大です。
しかし、パッケージが異なればクラス名が被ってもいいんです!FQCNが異なれば、クラスの区別は可能だからです。

例えば、同じ学校に同姓同名が何人か居たとしても、学年と組で区別できますよね?それと同じです。

さて、ここで新しい問題が出てきました。パッケージ名が被る可能性だってあるじゃないか!
しかし、それを防ぐためにパッケージ名はあるルールが推奨されています。
それが、保有するインターネットドメインを前後逆順にしたものから始めることです。

例えば、http://oukokumin.jpというドメインを持っていたら。

推奨されるパッケージ名
jp.oukokumin

 

これから始まるパッケージ名を使えばいいのです。

jp.oukokumin.main;
jp.oukokumin.calculator;

などです。

FQCNの省略

ここまで部分化したソースをパッケージに所属させるという効率的なことをやってきました。
ただ毎回FQCNで指定するのはめんどくさくないですか?
なんだか本末転倒な気がしないでもないです。

実はこれ省略することができるんです。それがimportです!
これはあくまで省略機能なので、C言語でつかうincludeとは意味合いが違ってきます。

sample.java
// calcurator.mainパッケージに所属させる
package calculator.main;
import calculator.method.Calculator;

public class Sample {
    public static void main(String[] args) {
        int a = 5;
        int b = 2;

        int subAnswer = Calculator.subtraction(a, b);
        int addAnswer = calculator.method.Calculator.add(a, b);

        System.out.println("5 + 2 = " + addAnswer);
        System.out.println("5 -  2 = " + subAnswer);
    }
}

calculator.method.Calculator;をimportしました。subtractionを見て下さい。FQCNが省略されています。addは比較のためにあえてFQCNを記述しています。

ここで注意なのですがimport文はpackage文の下に書いて下さい。上に書くとエラーが出ます。
今回は、calculator.methodパッケージ内のCalculatorクラスをimportしていますが
パッケージに所属するすべてのクラスをimportするには

import calculator.method.*;

これでcalculator.methodパッケージに所属するすべてのクラスをimportします。

22
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Co_Pilot
都内でプログラマやってます。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
22
Help us understand the problem. What is going on with this article?