🙆

【入門】オブジェクト指向言語とクラス設計の超簡単まとめ

2022/09/09に公開

はじめに

最近、自分が学び始めの時はクラス、コンストラクタ、オブジェクトなど横文字などが多くよくわからんかったなーと思い出し、変数やUI構築を学ぶ前に一番最初にオブジェクト指向の全体像をもっと把握しておくべきだったと思っているのでそんな方向けに書いた。友達もIT業界就職したい友達も多いし見て損はないと思われる。
オブジェクト指向言語の中でもJavaで以下解説している
参考記事

対象読者

オブジェクト指向がよくわからない人向けです。また、値オブジェクトやクラス設計のルール、可読性の勉強をしたい人向けにも役に立つかもしれない。ちなみに僕は値オブジェクトの重要性を痛感し、この記事を書こうと思った。

オブジェクト指向とは

「ある役割を持ったモノ」ごとにクラス(プログラム全体の設計図)を分割し、モノとモノとの関係性を定義していくことでシステムを作り上げようとするシステム構成の考え方のこと。
参考記事

ん〜抽象的い。。。

要は

「役割ごとに設計書(クラス)を作成し、そのコピー(オブジェクト/情報が詰まった実態)をつくってシステムを完成させる

ことがオブジェクト指向の基本概念。
(その「役割ごと」ってのを色々な概念ごとにまとめて、適切な範囲でクラスとして作るのがドメイン駆動設計とか関心の分離とかって言われる部分で、そこまで完璧にクラス設計できてやっとバグの少ない堅牢なクラスになる。が少し難しい話なので割愛。)

イメージ図引用元

以下では
前半戦(クラス設計)

  • フィールド変数
  • メソッド(セッター/ゲッター)
  • コンストラクタ
  • クラス

さらに、後半戦(クラスを実体化)

  • インスタンス化
  • オブジェクト

に分け、
それぞれ言葉の意味と内容を確認することによってオブジェクト指向の理解を深める。(確かに横文字多いわ、、)


前半戦:クラス(設計書)の中に設置するもの

  • フィールド変数(扱うデータ)
  • メソッド(行う処理)
  • コンストラクタ(データに初期値を与える)

クラスとは

  • データ(フィールド変数)と処理(関数・メソッド)をまとめた設計書Class User()的なやつ

イメージ図

1. フィールド変数とは

  • クラスで扱うデータ(メンバ変数ともいい、数字、名前、色など。private String name;的なやつ)

2. メソッドとは

  • クラスで行う処理(関数とほぼ同義、public String getName(){}的なやつ)
    • クラスのフィールド変数の値を使う (取得する)メソッドを「ゲッターメソッド」と言う
    • クラスのフィールド変数の値を渡すメソッドを「セッターメソッド」と言う

3. コンストラクタとは

  • クラスのフィールド変数に入れる値を初期化する(this.name = name;的なやつ)

Sample Code

public class Color 
    private String color;
     //①:フィールド変数(扱うデータ。この時点ではまだ単なる「変数入れる箱」同然)
     //だから初期化が必須なのである

    public Color(String color){
      this.color = color;
    }//③:コンストラクタ(初期化し、めでたく値がセットされた状態)

    public String getColor() { //②:メソッド(ゲッターメソッド。値を取り出し、戻り値として返す役割)
    	String moji = "色は"; //変数
        return moji + color; //コンストラクタで初期化し、やっとここで使用可能
    }
    public void setColor(String color) { //②:メソッド(セッターメソッド。値を引数 String color の部分に値を渡す役割)
        this.color = color;
    }
}
Color("Green"),//インスタンスの右辺の部分。詳しくは後半に

的な感じでクラスの中(いわゆる引数)に値を与えると、

③のインスタンス化(String color)の部分で初期化完了し、
①の箱に"Green"が詰め込まれ、
んで②のメソッドの部分で使って処理に参加させれる。


後半戦:クラス(設計書)を実体化(インスタンス化)する

そもそも設計書(クラス)を書いただけでは何の意味もなくそれを情報として箱に詰め込んで(実体・インスタンスにして)取り出せるようにするのが大事。

1. インスタンス化とは

  • クラス情報(フィールド変数、メソッド)を実体(インスタンス)として詰め込むこと。

  • その詰め込まれた「箱」を「インスタンス」と呼ぶ
    (「オブジェクト」と呼んでも差し支えはないと思う)

実際は

  • クラスオブジェクト:クラス定義を抜けると生成されるオブジェクト。
  • インスタンスオブジェクト:クラスオブジェクトからインスタンス化されるオブジェクト。

って定義らしいけどまあ大丈夫。と言うのも
(定義域的には 「インスタンス」 < 「オブジェクト」 なんだけど、最初は同値(=)で認識してて良いと思う。以下解説)

詰め込む方法

クラス名 インスタンス名 = new クラス名();

とする。

Sample Code

Color maincolor = new Color("Blue");//引数が必須じゃなければ"Blue"は無くてもOK。

こんな感じ。

2. オブジェクトとは

  • オブジェクト指向では、クラスのインスタンスのことをオブジェクトといいます。

参考記事

  • クラスオブジェクト:クラス定義を抜けると生成されるオブジェクト。
  • インスタンスオブジェクト:クラスオブジェクトからインスタンス化されるオブジェクト。

参考記事

的な記事が散見されますが、一旦は

「オブジェクト」 = 「インスタンス」

でOK。
上のSample Codeをもう一度。

Color maincolor = new Color("Blue");
// 結論:「mainColorインスタンス」「mainColorオブジェクト」どちらでも良い。

インスタンスからメソッドやフィールド変数を取り出して使用する例

その前に

  • インスタンスから取り出した変数:インスタンス変数
  • インスタンスから取り出したメソッド:インスタンスメソッド

と言う。

使用法

インスタンス名.インスタンス変数名
インスタンス名.インスタンスメソッド名
public class Main {
    public static void main(String name) {
        Color maincolor = new Color();//インスタンス化(実体化)
        exRobot.color = "Blue"; //インスタンス変数colorに"Blue(String)"を代入
        System.out.println(exRobot.color);//コンソールに出力
    }
}

出力

Blue

イメージ図

総括

1. クラスを設計

2. クラスをインスタンス化して情報を詰め込んだ「インスタンス(オブジェクト)」を作る

3. インスタンスから、変数・メソッドを取り出す



このループをし続けるのがオブジェクト指向の基本。個人的には「インスタンス指向」的に言うてもええんちゃうかなとか思う。

細かいクラス設計は少し難しい(関心の分離やデータクラスはだめ、など)ので書籍で学習した方が早い。

参考書籍:「良いコード悪いコードで学ぶ設計入門」



以上です。間違えが見つかり次第、或いは知識がアップデートされ次第改訂していきます。🙏

「オブジェクト指向徹底解説 Java」を大変参考にしました

GitHubで編集を提案

Discussion