「オブジェクト指向」カテゴリーアーカイブ

オブジェクト指向用のカテゴリー

インスタンス変数とローカル変数の違い

Webシステムは基本的に複数人で同時利用されるのが前提のため、マルチスレッドアクセスを考慮した設計・実装を行う必要があります。業務でJavaの各変数とスレッドセーフについて考える機会があったので、「インスタンス変数とローカル変数の違いとスレッドセーフとの関係」について今回は整理してみようと思います。

Javaでの変数毎のメモリ管理イメージ


    上記は変数毎のメモリ管理イメージとなります。Javaではクラス変数やインスタンス変数はヒープ領域と呼ばれる共有メモリ領域へ保存されます。複数のスレッドで共有され別のスレッドに書き換えられる可能性があり,スレッドセーフではありません。対してローカル変数はJavaスタックと呼ばれるスレッド固有メモリ領域へ保存されます。スレッド固有領域なので別のスレッドに書き換えられる可能性はないのでスレッドセーフとなります。

インスタンス変数とは

  • サンプルコード
  • メソッドの外に記述します。staticは付けません(staticが付くとクラス変数になります)。
  • ヒープ領域と呼ばれる共有メモリ領域へ保存される為、宣言しただけではスレッドセーフにはなりません。
  • スレッドセーフを保つ為には初期化する必要があります。
    • コンスラクタで初期化
    • インスタンス宣言時に初期化
    • 最初のget時に初期化
  • 他のスレッドからの更新を防ぐ為、修飾子はprivateにする必要があります。
  • 当該クラス内の任意のメソッドから参照可能となります。

ローカル変数とは

  • サンプルコード
  • メソッド内に記述します。
  • そのメソッドが実行中の間だけ有効となります。
  • Javaスタックと呼ばれるスレッド固有メモリ領域へ保存される為、スレッドセーフとなります。

DTOとVOの違い

様々な業務でシステム開発をしているとDTOやVOというクラスが出てきて違いが曖昧になってくる事があるので両者の違いについて整理しておきます。

DTO(Data Transfer Object)

  • 基本的には値をまとめて受け渡す事のみを目的とするクラス。
  • DTO(Data Transfer Object)はデザインパターンの一つ。
  • 過去、J2EEではVO(Value Objects)と呼ばれていた。
  • VOとは違い、値は変更可能なのでsetterメソッドを持つ。

VO(Value Objects)

  • VO(Value Objects)もデザインパターンの一つ。
  • インスタンスコンストラクタでプロパティを初期化してプロパティの変更(set)は外から出来ないようにするクラス。
  • VOは不変である事が前提のため、MVC間で使用する場合にはDTOを用いた方が相性が良い。
  • VOクラス例

オーバーロードとオーバーライドの違い

javaでプログラミングしていると必ずと言っていいほど「オーバーロード」や「オーバーライド」という言葉が出てきます。復習も兼ねて今回は両者の違いについて整理してみます。

オーバーロードとは

  • 同一クラス内の同一メソッド名で、「引数の型」、「引数の数」、「引数の並び順」のいずれかが異なるメソッドを複数定義すること。
  • 同一クラス内の同一メソッド名でも「戻り型」、「アクセスレベル」、「引数名」、「throws節」が不一致している場合はオーバーロードとは見做されないのでコンパイルエラーになります。
  • Javaでのオーバーロード実装例

    JUnit

    実行結果(コンソール)

    得意なプログラミング言語は「JavaScript」です。
    私の母国は「日本」です。
    得意なプログラミング言語は「JavaScript」です。

オーバーライドとは

  • 親クラス(スーパークラス)で定義されているインスタンスメソッドを、子クラス(サブクラス)で再定義すること。
  • 親クラス(スーパークラス)のメソッドを変更することは出来ませんが、子クラス(サブクラス)に特化した機能を付与する事は可能です。
  • アクセス修飾子が「private」以外でオーバーライドは適用対象となります。(例:「public」・「protected」)
  • オーバーライドする側はオーバーライドされる側と「戻り型」、「メソッド名」、「引数型」、「引数の数」が全て一致する必要があります。どれか一つでも異なる場合はオーバーライドとは見做されません。
  • Javaでのオーバーライド実装例

    スーパークラス(親クラス)

    サブクラス(子クラス)

    JUnit

    実行結果(コンソール)

    得意なプログラミング言語はJavaです。
    得意なプログラミング言語はCです。

MVCモデルについて

Webアプリケーションを作成する上で重要になってくるのがMVCと呼ばれるソフトウェア設計モデルです。

MVCとは

  • ソフトウェアを「Model」・「View」・「Controller」という3要素の組み合わせでシステムを実装する方式です。

