脱・初心者!手続き型からオブジェクト指向へ
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.name の this は、「このインスタンス自身の」という意味です。「バナナ勇者」が攻撃する時は、「バナナ勇者自身の名前」を表示する、という指示になります。今は「自分自身を指す言葉」と覚えておけば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にされたくない!」 そんな時に役立つ、オブジェクト指向の重要な要素「カプセル化」についてお話しします。お楽しみに!

