パッケージ
日本語 | 梱包 |
英語 | package |
ふりがな | ぱっけーじ |
フリガナ | パッケージ |
クラスの「苗字」。
クラスの数が増えた場合、各クラスのソースファイルが1ディレクトリ内に増え、管理が難しくなる。また、クラス名の重複が許されないため、同じクラス名にしないよう気を付ける必要が出てくる。
この問題を解決するのが「パッケージ」である。
パッケージはソースファイルをディレクトリ毎に別に管理し、そのディレクトリ名で「苗字」を付けることで、クラスを分類し、またクラス名の重複を可能にする。
クラスをパッケージ毎に分ける場合、まずソースファイルの置いてあるディレクトリを確認する。
「ソースファイルの置いてあるディレクトリ」とは、コンパイルするソースファイルを置いてあるディレクトリのことで、通常、プロジェクトディレクトリ下に「src」というディレクトリ名で作られている。具体的には、Eclipseであれば、各プロジェクトのプロパティの「Java のビルド・パス」ページの「ソース」タブで表示されているディレクトリがそれである。
この「ソースファイルの置いてあるディレクトリ」にさらにディレクトリを作り、その中にソースファイルを置く。
そのソースファイルは、最初の方の行で「package パッケージ名;」という形式でパッケージ名を付ける。
パッケージ名は「ソースファイルの置いてあるディレクトリ」からの相対ディレクトリを「.」で継ないだものである。たとえば「ソースファイルの置いてあるディレクトリ」が「project/src/」であれば、「project/src/test/test2/OtherPackageClass2.java」クラスのパッケージ名は「package test.test2;」となる。
以上で、このクラスはパッケージで囲まれる。OtherPackageClass2クラスの例で言えば「test.test2」というパッケージ名が付いた「test.test2.OtherPackageClass2」がクラスの正式名称となる。
パッケージに囲まれたクラスを使用する場合には、2つの方法がある。
ひとつは、importを使用してあらかじめパッケージ名を省略しておく方法。クラス宣言の前に「import 使用したいクラスのパッケージも含めたクラス名;」と「インポート宣言」を行うことで、パッケージ名を付けずにそのクラスを使用することができる。
上記のOtherPackageClass2の例であれば「import test.test2.OtherPackageClass2;」という形式で、OtherPackageClass2クラスをパッケージ名を付けずに使用することができる。
ただし、この方法の場合、パッケージは異なるが同名のクラスを同じようにインポートした場合、クラス名が重複してしまうため、コンパイルエラーとなってしまう。
もうひとつの方法は、インポートせずに常にパッケージ名を付けたクラス名、つまり「完全修飾名」を使用する方法である。
上記の例なら「test.test2.OtherPackageClass2」という形式で使用することができる。
この場合にはクラス名が重複してもパッケージが異なるためコンパイルエラーにはならないが、ソースコードが冗長になるため見にくくなる可能性がある。
プログラムは、ひとつのパッケージに大量のクラスを置くと、それだけで管理が大変になる。各クラスを適切なパッケージに分け、効率よく管理するのがいいだろう。
クラスの数が増えた場合、各クラスのソースファイルが1ディレクトリ内に増え、管理が難しくなる。また、クラス名の重複が許されないため、同じクラス名にしないよう気を付ける必要が出てくる。
この問題を解決するのが「パッケージ」である。
パッケージはソースファイルをディレクトリ毎に別に管理し、そのディレクトリ名で「苗字」を付けることで、クラスを分類し、またクラス名の重複を可能にする。
クラスをパッケージ毎に分ける場合、まずソースファイルの置いてあるディレクトリを確認する。
「ソースファイルの置いてあるディレクトリ」とは、コンパイルするソースファイルを置いてあるディレクトリのことで、通常、プロジェクトディレクトリ下に「src」というディレクトリ名で作られている。具体的には、Eclipseであれば、各プロジェクトのプロパティの「Java のビルド・パス」ページの「ソース」タブで表示されているディレクトリがそれである。
この「ソースファイルの置いてあるディレクトリ」にさらにディレクトリを作り、その中にソースファイルを置く。
そのソースファイルは、最初の方の行で「package パッケージ名;」という形式でパッケージ名を付ける。
パッケージ名は「ソースファイルの置いてあるディレクトリ」からの相対ディレクトリを「.」で継ないだものである。たとえば「ソースファイルの置いてあるディレクトリ」が「project/src/」であれば、「project/src/test/test2/OtherPackageClass2.java」クラスのパッケージ名は「package test.test2;」となる。
以上で、このクラスはパッケージで囲まれる。OtherPackageClass2クラスの例で言えば「test.test2」というパッケージ名が付いた「test.test2.OtherPackageClass2」がクラスの正式名称となる。
パッケージに囲まれたクラスを使用する場合には、2つの方法がある。
ひとつは、importを使用してあらかじめパッケージ名を省略しておく方法。クラス宣言の前に「import 使用したいクラスのパッケージも含めたクラス名;」と「インポート宣言」を行うことで、パッケージ名を付けずにそのクラスを使用することができる。
上記のOtherPackageClass2の例であれば「import test.test2.OtherPackageClass2;」という形式で、OtherPackageClass2クラスをパッケージ名を付けずに使用することができる。
ただし、この方法の場合、パッケージは異なるが同名のクラスを同じようにインポートした場合、クラス名が重複してしまうため、コンパイルエラーとなってしまう。
もうひとつの方法は、インポートせずに常にパッケージ名を付けたクラス名、つまり「完全修飾名」を使用する方法である。
上記の例なら「test.test2.OtherPackageClass2」という形式で使用することができる。
この場合にはクラス名が重複してもパッケージが異なるためコンパイルエラーにはならないが、ソースコードが冗長になるため見にくくなる可能性がある。
プログラムは、ひとつのパッケージに大量のクラスを置くと、それだけで管理が大変になる。各クラスを適切なパッケージに分け、効率よく管理するのがいいだろう。
参考サイト
- (参考サイトはありません)
// Sample.java
// test.test2パッケージ内のOtherPackageClassクラスを使用します。
import test.test2.OtherPackageClass;
public class Sample
{
public static void main( String[] args )
{
// OtherPackageClassクラスを使用します。
// importしてあるのでそのまま使えます。
OtherPackageClass otherPackageClass = new OtherPackageClass();
otherPackageClass.output();
// OtherPackageClass#output()
// importしてない場合には以下のようにパッケージ名を
// 省略せずに使用します。
test.test2.OtherPackageClass otherPackageClass2 = new test.test2.OtherPackageClass();
otherPackageClass2.output();
// OtherPackageClass#output()
}
}
// test/test2/OtherPackageClass.java
/**
つまり、このファイルはtest/test2ディレクトリの中にあります。
Sample.javaはtestディレクトリと同階層にあります。
位置関係はこんな感じ。
project/src/Sample.java
project/src/test/test2/OtherPackageClass.java
*/
package test.test2;
// ↑test/test2ディレクトリに置いてあるので「test.test2」です。
/**
* test.test2パッケージ内のクラス。
*/
public class OtherPackageClass
{
/**
* 出力します。
*/
public void output()
{
System.out.println( "OtherPackageClass#output()" );
}
}
// test.test2パッケージ内のOtherPackageClassクラスを使用します。
import test.test2.OtherPackageClass;
public class Sample
{
public static void main( String[] args )
{
// OtherPackageClassクラスを使用します。
// importしてあるのでそのまま使えます。
OtherPackageClass otherPackageClass = new OtherPackageClass();
otherPackageClass.output();
// OtherPackageClass#output()
// importしてない場合には以下のようにパッケージ名を
// 省略せずに使用します。
test.test2.OtherPackageClass otherPackageClass2 = new test.test2.OtherPackageClass();
otherPackageClass2.output();
// OtherPackageClass#output()
}
}
// test/test2/OtherPackageClass.java
/**
つまり、このファイルはtest/test2ディレクトリの中にあります。
Sample.javaはtestディレクトリと同階層にあります。
位置関係はこんな感じ。
project/src/Sample.java
project/src/test/test2/OtherPackageClass.java
*/
package test.test2;
// ↑test/test2ディレクトリに置いてあるので「test.test2」です。
/**
* test.test2パッケージ内のクラス。
*/
public class OtherPackageClass
{
/**
* 出力します。
*/
public void output()
{
System.out.println( "OtherPackageClass#output()" );
}
}
// Sample.java // test.test2パッケージ内のOtherPackageClassクラスを使用します。 import test.test2.OtherPackageClass; public class Sample { public static void main( String[] args ) { // OtherPackageClassクラスを使用します。 // importしてあるのでそのまま使えます。 OtherPackageClass otherPackageClass = new OtherPackageClass(); otherPackageClass.output(); // OtherPackageClass#output() // importしてない場合には以下のようにパッケージ名を // 省略せずに使用します。 test.test2.OtherPackageClass otherPackageClass2 = new test.test2.OtherPackageClass(); otherPackageClass2.output(); // OtherPackageClass#output() } } // test/test2/OtherPackageClass.java /** つまり、このファイルはtest/test2ディレクトリの中にあります。 Sample.javaはtestディレクトリと同階層にあります。 位置関係はこんな感じ。 project/src/Sample.java project/src/test/test2/OtherPackageClass.java */ package test.test2; // ↑test/test2ディレクトリに置いてあるので「test.test2」です。 /** * test.test2パッケージ内のクラス。 */ public class OtherPackageClass { /** * 出力します。 */ public void output() { System.out.println( "OtherPackageClass#output()" ); } }
「解説」に含まれているページ
- *
- .
- <%@ page import
- <jsp:useBean>
- Applet
- ArithmeticException
- ArrayIndexOutOfBoundsException
- ArrayList
- Arrays
- ArrayStoreException
- AssertionError
- AWT
- BigDecimal
- BigInteger
- Boolean
- BufferedInputStream
- BufferedOutputStream
- BufferedReader
- BufferedWriter
- Byte
- ByteArrayInputStream
- ByteArrayOutputStream
- C++言語
- Calendar
- Character
- CharArrayReader
- CharArrayWriter
- CharSequence
- Class
- ClassCastException
- ClassNotFoundException
- Cloneable
- CloneNotSupportedException
- Collection
- Connection
- Cookie
- DataInputStream
- DataOutputStream
- Date
- DecimalFormat
- Double
- Enumeration
- EOFException
- Error
- Exception
- ExceptionInInitializerError
- File
- FileInputStream
- FileNotFoundException
- FileOutputStream
- FileReader
- FileWriter
- FilterInputStream
- FilterOutputStream
- FilterReader
- FilterWriter
- Float
- Frame
- Graphics
- GregorianCalendar
- HashMap
- HashSet
- Hashtable
- HttpServlet
- HttpServletRequest
- HttpServletResponse
- HttpSession
- HttpURLConnection
- IllegalArgumentException
- import
- IndexOutOfBoundsException
- InputStream
- InputStreamReader
- Integer
- InterruptedException
- InvocationTargetException
- IO
- IOException
- Iterable<T>
- Iterator
- JasperException
- java
- java.io
- java.lang
- java.net.URL
- java.sql.Date
- java.util
- javac
- Javadoc
- javax
- JDBC
- JFrame
- JspWriter
- JTree
- LineNumberInputStream
- LineNumberReader
- LinkedHashMap
- LinkedList
- List
- Locale
- Logger
- Long
- Map
- Math
- NoClassDefFoundError
- Node
- NoSuchElementException
- NullPointerException
- NumberFormatException
- Object
- ObjectInputStream
- ObjectOutputStream
- OutOfMemoryError
- OutputStream
- OutputStreamWriter
- package
- PageContext
- PipedInputStream
- PipedOutputStream
- PipedReader
- PipedWriter
- PreparedStatement
- PrintStream
- PrintWriter
- privateクラス
- Properties
- protected
- protectedクラス
- protectedフィールド
- protectedメソッド
- publicクラス
- PushbackInputStream
- PushbackReader
- Reader
- regex
- RequestDispatcher
- ResourceBundle
- ResultSet
- Runnable
- Runtime
- RuntimeException
- SequenceInputStream
- Serializable
- ServletConfig
- ServletContext
- ServletException
- Short
- SimpleDateFormat
- SQLException
- StackOverflowError
- Statement
- String
- StringBuffer
- StringBufferInputStream
- StringIndexOutOfBoundsException
- StringReader
- StringTokenizer
- StringWriter
- Suite
- Swing
- System
- TestCase
- Thread
- Throwable
- Timestamp
- TreeMap
- URLDecoder
- URLEncoder
- Vector
- Writer
- インポート
- インポート宣言
- クライアントサーバーシステム
- クラスパス
- クラスファイル
- シンタックス
- セマンティクス
- ソースファイル
- パッケージ
- パッケージも含めたクラス名
- パッケージ名
- パッケージ宣言
- 名前空間
- 完全修飾名
- 無印クラス
- 無印フィールド
- 無印メソッド
- 識別子
「サンプルプログラムとか」に含まれているページ
- .
- <jsp:useBean>
- HttpServletRequest
- import
- java
- java.io
- java.lang
- java.util
- JavaBeans
- javac
- javax
- JDBC
- JSP暗黙オブジェクト「request」
- JSP暗黙オブジェクト「session」
- package
- protectedクラス
- protectedフィールド
- protectedメソッド
- publicクラス
- RSS
- Rss4j
- アクセスコントロール
- アプリケーション
- イントロスペクション
- インポート
- インポート宣言
- クラスパス
- クラスファイル
- サーブレット
- シンタックス
- セッションスコープ
- セマンティクス
- ソースファイル
- ドメイン
- パッケージ
- パッケージ名
- パッケージ宣言
- リクエストスコープ
- 冗長
- 名前空間
- 無印クラス
- 無印フィールド
- 無印メソッド
- 識別子