オブジェクト指向の入門1

2023/08/23に公開

はじめに

オブジェクト指向プログラミングを理解するには、プログラミングの基本構文は前提として、モノやヒトなどが影響し合う世界を適切にイメージできることが大切だと思う。これは特別な世界の話をしているわけではなくて、自分自身が今生活しているこの世界をイメージすれば良い。行動を起こせば身のまわりのモノやヒトに影響を与えている。「ジュースを一本買う」という単純な行動も、相手や対価がなければ取引が成立しない。何気なく行っている行動はモノやヒトが互いに影響し合っていること。それを感じるところがオブジェクト指向の重要なポイントだと思う。

オブジェクト指向

オブジェクト指向プログラミングは、僕らの生活や行動をコンピュータプログラムで表現しやすくするための機能が揃ったもの。僕らが抱える課題はオブジェクト指向プログラミングで適切に表現することができる。課題解決にコンピュータをスムーズに使うことができるようになる。
処理で扱う対象を単に数値や文字として扱うのではなく、モノとして扱う。理解出来ればソースコードは書きやすくなるし、読みやすくもなる。

Java

ソースコードの例などにJava言語を採用するが、別にJava言語にこだわりはない。PHPでも良かったし、オブジェクト指向言語であれば考え方は近いと思うのでとりあえずJava言語を選択しました。

public class Story{
  public static void main(String[] args){

  }
}

属性

数値や文字という情報を改めて考えて見る。これらの情報が身のまわりに意味も無く転がっていることは少ない。例えば、目の前に「180」という数値があったとしたならば、僕は「この数字は何の数字だろうか?身長?値段?何の?」というように考える。要するに、数字や文字などの情報はモノの属性の値として存在していることが多いということ。「180」という値は僕(ヒト・モノ)の体重(属性)の値であるという感じで情報は存在している。

BMIを計算するようなソースコードで表現すると以下のように違いが出る。
大した違いは感じられないかもしれないけれど、後者では身長や体重がヒトの属性値である事が明確になる。

オブジェクト指向じゃない書き方
  double weight = 80.0;
  double height = 1.8;

  double bmi = weight / (height * height);
オブジェクト指向の書き方
  person.weight = 80.0;
  person.height = 1.8;

  double bmi = person.weight / (persion.height * person.height);

オブジェクト指向で書かれたプログラムを読むとき「.(ドット)」は「の」や「が」と読むと自然で読みやすい。

オブジェクト指向の書き方(コメントあり)

  //ヒト(person)の体重(weight)が80.0(kg)
  person.weight = 80.0;
  //ヒト(person)の身長(height)が1.8(m)
  person.height = 1.8;

  //BMIは
  //体重(person.weight)を
  //身長(person.height)の二乗で割れば良い
  double bmi = person.weight / (persion.height * person.height);

クラス・クラス定義

属性はモノに備わった性質や特徴を指したもので、属性があると言うことは、属性を持ったモノが必ず存在することになる。例えば、体重や身長という値が属性外の状態で存在するということは少ない。体重や身長は人間(モノ)が持つ特徴の一つという感じで属性は存在する。しかし「人間は体重や身長という属性値を持つ」という常識は僕らの世界の常識であって、コンピュータには通じないし、理解出来ない。そこで、オブジェクト指向プログラミングではクラスを定義するという手順が必要になる。要は「人間は体重や身長という属性値を持つモノ」という認識をコンピュータと共有する為の手続きだと考えれば良い。具体的には以下のようなPerson.javaという定義用のファイルを用意することになる。

Person.java
public class Person{
  double weight;
  double height;
}
Run.java
public class Run{
  public static void main(String[] args){
    //Person.javaで定義に従って、
    //コンピュータは体重(weight)と身長(height)を属性として持つ、
    //人間(Person)を生成(new)する。
    Person p1 = new Person();

    p1.weight = 80.0;
    p1.height = 1.8;

    double bmi = p1.weight / (p1.height * p1.height);
  }
}

new演算子

new演算子はクラス定義から実体を生成するときに使う演算子。クラスを料理のレシピに置き換えて考えてみる。

  • お腹が空いたとき、ハンバーグを食べたいとする。
  • 好みのハンバーグのレシピを探しだし、調理をする。
  • 結果として出来上がったハンバーグ。
  • このハンバーグこそが実体と言うことになる。

クラスはあくまでも、特徴をまとめた定義書にすぎない。要はレシピ。new演算子を利用することで定義書から、実体が生み出され存在するようになる。同じクラスから生成された実体は、全て同じ特徴を持っていることも重要。これは、同一のレシピで作られた料理がいつでも同じ味で出来上がることと同じ。

Discussion