MVCモデルのイメージ

  • Model
    • Modelは、システムの中で処理の中核を担うビジネスロジック(アプリケーションが扱う領域のデータと手続き)を担当するシステムの本体部分に当たります。
    • データベースなどに格納された生のデータを隠蔽し、抽象化された形のAPIを通じて他のモジュールからのアクセスをコントロールするモジュールです。
    • Modelは入出力や表示といった処理は行わず、業務モデルの実装といった部分を担当します。
    • アプリケーション特有のルールやロジック(ビジネスロジック)を持ち、データの整合性に絶対の責任を持ちます。
    • データの変更をViewに通知するのもModelの責任となります。(Modelの変更を通知するのにObserverパターンが用いられることもあります)。
    • 多くのアプリケーションではデータの格納に永続的な記憶の仕組み(データベースなど)が使われています。
    • MVCの概念では、データの(UI以外の)入出力は取り扱わないので、データアクセスも本来MVCの概念の範疇を超えるものではありますが、敢えて言えばModelの中に隠蔽されると考えられます。
    • J2EEでは JavaBeans、EJBがモデルを担当します。
    • サーバサイドでいうserviceに関する処理を行なっています。
  • View
    • Viewは、表示、入出力といった部分を担当します。
    • Modelのデータを取り出してユーザが見るのに適した形で表示する要素です。
    • UIへの出力を担当します。
    • Modelが提供する抽象化されたデータを、どのような形式で人へ見せるのかを記述したモジュールです。
    • GUIアプリケーションの場合、使用するGUI部品や画面上のレイアウトを指定します。
    • 必要な情報をModelから取り出して画面へ表示させる為の処理を行います。
    • J2EEではServletやJSPで実装します。
    • 一般的な HTML表示に関してはJSP、そのほかの特殊なデータ(バイナリデータ)を出力する場合は Servletを用いるのが標準的な使用方法となります。
  • Controller
    • コントローラは、ViewとModelを制御します。
    • 自分自身では表示を行ったりロジックの実行は行わず、Viewからの入力に応じて、必要なロジックの実行をModelに依頼し、その結果表示をViewに依頼します。
    • ユーザの入力(通常イベントとして通知されます)に対して応答し、それを処理する要素です。
    • UIからの入力を担当します。
    • ViewとModelの間に位置して、ユーザーにどんな順序でデータを見せて行くとか、Viewを通したユーザーからの入力をModelへのAPIコールへとマッピングするのがこのモジュールの役割となります。
    • ModelとViewに変更を引き起こす場合もありますが、直接描画を行ったり、Modelの内部データを直接操作したりはしません。
    • J2EEではServletでControllerを実装します。
    • イベントはコントローラで受け取り、画面上構成するボタン(イベント)の数だけ処理があります。

MVCモデルのメリット

  • 並行開発
    機能毎の分離が明確になることにより独立性が確保出来る。
    ・開発の分業が可能になる
    ・専門家を配置しクオリティーを上げる事が可能になる
  • 再利用性
    コンポーネント間の依存性が最小限に抑えられる為、他の部分の影響を受けにくい。
    ・コンポーネントの再利用がしやすくなる
    ・他のコンポーネントの変更が原因で、複数の担当者が同一のソースに対してメンテナンスを行う、というような事態を避けることもでき、保守性も確保される

インスタンスとオブジェクトの違い

【Java入門】オブジェクトとインスタンスの違いをわかりやすく解説

Javaを学び始めると必ず出てくるキーワードが 「オブジェクト」「インスタンス」 です。
どちらも似た意味で使われることが多く、違いがよく分からない…という声をよく耳にします。
本記事では、両者の違いを整理しつつ、イメージしやすい例を紹介します。


1. クラス・オブジェクト・インスタンスの関係

まず大前提として、Javaのプログラミングに登場する概念を整理しましょう。

  • クラス (Class)
    設計図。どんなデータや処理を持つかを定義するもの。

  • オブジェクト (Object)
    「モノ」という抽象的な存在を指す概念。
    クラスから生成される実体を総称して「オブジェクト」と呼ぶ。

  • インスタンス (Instance)
    具体的にメモリ上に確保された1つの実体。
    「オブジェクトがプログラム上で実際に存在している状態」を指す。


2. 実際のコードでイメージする

例えば、犬を表すクラスを作ってみます。

この Dog クラスは「設計図」です。
ここから具体的な犬を作るとどうなるでしょうか?

出力結果:

ポチ がワンワン吠えています!
クロ がワンワン吠えています!
  • pochi という インスタンス(具体的な犬)ができる

  • kuro という インスタンスも別に存在する

  • それぞれをまとめて「Dogクラスのオブジェクト」と呼ぶことができる

つまり、オブジェクトは概念的な呼び方、インスタンスはその実体を強調する呼び方という違いがあります。


3. よくある混乱ポイント

  • 「オブジェクト」と「インスタンス」は日常会話ではほぼ同じ意味で使われることが多い

  • 教科書やAPIリファレンスでは「インスタンス化」「オブジェクト参照」といった形で区別される

  • 特に試験や設計書では「インスタンス=newで生成された具体物」と覚えておくと混乱しにくい


4. まとめ

  • クラス = 設計図

  • オブジェクト = クラスから作られる「モノ」という概念

  • インスタンス = 実際に生成されメモリ上に存在する「具体的な実体」

プログラミングにおいては「オブジェクト」と「インスタンス」を厳密に区別しないケースも多いですが、
概念を押さえておくと理解がぐっと深まります。