支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡

  • TOP
  •   
  • コラム
  •   
  • 【Java】オブジェクトとは?~イン

はじめに

本記事では、Javaを学習されている方へ向けた「オブジェクトについて」を解説していきたいと思います。学習する中で、ネットや書籍など様々なツールで学ぶことが可能ですが、オブジェクトやインスタンス、クラスの概念に抽象的な例えなどが使われる事が多いため、なんとなく曖昧なイメージのまま学習が進んでしまい、その違いが分からないことが多々あるかと思います。実際、この記事を書く前に日本や外国のいくつかの質問箱サイトを確認しましたが、やはりその概念の曖昧さ故に様々な異なる意見が飛び交っていることを知りました。ただ、現実的に見てもこの「オブジェクト」というワードは、開発の現場などでもかなり曖昧な使い方をされているため、いかにその意味が説明の難しいものであるかが窺えます。ここでは、そんなオブジェクトがどんな意味をもっているものなのか、少しでも参考にしていただければ幸いです。

最初に申しておかないといけないことは、オブジェクトはとても概念的なもので、実体的なものとして表現しづらいという事です。

それでは、オブジェクトに入る前に、まずは「クラス」について説明していきます。

クラスとは

みなさんがJavaを学習されながらコードを書かれている、【Class 〇〇(クラス名){…}】、これがクラスです。この段階では、実際の機能として動かすにはまだ実体を持っていないため、動かすことはできません。あくまで、これから実体を作るための”レシピ”のようなものであります。”設計図”や”仕様書”などと例えられることもありますが、同じようなものです。クラスの中には、実体を持つであろうものの属性(フィールド)や機能(メソッド)が【書かれて】います。

インスタンスとは

クラスに書かれた”レシピ”をもとに、実際に属性や機能を使うことができるように実体化したものです。クラスを実体化するためには、PC上にメモリ(領域)を確保し、そこに実体を保管する必要があります。PCのメモリには〇〇番地…というようなアドレス(メモリの住所のようなもの)があり、実体化されたインスタンスはそのアドレスに必要な分(〇〇~〇〇番地)だけの領域を確保します。これをインスタンス化といいます。インスタンス化したインスタンスは、ここではじめて自身の属性(フィールド)や機能(メソッド)を自在に使うことができます。同じクラスから複数のインスタンスを作れるのは、同じレシピが元になっているからで、そこから生まれたインスタンス同士は、かたち(型)としては同じものですが、その単体は違うものになります。カレーで例えると、同じレシピから作ったカレーでも、2つ作れば、カレー(インスタンス)は2つとなります。この2つは同じカレーでありますが、個体としては違う、といった感じです。それぞれのカレーは個体としての独立性を持っています。

オブジェクトとは

クラスでは、様々なフィールドやメソッドを持っています。それらをひとまとめにし、ひとつの型としてとらえたものがオブジェクトです。Javaの学習をしているとまず学ぶのが、”変数”というものかと思います。int型やString型、これらは全て、元々既にJavaから用意されている変数でありますが、クラスもひとつの型として使うことができます。そして、先程説明したインスタンスも、その”独立性”を取り除けば、同じクラスから生まれていれば同じオブジェクトであるとも言えます。その事から、オブジェクトというのはかなり概念的な意味が強いため、開発の現場などでは、クラスの事をオブジェクトと呼んだり、インスタンスをオブジェクトと呼んだりします。ただ、クラス(レシピ)=インスタンス(実体の中の個体)=オブジェクト(実体の型)と考えれば、カレー(レシピ)=カレー(実体の中の個体)=カレー(実体の型)のように、大まかにいうとそのものは一緒であるため、あながち間違いではないと捉えることもできます。

ここで一息・・・

ここで、一旦息抜きとして少し楽しい表現に変えてみます。
ある工場で、犬型ロボットを大量につくろうと思います。それには、どういった属性と機能をもったものにするのか、博士がプログラムを書きます。かきかき・・・”Class 犬型ロボット{…}”・・・と。これで、クラス(仕様書)が完成しました。それでは、実際に工場に行ってクラスをもとに実体を作る作業に移ります。今回は試作として10体の犬型ロボットをつくろうと思います。それでは、クラスを読み込ませてスイッチオン(”犬型ロボット 〇〇 = new 犬型ロボット()”を10回)。ベルトコンベアーで運ばれてくるのは、クラスをもとに作った10体のオブジェクト達です。よく見るとその中に、あのジャバえもんやジャバミちゃんもいるではないですか。実は、同じ犬型ロボットでもその個体個体はしっかり違った名前が付けられているのです。先程博士がスイッチをオンにしたときの命令”犬型ロボット 〇〇 = new 犬型ロボット()”ですが、この〇〇というのが、各オブジェクトにもきちんと個体個体で違いを持たせ判別するための名前だったのです。

まとめ

結局のところ、同じクラスをもとに生成されたインスタンスはその個性というものを省いたとき、同じオブジェクトでもあります。そして、各オブジェクトが個体として機能を持ち、動くためには、メモリ上に領域を確保する”インスタンス化”をし、PC上にメモリ(実体)を持たなければいけません。

おわりに

いかがでしたでじょうか。Javaの学習をされている方が、クラスやインスタンス、そしてオブジェクトとは何を意味するものなのかを理解していただける助けになっていれば幸いです。最後まで読んでいただきありがとうございました。