Java | Java 標準ライブラリ:java.lang パッケージ概要

Java Java
スポンサーリンク

java.lang パッケージとは何か

java.lang は、
「Java でプログラムを書くときに、ほぼ必ず使う“基本中の基本”がまとまったパッケージ」
です。

特徴として

import を書かなくても、勝手に使える
文字列、数値、スレッド、例外などの“言語レベルの基本要素”が入っている
Java を書くうえで「空気」のように存在している

という位置づけです。

なので、java.lang をざっくりでも把握しておくと、
「これは標準でこういうクラスがあるんだ」と迷わなくなります。

ここでは、特に初心者がまず押さえておきたい主要なクラス・インターフェースを、
例を交えながら丁寧に解説します。


Object クラス:すべての親玉

すべてのクラスの大元

java.lang.Object は「すべてのクラスの親クラス」です。
自分でクラスを書くとき、extends を書かなくても、暗黙的に Object を継承しています。

public class User {
    // 実は Object を継承しているのと同じ
}
Python

だから、どんなクラスも最低限 Object が持っているメソッドを使えます。

代表的なのが

toString()
equals(Object obj)
hashCode()
getClass()

などです。

toString と equals の意味(重要)

初心者のうちに特に意識してほしいのは toStringequals です。

toString() は「そのオブジェクトを文字列として表現するときに呼ばれる」メソッドです。

User user = new User("Taro");
System.out.println(user);           // → 内部的には user.toString() が呼ばれる
Python

自分のクラスで toString() をオーバーライドすると、デバッグやログが一気に見やすくなります。

@Override
public String toString() {
    return "User{name=" + name + "}";
}
Python

equals(Object obj) は「このオブジェクトと、引数のオブジェクトが“等しい”かどうか」を判定するメソッドです。
値オブジェクト(Money, EmailAddress など)を作るときは、equalshashCode を正しくオーバーライドするのが超重要になります。

Object は「オブジェクトとしての最低限の性質」を提供するクラスだ、
と認識しておくと良いです。


String クラス:文字列のど真ん中

文字列は全部 String

java.lang.String は「文字列」を表すクラスです。

String name = "Taro";
String message = "Hello, " + name;
Java

Java では、
シングルクォート 'a' が char(1文字)、
ダブルクォート "abc" が String(文字列)です。

String がイミュータブルであること(重要)

String は「イミュータブル(不変)」です。
一度作られた String の中身(文字列)は、あとから変更できません。

String s = "hello";
s.toUpperCase();             // "HELLO" を返すが、s 自体は変わらない
System.out.println(s);       // hello
Java

toUpperCase()replace() などは、
「元の String を変える」のではなく「新しい String を返す」ことに注意してください。

String upper = s.toUpperCase();
System.out.println(upper);   // HELLO
Java

この性質は、マルチスレッドでも安全に使える・hashCode の扱いが安定する
など、多くの場面で効いてきます。

よく使うメソッドのイメージ

String s = "abcde";

int len = s.length();           // 5
char c = s.charAt(0);           // 'a'
boolean b = s.startsWith("ab"); // true
String t = s.substring(1, 3);   // "bc"
Java

String は本当に出番が多いので、
「イミュータブル」「メソッドは新しい String を返す」だけは頭に置いておくと迷いません。


ラッパークラス:int などの“オブジェクト版”

基本型と参照型の橋渡し

java.lang には、プリミティブ型(基本型)の“ラッパークラス”が用意されています。

intInteger
longLong
doubleDouble
booleanBoolean
…など。

int n = 10;
Integer boxed = Integer.valueOf(n);  // int → Integer
int unboxed = boxed.intValue();      // Integer → int
Java

Java 5 以降はオートボクシング/アンボクシングがあるので、たいていは暗黙的に変換してくれます。

Integer boxed2 = 10;    // 自動で int → Integer
int n2 = boxed2;        // 自動で Integer → int
Java

どんなときに必要になるか(重要)

ラッパークラスが必要になる代表的な場面は

