Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

public変数(パブリックヘン スウ)とは | 意味や読み方など丁寧でわかりやすい用語解説

public変数(パブリックヘン スウ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

公開変数 (コウカイヘン スウ)

英語表記

public variable (パブリック・バリアブル)

用語解説

「public変数」とは、プログラミングにおいて、その変数に対するアクセス範囲を「public」というキーワードで明示的に指定したものを指す。プログラムの様々な箇所から直接参照したり、値を変更したりすることが可能であるという特徴を持つ。

まず変数について簡単に触れると、変数とは、プログラム中でデータ(数値や文字列など)を一時的に保存しておくための「名前のついた箱」のようなものである。この箱の中身はプログラムの実行中に変化することがあり、その内容を読み取ったり、新しい値を書き込んだりして利用する。そして、この変数がどの範囲から操作できるか、あるいは見えるかという「アクセス権限」を指定するための仕組みが「アクセス修飾子」と呼ばれる。publicはこのアクセス修飾子の一つであり、最も広いアクセス範囲を示す。

public変数の概要としては、宣言されたクラスや構造体の内外、さらにはそのクラスや構造体を利用する他のプログラムのどこからでも、何らの制限もなくアクセスできる点が挙げられる。これは、プログラムの複数の部分で同じデータを共有し、手軽に利用したい場合に便利な特性である。例えば、ユーザー名や設定値といった、アプリケーション全体で共有されるべき少数の単純なデータを一時的に保持する際に、public変数が使われることがある。しかし、この「どこからでも自由にアクセスできる」という特性は、同時に多くの潜在的な問題を引き起こす可能性も秘めている。

詳細について掘り下げていく。 プログラミング言語の多くは、オブジェクト指向という考え方を取り入れている。オブジェクト指向では、プログラムを「オブジェクト」と呼ばれる部品の集まりとして設計する。オブジェクトは、データ(変数)とそのデータを操作する処理(メソッド)を一つにまとめたものである。このオブジェクト指向の重要な原則の一つに「カプセル化」がある。カプセル化とは、オブジェクトの内部構造やデータを外部から直接見えないように隠蔽し、定められたインターフェース(メソッド)を通じてのみ操作できるようにする考え方である。これにより、オブジェクトの内部実装が変更されても、外部に影響を与えにくくし、プログラム全体の保守性や信頼性を高めることを目的としている。

public変数は、このカプセル化の原則に反することが多い。なぜなら、データが完全に外部に公開され、誰でも自由に読み書きできる状態になるからである。これにより、以下のような具体的な問題が発生しやすくなる。

第一に、データの整合性の問題が挙げられる。public変数はどこからでも直接値を変更できるため、予期せぬ場所で意図しない値に書き換えられてしまうリスクがある。例えば、ある変数が常に正の数であるべきという制約がある場合、public変数として公開されていると、誤って負の値が代入されてしまう可能性があり、それが原因でプログラム全体の動作がおかしくなることがある。このような問題が発生した場合、どこで値が変更されたのかを特定するのが非常に困難になり、デバッグ作業が複雑化する。

第二に、保守性の低下という問題がある。もしpublic変数の型や名前を変更する必要が生じた場合、その変数を参照しているプログラム中のすべての箇所を修正しなければならない。参照箇所が多数にわたる場合、その修正作業は膨大になり、見落としによるバグ発生のリスクも高まる。カプセル化が適切に行われていれば、変数の内部実装を変更しても、外部に公開されているインターフェース(メソッド)に変更がなければ、外部のコードを修正する必要はなくなる。

第三に、テストの困難さが増すという点がある。プログラムの品質を保証するためには、各部品(クラスやメソッド)が正しく動作するかを個別に確認する単体テストが不可欠である。public変数が多数存在すると、あるクラスの動作が他の多くのクラスのpublic変数の状態に依存するようになり、単体テストを行う際に、それらすべての変数を適切な状態に設定する必要が生じる。これはテストコードの記述を複雑にし、テスト自体が不十分になる原因となる。

これらの問題に対処するため、オブジェクト指向プログラミングでは、原則としてデータをpublic変数として直接公開することは避けるべきだとされている。代わりに推奨されるのが、「private変数」と「publicメソッド(ゲッターとセッター)」を組み合わせる方法である。

private変数は、宣言されたクラスや構造体の内部からのみアクセス可能であり、外部からは直接アクセスできない。そして、そのprivate変数の値を取得したり(ゲッター)、設定したり(セッター)するためのpublicなメソッドを用意する。例えば、getName()というメソッドで名前を取得し、setName(String newName)というメソッドで名前を設定するといった具合である。

このゲッターとセッターを利用することで、データの読み書きに制限やロジックを挟むことが可能になる。例えば、setName()メソッド内で、新しい名前が空文字列でないか、特定の形式を満たしているかといったバリデーション(入力値の検証)処理を行うことができる。また、値が変更されるたびに特定の処理をトリガーすることも可能になる。これにより、データの整合性を保ちやすくなり、外部からの不正な操作を防ぎ、オブジェクトの状態を安全に保つことができる。変数の内部実装を変更しても、ゲッターやセッターのインターフェースが変わらなければ、外部のコードに影響を与えることもないため、保守性も向上する。

もちろん、public変数が全く不要というわけではない。例えば、定数(一度初期化されたら二度と変更されない値)として利用する場合や、データのみを保持する構造体のような単純なデータオブジェクトにおいて、そのデータを外部に公開することが意図されている場合など、限定的な場面で利用されることはある。しかし、一般的には、安易なpublic変数の利用は避けるべきであり、特に初心者エンジニアにとっては、カプセル化の原則を意識し、private変数とゲッター・セッターの組み合わせを積極的に利用する習慣を身につけることが、高品質なプログラムを開発するための第一歩となるだろう。public変数は手軽だが、その手軽さが後々の開発において大きな負債となり得ることを理解しておく必要がある。

最終的な判断は、プロジェクトの規模、言語の特性、チームのコーディング規約など、様々な要因に基づいて行われるが、基本的な考え方として、データは可能な限り隠蔽し、必要な場合にのみ、制御された方法でアクセスを許可するという原則を忘れてはならない。これが、堅牢で保守性の高いシステムを構築するための重要な指針となる。

関連コンテンツ