JavaのパッケージとクラスライブラリとAPIドキュメント

## パッケージとは
**パッケージ**とは複数のクラスをまとめる仕組みの事。
Java には、多くのプログラムで共通に必要とされる機能を持ったクラスがあらかじめ用意されていてこれらを総称して**クラスライブラリ**と呼び、クラスライブラリを活用することで、プログラムに高度な機能を簡単に組み込むことができる。
例えば、に文字列を出力するためのSystem.out.printlnという命令文も、クラスライブラリに含まれるPrintStreamというクラスの機能を使っている。
クラスライブラリに含まれるクラスやインタフェースは、用途やその種類に応じて**パッケージ**と呼ばれる単位で分類されている。

## パッケージ化の宣言
複数のクラスをまとめるにはファイルの先頭行で**パッケージ化の宣言**をする。宣言するには**packageキーワード**を使い package パッケージ名;」とする。
```:例文
// package パッケージ名;
package pack;

public class Student{
       :
}
```
package パッケージ名;とした後にクラスの宣言や処理の記述をする。

Studentクラスをpackパッケージに入れるという風にプルグラムに書いた場合は実際のフォルダ構成も**パッケージの名前と同じ名前のフォルダ**を作って**その中にクラスファイルを入れる**必要がある。
またクラスをパッケージ化するとクラス名が **「パッケージ名.クラス名」** に変わる。（「パッケージ名.クラス名」に変わった名前を**完全修飾名**と呼ぶ）

![スクリーンショット 2022-11-09 10.10.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/d9590532-913e-c4fa-c2e6-25d7f24a6001.png)
上の写真はフォルダ構成のイメージ。
Javaフォルダのすぐ下に実行用クラスのStuSampleクラスがある。Studentクラスをpackパッケージに入れたのであればpackフォルダの中に入れる必要がある。
Studentクラスはパッケージ化されたので名前がpack.Studentクラスとなる。

クラスやインターフェースはフォルダでグループ分けをする。「フォルダの階層が第1階層から第3階層まであり、第3階層でクラスを定義する」場合はパッケージ名は「第1階層フォルダ名.第2階層フォルダ名.第3階層フォルダ名」というように「.」(ピリオド)を使って第1階層から順にフォルダ名を連結してパッケージ名を付ける。（フォルダ名は小文字が推奨されている)。

lang/java/hello/HelloJava.javaというディレクトリの場合は下記のようにする。
```
package lang.java.hello;
 
public class HelloJava {
    public HelloJava() {
     　　　　　　　　　：
}
```

## パッケージクラスの利用（インポート）
パッケージクラスの利用する方法として完全修飾名を毎回コードに書く必要があるが**インポート**してパッケージの中のクラスを読みこむことでパッケージ名を省略する事ができる。その際に**importキーワード**を使用する。

importとは、特定のパッケージに含まれるクラスをインポート（引き込む）する際に使用されるJavaのキーワードの1つ、importを利用すると、特定のパッケージ内のクラスを完全修飾名で指定しなくても呼び出すことができるようになります。（パッケージ名はJavax.xml.bind.annotation.adaptersのように長い場合がある。）
「import.完全修飾名;」と記述する
```:例文
import pack.Student;
   class StuSample{
        :
}
```
パッケージ内の複数のクラスを一気に読みこみたい場合は「import pack.✳︎;」と記述する
```
import pack.✳︎;
 class StuSample{
        :
}
```
(クラスの中でパッケージもしたい、importもしたい場合は「パッケージ宣言→インポート→クラス定義」の順番で記述する。)

### 例文
```:実行用クラス
import pack.Student8;

public class StuSample8{
  public static void main(String[] args){
    Student8 stu = new Student8("菅原");
    stu.display();
  }
}
```
```:設計図クラス
package pack;

public class Student8{
  private String name;

  public Student8(String name){
    this.name = name;
  }
  public void display(){
    System.out.println("名前:" + name);
  }
}
```
```:出力結果
名前：菅原
```
設計図であるStudent8クラスではメンバ変数、コンストラクタ、displayメソッドを持っている。さらに１行目でパッケージ宣言されている。

実行用であるStuSample8クラスではパッケージ化されたStudent8クラスを利用する為に１行目で「import pack.Student8;」と記述してインポートしている。
Student8クラスをインポートしたのでStuSample8クラス内でStudent8クラスを利用する際には５行目のように「Student8」とだけ記述すれば良い。

パッケージ化されたクラスを呼び出す際には呼び出される側（今回の例文だとStudent8クラス）からコンパイルしないといけない。その後packフォルダを作成しtudent8.classをpackフォルダに入れる必要がある。
ここまでしないと下記のようにコンパイルエラーになる。
```:コンパイルエラー
StuSample8.java:1: エラー: パッケージpackは存在しません
import pack.Student8;
           ^
StuSample8.java:5: エラー: Student8にアクセスできません
    Student8 stu = new Student8("菅原");
    ^
  ソース・ファイル./Student8.javaは不正です
    ファイルにクラスStudent8が含まれていません
    削除するか、ソース・パスの正しいサブディレクトリにあるかを確認してください。
エラー2個
```
上記の作業は以下のコマンドを打つことで一気に行う事が出来る
```
javac -d . *.java
```

