1. フォルダ src — あなたのコードがある場所
もし Java プロジェクトが家だとしたら、src フォルダは住人(あなたのクラス)が集まる居間のようなものです。ソースコードのファイルは必ずここに置きます。プロジェクトのルートや設定用フォルダ、デスクトップなどには置きません(たとえ置きたくなっても)。
なぜソースを他のものと分けるのか?
srcフォルダには、あなたが手で書くファイルだけを置きます:.java。- ビルド過程で生成されるもの(例:.class ファイル、一時ファイル)は別のフォルダ(out、build、target など)に置かれます。
- これによりナビゲーションが楽になり、プロジェクトがすっきりし、IDE もご機嫌になります。
シンプルなプロジェクトの構成例:
MyFirstProject/
├── .idea/ # IntelliJ IDEA の内部ファイル。触らない
├── out/ # コンパイルされた .class ファイルが生成される場所
├── src/ # ここにソースコードを置く!
│ └── Main.java
├── MyFirstProject.iml
└── README.md
重要:
あなたが自分で書くもの—クラス、パッケージ、インターフェース—はすべて src フォルダ内に置きます。画像、音楽、秘伝のレシピなどは入れないでください—それらには別のフォルダを使います。
2. パッケージ package
Java ではクラスを「パッケージ」でグループ化するのが一般的です。これはファイルシステムにおけるフォルダのようなもので、クラス用のフォルダだと思ってください。パッケージは次の役に立ちます。
- 同じ名前のクラスが 2 つあっても、別パッケージなら衝突を避けられます(例:
Mainが複数あっても問題なし)。 - コードを論理的に構造化できます(例:
com.codegym.tasks、com.mycompany.utils)。 - クラスやメソッドへのアクセス制御ができます。
パッケージ宣言の構文
各 Java ファイルの冒頭(すべての import や class より前)に次の 1 行を書きます。
package com.codegym.lesson05;
これは、このファイルのクラスが com.codegym.lesson05 パッケージに属することを意味します。
重要:
ファイルシステム上のフォルダ構成はパッケージ名と一致していなければなりません。もし package com.codegym.lesson05; と書いたなら、ファイルへのパスは次のようになります。
src/com/codegym/lesson05/Main.java
IntelliJ IDEA でパッケージを作成する方法
- プロジェクトパネルで
srcフォルダを右クリックします。 - New → Package を選びます。
- 名前を入力します。例:com.codegym.lesson05(IDE が自動で入れ子のフォルダを作成します)。
- 次にこのパッケージ内に新しいクラスを作成します。com.codegym.lesson05 フォルダを右クリックし、New → Java Class を選んで名前を入力します。
例:
src/
└── com/
└── codegym/
└── lesson05/
└── User.java
なぜすべてを単に src に突っ込んではいけないのか?
すべてのクラスをごちゃ混ぜにすると、プロジェクトはあっという間に「ゴミ山」になり、必要なファイルを見つけるのが学生寮でノートPCの充電器を探すよりも難しくなります。パッケージを使いましょう—そうすればプロジェクトの拡張、外部ライブラリの導入、チーム間でのコード分割がずっと簡単になります。
3. クラスの完全修飾名
Java の各クラスは必ず何らかのパッケージに属します。パッケージはクラスライブラリ内の「フォルダ」のようなものです。例えば:
- System クラスは java.lang パッケージにあります。完全修飾名は java.lang.System です。
- Scanner クラスは java.util パッケージにあります。完全修飾名は java.util.Scanner です。
- ArrayList も java.util にあるので、完全修飾名は java.util.ArrayList です。
つまり、クラスの完全修飾名 = パッケージ名 + ドット + クラス名です。
コードで使ってみましょう。
java.util.Scanner sc = new java.util.Scanner(System.in);
String name = sc.nextLine();
System.out.println("こんにちは、" + name);
ここでは java.util.Scanner を明示しています。プログラム内に別の Scanner という名前のクラスがあっても、コンパイラはどのクラスのことかを正しく理解できます。
これはとても重要です。クラス名は同じでも構いませんが、完全修飾名は常に一意です。
完全修飾名が必要な理由
たとえば、異なる 2 つの Date クラスがあるとします。
- java.util.Date(古い日付操作用のクラス)、
- java.sql.Date(データベース用の日付)。
もし単に次のように書くと:
Date d = new Date();
コンパイラはどの Date を使うのか分かりません。しかし完全修飾名で書けば:
java.util.Date d1 = new java.util.Date();
java.sql.Date d2 = new java.sql.Date(System.currentTimeMillis());
— 混同は起きません。
4. import 文
毎回クラスの完全修飾名を書くのは不便です。そのために Java にはimport 文があります。
次のように書くと:
import java.util.Scanner;
「このプログラムでは java.util パッケージの Scanner クラスを使います」という意味になります。これ以降は次のように短く書けます。
Scanner sc = new Scanner(System.in);
コンパイラは、それが java.util.Scanner のことだと理解します。
通常の import(単一クラス)
最も一般的な方法です。特定のクラスを指定します。
import java.util.Scanner;
import java.util.ArrayList;
これで Scanner や ArrayList といった短い名前で書けます。
パッケージ全体の import *
同じパッケージのクラスを多数使う場合には、次のように書けます。
import java.util.*;
これは「java.util パッケージ内のすべてのクラスを完全修飾名なしで使うことを許可する」という意味です。
この場合は次のように書けます。
Scanner sc = new Scanner(System.in);
ArrayList<String> list = new ArrayList<>();
ただし重要な注意:import java.util.*; はjava.util パッケージ内のクラスだけを対象とし、サブパッケージは含みません。例えば java.util.concurrent.ConcurrentHashMap は含まれないため、個別に import する必要があります。
import でできないこと
importはメソッドの中では使えません—ファイルの先頭にのみ書きます。importはクラスをメモリに読み込むものではありません。コンパイラにクラスの所在を教えるだけです。importは、同名のクラスが 2 つある場合に完全修飾名の代替にはなりません。
5. Classpath — Java がクラスを探す仕組み
Classpath は、プログラム実行時に Java がクラスを探す「経路」です。Java が必要な .class(.java をコンパイルしたもの)を探しに行くフォルダのリストだと考えてください。
通常、IDE は自動的に src(またはコンパイル後のクラスが入るフォルダ、例:out/production/ProjectName)を classpath に追加します。つまり、com.codegym.lesson05 パッケージにクラスを書いたなら、Java は次のパスでそれを探します。
out/production/ProjectName/com/javarush/lesson05/Main.class
IntelliJ IDEA における classpath の仕組み
- IDE からプログラムを実行すると、必要な classpath は自動的に設定されます。
- コマンドラインから実行する場合は、フラグ -cp または -classpath で明示的に classpath を指定する必要があります。
- プロジェクト内のクラスや追加ライブラリのクラスは、classpath に指定されたフォルダ内に存在していなければなりません。
6. プロジェクト内のコードの整理
1 クラス = 1 ファイル
Java では、各 public クラスをクラス名と同名の別ファイルに置くのが慣例です。例えばクラス名が Person なら、ファイル名は Person.java でなければなりません。
例:
src/com/javarush/lesson05/Person.java
package com.codegym.lesson05;
public class Person {
String name;
}
ファイル名とクラス名は一致させる
クラス名が MySuperClass の場合、ファイル名は MySuperClass.java でなければなりません。これは単なる気まぐれではなく、Java コンパイラの要件です。間違えるとコンパイル時にエラーになります。
リソース(画像、テキストファイル)はどこに置く?
- リソース用には通常、resources や res といった専用フォルダを作成します。
- IntelliJ IDEA では、そのフォルダを右クリックして Mark Directory as → Resources Root を選択できます。
- Java コードは
classpath経由でこれらのファイルにアクセスできます。
構成例:
MyFirstProject/
├── src/
│ └── com/javarush/lesson05/
│ └── Main.java
├── resources/
│ └── config.txt
8. プロジェクト構成でよくあるミス
フォルダ構成とパッケージの不一致
ファイルの冒頭に package com.codegym.lesson05; と書いてあるのに、ファイルが src/Main.java に置かれていると、コンパイラは "package does not exist" や "class not found" といったエラーを出します。フォルダ構成がパッケージ名に対応しているか、常に確認しましょう。
ファイル名とクラス名の不一致
クラスが Person なのにファイル名が People.java だと、"class Person is public, should be declared in a file named Person.java" というエラーになります。
パッケージを更新せずにファイルを手動で移動する
ファイルを別フォルダに移動したのに、package 行の更新を忘れると、プログラムはコンパイルできません。IDE の Project ウィンドウで操作しましょう—IDE が package を自動更新してくれます!
リソースが classpath に含まれていない
ファイル(例えばテキストファイル)を resources 以外に置き、そのフォルダを Resources Root としてマークしていない場合、classpath 経由では見つけられません。
GO TO FULL VERSION