変数の型でプリミティブ型と呼ばれるワードが出てきますが、なんてことない従来の昔からある変数の型のことです。
なんでそんなワードが出来たのかといえば、従来の型とはちがうオブジェクト型が登場したから。
オブジェクト指向言語がメジャーになったから出てきた言葉。
プリミティブ型は昔からある基本型
プリミティブ型を一言で言えば、クラスオブジェクトじゃないデータの型。
int, short, long, float, double, char などのこと。言語によっては byte, boolean もありますね?
primitive は『原始的な。素朴な。』などの意味で、そこから基本型とも言われます。
クラスを使ったプログラミング言語がどこでも見られメジャーになったのは2000年代に入ってから。JavaやC++が大きく貢献しました。
オブジェクト型という考え方自体が後発組です。
なので、先発組のデータ型のオブジェクト型に対してそれ以前から使われた一般的な型をプリミティブ型と呼ぶようになりました。
プリミティブ型は先発のグループ名みたいなものですが、オブジェクト型もグループ名です。
オブジェクト型はクラスそのもの。クラスはそれ自体がデータ型。
クラスはそれ自体がデータの型です。オブジェクト指向言語では、クラスの数だけオブジェクト型の型があります。
今では、PHPやJavaScriptなど、クラスでプログラミングしそうにないものの公式ドキュメントでもプリミティブ型というワードが出てきます。
それだけ、クラスでプログラミングするのが浸透したということ。
WordPressの有名なプラグインはクラスベースで書かれてるし、JavaScriptもReactなどのフレームワークではクラスが多用されてます。
Pythonだってクラスを使います。
Pythonは特殊で、従来の型のプリミティブという発想がない。
そもそも変数の型を宣言しない。
一応、int, stringなどプリミティブ型と同様の型をもっているが、それもオブジェクトの一種。
公式ドキュメントでは、プログラムコード自体がオブジェクトになるくらいオブジェクトベースでできていると言ってるほど。
オブジェクト指向言語の代表格、C++, Javaよりも純粋なオブジェクト指向言語とも言える。
Python における オブジェクト (object) とは、データを抽象的に表したものです。Python プログラムにおけるデータは全て、オブジェクトまたはオブジェクト間の関係として表されます。(ある意味では、プログラムコードもまたオブジェクトとして表されます。これはフォン・ノイマン: Von Neumann の "プログラム記憶方式コンピュータ: stored program computer" のモデルに適合します。)
オブジェクト指向では書く量も多いし覚えることもそれなりにあるので、初心者を中心に避ける人がいますが、もう逃れようがありません。
クラスは必要な情報を必要なときだけ公開する情報隠蔽が基本に設計されているのでセキュリティ的にも強いし。
プリミティブ型 | int short long float double char boolean byte などがある言語もある。 |
オブジェクト型 | クラスのこと。 用意されたクラスに加え、自作した クラスの数だけデータ型がある。 |
String型はプリミティブではなくオブジェクト型
Javaでは文字列変数の型としてStringを使いますが、これはプリミティブではありません。Stringというクラスの型です。
Stringは直接リテラル文字列を代入することができます。
String str1 = "sample1";
String str2 = null;
str2 = str1;
これがプリミティブに見えてしまうんですが、内部では new String() を使ってインスタンスを作成して変数に代入しています。
Stringは頻繁に使うので、プリミティブのように代入できるように設計されてる。
親切な設計なんですが、かんちがいしやすい。
ちなみにJavaには、プリミティブ型のデータを管理する、Integer, Short, Long, Byte, Boolean, Float, Doubleなどのクラスがあります。
これらのクラスはかんたんに型変換(byte -> int, int -> Stringなど)できるメソッドが用意されているので便利。
JavaScriptにもStringというクラスがある。これも文字列を扱うオブジェクト型。
ただしJSでは、リテラル文字列をString型変数に代入できない。変数の型がゆるいので、その時点で型変換が起きるから。
JSでは、new String() でインスタンス生成を明示しないといけない。