クラス

Javaなどのオブジェクト指向言語で最も基本的な概念はクラスです。
これを一言で説明するのは難しいので、まずはクラスという概念が生まれた経緯から紐解いていきます。

クラス

クラスはJavaを初めとするオブジェクト指向言語で、プログラムを構成する最小の単位です。
これはそれまでのプログラミング言語をより使いやすくする過程で生まれました。

複数の値をまとめて扱いたい

アプリケーションを作るにあたって、データ(値)がint型など1つの型で表現できることは稀です。
例えば、従業員データを処理するアプリケーションがあるとすれば、従業員名だけではなく従業員番号などの様々な値をまとめて扱えば効率よくアプリケーションを作成できます。
C言語では「配列」や「構造体」という仕組みを使い、ある一定のメモリ領域を1単位として扱うことで実現していました。
しかし、プログラマにはメモリの管理を意識する必要が生まれ、ポインタと呼ばれる仕組みがプログラマを悩ませます。
そして、何でもできるが故の問題を多く含んでいました。

同じ名前の変数や関数を使いたい

C言語では処理はmain関数から始まり、様々な関数を呼び出しながら実行されていきます。
しかし、関数には同じ名前を付けることができないという制限があった為、似たような関数でもcalc01, calc02などと連番を付けて区別せざるを得ません。
プログラムが小規模であれば良いのですが、数万ステップというプログラムになると関数名の管理だけで頭が痛くなります。

また、短い関数であれば良いのですが、長い関数になると変数名が足りなくなってくることもあります。
同じnameという変数名で使いたいのにも関わらず、型が異なれば使いまわすこともできません。

関連する処理はソースコードも近い方がよい

関連する処理はソースコードが近くにあった方がメンテナンスする上で便利です。
C言語などでは分割コンパイルという機能でファイルを分割することでメンテナンス性を高めていましたが、言語レベルでのルールではなく各プログラマに依存したものでした。
巨大なソースファイルは当然ながら可読性が低くなり、どこに何が書いてあるのかを探すだけでも骨が折れます。

このような中で「もっと解りやすくソースコードをまとめられないか?」となります。
構造体のように一まとまりのデータとして扱え、変数のように簡単に初期化でき、メモリ管理も不要であれば…と。
クラスはそんなプログラミング言語の進化の中で必然的に生まれてきた概念なのです。

クラスを一言で説明するならば「同じデータや機能をまとめたグループ」であると言えます。
入門書の中には「クラスとは"もの"の持っている性質(データ)や機能をまとめたもの」と定義している事がありますがそれは誤解の元ですから注意してください。
間違いではないのですが、同じようなデータや機能をまとめたのがクラスであり、結果として"もの"を表現できるのです(また、抽象的であり"もの"であるか微妙なクラスは幾らでもあります)。

クラス名

クラスの名称、すなわちクラス名は一般的にクラスを意味する英単語(名詞)でパスカルケースという記法を用いて表記するのが慣例となっています。
パスカルケースとは、先頭を大文字で表記して、複合語の場合には頭文字も大文字として記述するフォーマットです。
例) Shop, PetShop, FoodShop, JapaneseFoodShop ・・・

パッケージ

クラスとは同じようなデータや機能をまとめたグループですが、同じような用途のクラスは同じ名前になる可能性が高いとも言えます。
例えば、A社の従業員情報をまとめたクラスは、B社の従業員情報をまとめたクラスと似ていますが、細部が異なるかもしれません。
つまり、どちらも従業員番号と氏名などを持っている事は共通するのですが、A社ではクラブ活動が盛んな為にクラブというデータを持たせているかもしれません。
しかし、2つの会社で別途に従業員クラスを作ったとなれば、どちらも「Employee」という名前でクラスを定義している可能性は高くなります。
もし、2つの会社が合併することになり、従業員を扱うアプリケーションを統合することになったならば「Employee」クラスは名前が競合してしまいます。
とは言っても、合併などは「Employee」クラスを作るときには考えてもいませんでした。

そこで、パッケージという概念をJavaでは導入しています。
パッケージは名前空間という概念をクラスに適用したものです。

名前空間(なまえくうかん)はNamespaceの訳語で、名前の集合を分割することで衝突の可能性を低減しつつ参照を容易にする概念である。

http://ja.wikipedia.org/wiki/%E5%90%8D%E5%89%8D%E7%A9%BA%E9%96%93

つまり、クラスの正式な名称は「A社.Employee」と「B社.Employee」といった形とすることで、名前の衝突(競合)の可能性を低くしました。

また、パッケージ構造はファイルのフォルダ構造と同じとすることで、ソースファイルの整理できるというルールを設けます。
アプリケーションが巨大になればソースコードの量も増えクラス単位に分割していけば、個々のソースコードは少なくなりますがソースファイルの数は増えていきます。
ドキュメントを分類ごとにわけて整理するようにソースコードもパッケージ単位で分けて置けば、目的のソースコードも検索しやすくなります。
もし、アプリケーションの統合を行ったとしても、ソースコードは別のパッケージ(フォルダ)にあるならば、簡単に同じ場所で管理できるようになるでしょう。

つまり、パッケージはクラスを整理するための仕組みです。