質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

7673閲覧

javaのpackage宣言の必要性はなんですか?

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

3クリップ

投稿2017/05/15 16:13

javaでは、クラスを整理したり、複数の同名クラスがあっても一意に識別するために、package宣言をし、さらにディレクトリ構成もそれと同一にしなければいけないみたいです。

当初は、ディレクトリ構成はpackage宣言と一致していなくても、コンパイラがpackage宣言を参照して、クラスファイルのディレクトリ構成はpackage宣言に一致したものになると思っていました。がSun製のコンパイラにはそのような機能はないみたいです。

次に、javaドキュメントに表示するためなのかなー、とぼんやり思いましたが
、これもディレクトリ構成がpackage構造と一致しているのならば、そのディレクトリ構造を参考にして、javaドキュメントに表示すればいいのになー、と思いました。

また、逆に、package宣言を参照して、ソースファイルのディレクトリ構成が正しいかを判断しているのであれば、そのダブルチェック機能を廃止して、クラスファイルをpackage宣言どおりのディレクトリに配置してもいいのになー、と思いました。

一つだけ必要性を感じるのは、コンパイラが自分の位置情報を、クラスファイルから読みとっている場合です。これが必要性ですか?

どのような経緯で、package宣言は必要なのですか。教えてください

TakeoAsai👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

発想が逆だと思います。

まず、あるソースをコンパイルするときに依存するclassファイルがすでにあるとは限りません。

Java

1package p0; 2 3public class A { 4 public void hoge(p1.B b) { 5 b.fuga(); 6 } 7 public void fuga() { 8 System.out.println("A fuga!"); 9 } 10}

Java

1package p1; 2 3public class B { 4 public void hoge(p0.A a) { 5 a.fuga(); 6 } 7 public void fuga() { 8 System.out.println("B fuga!"); 9 } 10}

こんな風な関係の、p0.Ap1.Bがあったとします。果たしてこの二つはどちらからコンパイルすれば良いのでしょうか?p0.Aをコンパイルするにはp1.Bの情報が必要です。逆にp1.Bをコンパイルするにはp0.Aの情報が必要です。でも、実際にこれらはコンパイル可能です。なぜなら、classファイルだけではなく、ソースファイルもjavacは見に行くからです。

p0.Aをコンパイルしようとするとき、コンパイラはp0.Aの枠組みの情報(どんなクラスでどんなメソッドがあるか)を読み込みます。実際の内部をコンパイルするにはp1.Bが必要となったので、p1.Bを探しに行きます。しかし、まだコンパイルされていないのでclassファイルはありません。そこで、今度はp1.Bのソースファイルを探しに行きます。p1.Bのソースファイルを見つけると、同じようにp1.Bの枠組みの情報(どんなクラスでどんなメソッドがあるか)を読み込みます。これで、p0.Aを実際にコンパイルすることが可能になると言うことです。(実際は、p1.Bもコンパイルされるようですので、先にp0.Aの読込済み情報を使ってp1.Bをコンパイルしているのかも知れません。)

つまり、ソースファイルもclassファイルと同様に、パッケージ名とクラス名から、どこに存在するのかがわからなければなりません。Javaはその探索方法をディレクトリ名とファイル名に制限をかけることで自動で探しに行けるようにしたのです。

では、package宣言をなくしても良いのではとなりますが、今度はどうやってどのパッケージなのかが判断すれば良いのかがわかりません。javacでコンパイルするソースファイルを指定するときに、パッケージを想定した相対パスであるとは限らないからです。絶対パスでわたされたらどうなるでしょうか?javac -sourcepath .. A.javaみたいなのはどう判別すれば良いのでしょうか?もし、どのパッケージにあるファイルかがソースファイルに存在しなければ、コンパイルでのファイル名指定に大きな制約が必要になってきます。コンパイルの仕方を間違えると意図しないパッケージに入ることになってしまいます。

実際のjavacの動きとして、ファイルを単体でコンパイルする場合はパッケージ名のディレクトリに置いておく必要はありません。パッケージ名のディレクトリに置くのは、classファイルがないときにソースファイルを見つけるためだけに過ぎないのです。どのパッケージのclassファイルになるかはソースコードに書いてある通りになると言うことです。

何を言いたいかというと、経緯が逆ということです。名前空間を分ける必要性から、パッケージのような概念は必須でした。そこでpackageが作られたと思われます。そして、JavaがC++等とは違って画期的だったのが、パッケージ名とクラス名から、必要になるソースファイルやclassファイルを自動的に探索できるようにしたということです。

投稿2017/05/23 22:04

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/25 11:06

分かりづらい質問に対して、大変分かりやすく勉強になる記事をありがとうございました。 ありがとうございました。!! またお願いします。
guest

0

必要かどうか、だけを合理的に考えると不要でしょう。
同じ理屈で言うと、クラス名/インタフェース名の宣言も不要になりますよね。
でも、そこまで切って捨ててしまったJavaプログラミングを想像すると私はちょっと不安になりました。
(なんか間違えそうだし、それに気づくのも遅れそうな気がしませんか?)
そういうポカ避け的な意味があって、今の文法になっているのではないかと私は想像しました。

投稿2017/05/23 13:20

tokoi

総合スコア65

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/25 11:07

回答ありがとうございます。 また、お願いします。
guest

0

ディレクトリ構成はpackage宣言と一致していなくても、コンパイラがpackage宣言を参照して、クラスファイルのディレクトリ構成はpackage宣言に一致したものになると思っていました

もちろん、デザインとしてそのような選択肢も理論上は考えられますが、パッケージの階層とソースコードのディレクトリ階層を別にする積極的な理由はないと思います。

パッケージやモジュールの概念は他の言語にも当然あって、必ずしもディレクトリ構造をモジュールの階層と合わせる必要のない言語もあります。
しかし現実的にはライブラリが提供する機能の階層と、実際のソースコードのディレクトリ階層が一致している方が分かりやすいので、強制されていなくても大体あわせていると思います。

Javaはパッケージの階層が深くなりがちなので、プレーンなエディタを使って開発している場合ディレクトリを行き来するのが面倒かもしれませんが、みんなIDEで開発してるでしょう。

投稿2017/05/15 17:06

koko_u

総合スコア936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/15 17:51

ご回答ありがとうございます。 では、パーケージ構造がそのままディレクトリ構造ならば、どのような経緯で、package宣言は必要なのですか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問