↓javac -d . *.javaコマンド実行前
![スクリーンショット 2022-11-09 11.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/292f9f80-5a8c-6b1e-15ac-cae6ab33bf7e.png)
↓javac -d . *.javaコマンド実行後（packフォルダの中にはコンパイルされたStudent8.classファイルが入っている）
![スクリーンショット 2022-11-09 11.33.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/45ade15a-1f15-e7af-6bae-bd7a3adc4894.png)

## スタティックインポート
**スタティックインポート**とは、static変数やstaticメソッドをクラス名を指定せずに使用する機能で、 これにより使用するたびにクラス名を記述する必要がなくなる。 import staticキーワードを使用し、完全修飾名およびインポートしたいstatic変数やstaticメソッドを指定する事でパッケージ名とクラス名を省略して、クラス変数名やクラスメソッドを直接記述できるようになる。
```
import static バッケージ名.クラス名.クラス変数名orクラスメソッド;
```

import 文ではアスタリスク(*)を使って、複数のクラスをまとめてインポートすることができるが同じようにimport static 文でも行うことができる。
例えば、次のように記述することで、Math クラスにあるすべてのクラス変数とクラスメソッドを一度にスタティックインポートできる。
```
import static java.lang.Math.*;
```

### 例文
```
// Javaで円周率を使用する為の定数「Math.PI」
import static java.lang.Math.PI;
//引数に指定した値の絶対値を取得することができるabsメソッド
import static java.lang.Math.abs;

public class StaticImportExample{
  public static void main(String[] args) {
    System.out.println("PI=" + PI);
    System.out.println("abs(-2)=" + abs(-2));
  }
}
```
java.lang.Math クラスのPI というクラス変数(円周率の値)と、abs というクラスメソッド(絶対値を求めるメソッド)をスタティックインボートしている。
これによりPI と記述するだけで、クラス変数java.lang.Math.PI を参照できるようになる。
同様に、abs と記述するだけでjava.lang.Math.abs メソッドを呼び出すことができる。

## クラスライブラリとは
**クラスライブラリ**とはJDK（Java開発環境などと呼ばれJava のプログラムの開発や実行を行うためのプログラムのセット）の一部として提供されるクラス群の事。
クラスライブラリの中にはパッケージごとに数千個のクラスやインターフェースがまとめられている。
### Javaの主なパッケージ
| パッケージ名 | 説明 |
| --- | --- |
| java.lang | Java の基本的な機能を提供するクラス群(多くのクラスで使用する) |
| java.util | 便利な機能を提供するクラス群 |
| java.io | 入出力を扱うクラス群 |
| javax.swing | グラフィカルなインタフェースを実現するためのSwing と呼ばれるコンポーネントを提供するクラス群 |
| java.awt | 2 次元の函形描画に関連するクラス群 |
| java.awt.event | コンポーネントからのイベントを処理するためのクラス群 |
| java.net | ネットワーク機能を提供するクラス群 |

これらのパッケージをさらにまとめたものを**モジュール**と呼ぶ。

## APIドキュメント
**API**は「Application Programming Interface」の略称。
アプリケーションやプログラム同士をつなぐもので開発者が独自で作ったプログラムとJDKとして提供されているJavaのクラスライブラリを繋げて共有できる仕組みを指す。
APIを使うことにより、プログラムのコードを一から書く必要がないため、開発を効率良く進めることができるようになる。

クラスライブラリの情報（クラスやそれに含まれるメンバ変数、メソッド）をまとめたものを**APIドキュメント**と呼ぶ。

![スクリーンショット 2022-11-09 12.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2785154/5d7babd3-b456-e3f8-b32f-6ad53a6f5faa.png)

上の写真はAPIのイメージ。
独自で作ったプログラム内の文字列の”１０”をクラスライブラリに渡してint型の１０に変換したい時、APIである「Integer.parseint（）メソッド」を使う。１０という値を出力したい場合は「System.out.println（）メソッド」を使う。

APIドキュメントはオラクル社の公式ドキュメントで確認できる。

https://www.oracle.com/jp/java/technologies/documentation.html

**開発者はメソッドの呼び出し方さえ分かれば呼び出して利用できる。**








## 参考記事
https://www.youtube.com/watch?v=GiicGJ9EfP4

https://www.sejuku.net/blog/63008

https://www.youtube.com/watch?v=DOVA19GErXE

https://www.internetacademy.jp/it/programming/java/using-java-api-and-class-library.html