【Java入門】プロがやさしく解説!クラスとインスタンス

脱・初心者!手続き型からオブジェクト指向へ

Javaの学習を始めて、誰もが一度はぶつかる大きな壁……それが「オブジェクト指向」です! 「クラス?」「インスタンス?」「設計図って何のこと?」と、頭がパンクしそうになっている方も多いのではないでしょうか?

今日は、現場で毎日Javaのコードを書いているエンジニアの視点から、オブジェクト指向の「はじめの一歩」を、世界一わかりやすく解説していきます!

オブジェクト指向を学びたての頃、よくやってしまうのが「全部 main メソッドに詰め込んでしまう」ことです。これがいわゆる「手続き型」の書き方です。

惜しいコード(手続き型)

一つの場所(mainメソッド内など)に、HPの計算、名前の表示、攻撃の処理など、全ての処理をダラダラと書いてしまう状態です。

問題点: キャラクターが1人なら良いですが、敵が増えたり、村人が増えたりするたびにコードがスパゲッティのように絡み合い、修正が怖くてできなくなります。

オブジェクト指向な考え方

「勇者」「モンスター」といった「役割」ごとに型(クラス)を作り、それぞれのデータや処理は自分たちで管理させる考え方です。

ポイント: オブジェクト指向とは、「モノ(オブジェクト)」を中心にプログラムを組み立てる考え方のことです。 よく「金型(クラス)とたい焼き(インスタンス)」や「設計図(クラス)と車(インスタンス)」に例えられますね!

Javaの基礎:クラス(設計図)とインスタンス(実体)

それでは、実際にRPGの「勇者」を例にして、Javaのコードを見てみましょう。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// 1. クラス(設計図)の定義

class Hero {

// フィールド(属性・状態)

String name;

int hp;

// メソッド(操作・振る舞い)

void attack() {

System.out.println(this.name + " の攻撃!");

}

}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// 2. クラスを使う(実体化)

public class Main {

public static void main(String[] args) {

// 設計図から実体を生み出す!

Hero myHero = new Hero(); // インスタンス化

// 実体に具体的な情報を入れる

myHero.name = "バナナ勇者";

myHero.hp = 100;

// 実体に命令する

myHero.attack();

}

}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

コード解説:クラス定義からインスタンス化まで

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// これが「勇者とはこういうものだ」という設計図(クラス)です。まだ実体はありません。

class Hero { }

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// これらをフィールド(変数)と呼び、そのモノの状態(名前や体力)を保持する場所です。

String name;

int hp;

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// これらをメソッドと呼び、そのモノができるアクション(攻撃する)を記述します

void attack() { ... }

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ちょっと深掘り:「this」って何?

> this.namethis は、「このインスタンス自身の」という意味です。「バナナ勇者」が攻撃する時は、「バナナ勇者自身の名前」を表示する、という指示になります。今は「自分自身を指す言葉」と覚えておけばOKです!

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// インスタンス作成

Hero myHero = new Hero();

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ここが最重要! new という呪文を使うことで、設計図から実体(インスタンス)を生み出しています。メモリ上に「バナナ勇者」という実体が誕生した瞬間です!

SE視点での活用例:実際の仕事ではどう使う?

「勇者のコードはわかったけど、仕事で勇者は作らないよね……?」と思ったあなた。鋭いですね! 実際の開発現場(バッチ処理やWebシステム)では、こんな風に使われています。

1. ユーザー情報の管理(Webシステム)

Webサイトのログイン機能などでは、「Userクラス」を作ります。

フィールド: ユーザーID、パスワード、メールアドレスなど

メソッド: パスワードが正しいかチェックする、プロフィールを更新するなど

DBから取得した数万人分のデータを、バラバラの変数ではなく、一つひとつの「Userオブジェクト」として扱うことで、直感的にコードが書けるようになります。

2. CSVファイルの読み込み(バッチ処理)

100万行あるCSVデータを処理する際、1行分のデータを「Recordクラス」として定義します。

「1行読み込む → Recordオブジェクトにする(その際にデータの不備を自己チェックさせる) → 処理する」

という流れにすることで、データ自身が「自分は正しいデータか?」を判断できるようになり、「どのデータがなぜエラーになったか」の管理が格段にしやすくなります。

 現場の裏話:命名は「命」です

現場に入って驚くのは、クラス名や変数名にめちゃくちゃこだわることです。「勇者」なら Hero でいいですが、実務の複雑な処理では UserRegistrationService(ユーザー登録処理を担当するクラス)のように、パッと見て役割がわかる名前にします。「とりあえず a とか temp」で変数を作ると、先輩から「これ、1年後の自分が読んで意味わかる?」と指導が入ることもよくあります。。。

 まとめと次回予告

オブジェクト指向は、一度にすべてを理解しようとしなくて大丈夫です。 まずは「設計図(クラス)を作って、実体(インスタンス)を new するんだな」という感覚を掴んでみてください。

これができるようになると、大人数での開発がグッと楽になり、エンジニアとしての楽しさが倍増しますよ!

次回は……

「せっかく作った勇者のHPを、外部から勝手に0にされたくない!」 そんな時に役立つ、オブジェクト指向の重要な要素「カプセル化」についてお話しします。お楽しみに!