コレクションで扱うとき(List<int> は書けないので List<Integer>
null を扱いたいとき(基本型は null を取れない)

です。

例えば

List<Integer> list = new ArrayList<>();
list.add(10);   // OK。Integer に自動変換
Java

プリミティブ型は軽量で高速ですが、
「コレクションに入れたい」「null を扱いたい」といった場面では
ラッパークラスにしておく必要があります。


Math クラス:数学系の便利屋

数学関数の“まとめサイト”

java.lang.Math は、
「よく使う数学系の処理」を静的メソッドで提供するクラスです。

すべて static メソッドなので、new はしません。

int abs = Math.abs(-10);       // 10
double pow = Math.pow(2, 3);   // 8.0
double sqrt = Math.sqrt(16);   // 4.0
double max = Math.max(5, 9);   // 9
Java

実務でよく使うイメージ

小数の切り上げや切り捨てもよく使います。

double x = 3.7;
double floor = Math.floor(x);  // 3.0
double ceil = Math.ceil(x);    // 4.0
long round = Math.round(x);    // 4(四捨五入)
Java

乱数は Math.random() もありますが、
本格的には java.util.Randomjava.util.concurrent.ThreadLocalRandom を使うことが多いです。
最初は「Math に最低限の数学関数がまとめてある」と覚えておけば十分です。


System クラス:標準入出力や環境への窓口

標準出力・エラー出力

java.lang.System は、「システム全体(JVM)の入口」のようなクラスです。

一番よく使うのは System.outSystem.err でしょう。

System.out.println("こんにちは");       // 標準出力
System.err.println("エラーです");     // 標準エラー出力
Java

System.outPrintStream 型で、println などのメソッドを持っています。

現在時刻や環境変数

他にも、現在時刻(ミリ秒)や環境変数なども取れます。

long millis = System.currentTimeMillis();       // エポックからのミリ秒
String javaVersion = System.getProperty("java.version");
Java

System は「JVM や OS の情報を覗きたいとき」に使うイメージでいてください。


Thread・Runnable:スレッドの基礎

Runnable と Thread の関係(ざっくり)

java.lang.Runnable は「run という処理を持つもの」というインターフェースです。

public class MyTask implements Runnable {
    @Override
    public void run() {
        System.out.println("別スレッドで実行中");
    }
}
Java

これを Thread に渡して動かします。

Runnable task = new MyTask();
Thread thread = new Thread(task);
thread.start();    // 新しいスレッドで run が実行される
Java

今どきは ExecutorServicejava.util.concurrent)を使うことも多いですが、
Thread / Runnable は「スレッドの入り口」として覚えておく価値があります。

初心者の段階では、
Runnable = 実行したい処理
Thread = それを別スレッドで動かす器」
くらいの理解で十分です。


例外関連:Throwable / Exception / RuntimeException

例外階層の一番上が Throwable

java.lang.Throwable が「すべての例外・エラーの大元」です。
その下に ErrorException がぶら下がります。

Exception の下には、さらに

チェック例外(IOException, SQLException など)
非チェック例外(RuntimeException とそのサブクラス)

があります。

例えば自作の例外は、だいたい ExceptionRuntimeException を継承します。

public class BusinessException extends RuntimeException {
    public BusinessException(String message) {
        super(message);
    }
}
Java

初心者がまず押さえるポイント

チェック例外は「throws を書くか try-catch で捕まえないとコンパイルエラー」になる例外です。
非チェック例外(RuntimeException)は、コンパイル時に強制されません。

public void readFile() throws IOException {
    // チェック例外なので throws が必須
}
Java
public void doSomething() {
    if (somethingWrong) {
        throw new IllegalStateException("状態がおかしい");  // RuntimeException の一種
    }
}
Java

細かいルールは後からでよくて、
「例外関連の親クラスも java.lang にいる」
RuntimeException を投げるときは、本当にそれでいいか一度考える」
くらいを意識しておくとよいです。


そのほか知っておくと嬉しいクラス・インターフェース

StringBuilder / StringBuffer

String はイミュータブルなので、
何度も連結するときは StringBuilder を使うほうが効率的です。

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString();     // "Hello World"
Java

大量連結やループの中での連結では、+より StringBuilder が推奨されます。

Enum

java.lang.Enum は列挙型の親クラスです。
普段は enum を使う形で触れます。

public enum UserStatus {
    ACTIVE,
    INACTIVE,
    BANNED;
}
Java

enum 自体はキーワードですが、実際には Enum を継承したクラスとして扱われます。


まとめ:java.lang をどう捉えればいいか

java.lang

Java プログラムの「土台」にあたるクラス・インターフェースが詰まったパッケージ
import なしで常に見えている
Object / String / ラッパークラス / Math / System / Thread / 例外あたりが特に重要

という位置づけです。

最初からすべてを暗記する必要はありません。
むしろ、

「文字列まわりで何かしたい → String, StringBuilder を調べてみる」
「数値をオブジェクトで扱いたい → Integer, Long などを調べる」
「例外やスレッドに触れたくなった → java.lang の中に何があるか見てみる」

という感じで、「困ったときに戻ってくる“道具箱”」として少しずつ馴染んでいけば十分です。

タイトルとURLをコピーしました