🧩

結局オブジェクト指向って、なあに?

2023/06/07に公開

プログラミングの壁のひとつ

「オブジェクト指向ってなあに?」 というのは、プログラミングを学び始めると必ず当たる壁のひとつです。
それの一つの解釈を、まだいまいちピンと来ていない方々にお伝えします。

でもぶっちゃけ、分からなくてもコード書ければ生きていけます。
私もコード書いてて、後から分かった人間だし。

要は「~のようなもの」という"考え方"

おそらく一番よく聞く説明は、 『すべての数値・文字列・・・、そういったものをオブジェクトとして扱う』 みたいな。
いや、初学者がそれでわかるかい。

前もって色々説明してもいいですが、見たほうが早いです。
実例を見てみましょう。

くらべてみよう

C言語(オブジェクト指向でない)

オブジェクト言語ではない C言語 では、"文字列"は次のように作ります。

char name[] = "Unico417";
// これは文字列

Unico417という文字を、nameという変数に入れました。
C言語が分からない方は、配列に文字が1文字ずつ入っていると思ってください。

では、この文字列をすべて大文字にしたい場合はどうすればいいでしょうか。

char nameUpper[8]; // 大文字の結果を入れる変数
int i; // ループカウンタ

// ループで1文字ずつ大文字に変換
for( i = 0; i < 8; i++){
    nameUpper[i] = name[i] + 32;
}

これで、文字を変換することができました。
当然ですが、自分で文字を変換する必要がありますね。

Python(オブジェクト指向)

では、今度はPythonで"文字列"を作ってみましょう。

name = 'Unico417'
# これは文字列...?

C言語と同じように、'Unico417'という文字列を作ることができました。
・・・なんだか、コメント文の雲行きが怪しいですね。

では、これを大文字にしましょう。

nameUpper = name.upper()
# 文字が持つupper()という処理を使う
#   --> 戻り値は大文字の自分自身

おっと・・・・・・?

文字列処理を持っている・・・・・・?
あんたは文字でしょ?

起こってること

実は最初のname = 'Unico417'で 作られたのは、文字列のデータと共に様々な処理を持つ 「文字列のようなもの」 なんです。
もちろん、文字のデータも持っています。

その作られたものを、読み出したり足したりするなら、そのデータが直接使われます。
でもそれとは別に、様々な処理ももっています。
小文字にするlower()、文字を置き換える.replace()...など。
「それらの付属の処理をひっくるめて、データと一緒に扱う世界としましょう。」 という 考え方 です。

その考え方の世界戦で生まれた言語たちは、文字も数値もぜーんぶ、それ自体のデータ以外のなにかをたくさん持っています。
言語によっては、さらにその文字列や数値たちが持つ処理を追加・拡張・置換できたりします。
それはもう、やりたい放題。 便利ですね。

おまけ:"のようなもの"は変数に入る

こうなると、処理をまとめた 関数 も「のようなもの」になるので、文字列と同様に変数にいれることができます。

me = 'Unico417'

# 関数を作る
def call_name(name):
    print(f'Hey, {name}!')

# 変数に関数を入れる
say_name = call_name

# 変数に入った関数を呼び出す
say_name(me)
# >> Hey, Unico417!

関数は処理のかたまりですが、それを「のようなもの」という扱いにして、変数に入れたり引数に渡したりできます。

Discussion