変数と定数の違いとは?初心者向けに使い分けと実務での注意点を解説
結論として、変数はプログラムの実行中に値を変更できる入れ物、定数は一度決めた値を基本的に変更しない入れ物です。
例えば、現在の在庫数やログイン回数のように変化する値には変数を使います。一方、消費税率、最大ログイン試行回数、システム名など、途中で書き換えたくない値には定数を使います。
変数と定数の違い
| 比較項目 | 変数 | 定数 |
|---|---|---|
| 値の変更 | 変更できる | 基本的に変更できない |
| 主な用途 | 処理中に変化するデータ | 固定して使うデータ |
| 例 | 在庫数、合計金額、ユーザー名 | 税率、上限値、固定メッセージ |
| メリット | 状況に応じて値を変えられる | 誤変更を防ぎ、意味を明確にできる |
| 注意点 | どこで変更されたか追いにくくなる場合がある | 変更が必要な値を定数にすると運用しにくい |
変数とは
変数(Variable)とは、データを一時的に保存するための名前付きの入れ物です。
変数へ保存した値は、プログラムの処理に応じて変更できます。
int stockCount = 10;
この例では、stockCountという変数へ10を保存しています。その後、商品が売れた場合は値を変更できます。
stockCount = 9;
| 変数の例 | 保存する内容 |
|---|---|
| stockCount | 現在の在庫数 |
| userName | ログイン中のユーザー名 |
| totalPrice | 注文の合計金額 |
| retryCount | 再試行した回数 |
定数とは
定数(Constant)とは、一度設定したあとに変更しない値です。
プログラム内で何度も使う固定値や、誤って変更すると問題になる値に使用します。
C#ではconst、Javaではfinalを使って定数を表すことがあります。
const int MaxRetryCount = 3;
この例では、最大再試行回数を3回に固定しています。処理の途中で別の値を代入しようとすると、通常はコンパイルエラーになります。
| 定数の例 | 用途 |
|---|---|
| MaxRetryCount | 最大再試行回数 |
| TaxRate | 税率 |
| SystemName | システム名 |
| DefaultTimeout | 標準のタイムアウト時間 |
身近な例で理解する
会社の社員証で考えると分かりやすくなります。
| 社員証の情報 | 考え方 |
|---|---|
| 現在の所属部署 | 異動で変わるため変数 |
| 現在の役職 | 昇進で変わるため変数 |
| 会社コード | 通常は固定のため定数 |
| システム上の最大文字数 | 仕様として固定するなら定数 |
状況に応じて変わるものは変数、ルールとして固定するものは定数と考えると理解しやすくなります。
変数を使う場面
- ユーザーが入力した値を保存する
- 計算結果を保存する
- 処理回数を数える
- 検索結果を一時保存する
- ログイン中のユーザー情報を保持する
- 処理状態を管理する
変数は、処理の途中で内容が変わるデータに適しています。
定数を使う場面
- 最大入力文字数
- 最大ログイン試行回数
- 固定のエラーメッセージ
- 画面や機能の識別コード
- 計算で使う固定値
- 変更してはいけないシステム上のルール
同じ固定値を複数箇所へ直接書くのではなく、定数として一か所にまとめると保守しやすくなります。
なぜ定数を使うのか
誤った変更を防げる
定数にすると、処理の途中で誤って値を書き換える事故を防げます。
値の意味が分かりやすくなる
次のように数値を直接書くと、3が何を意味するのか分かりにくくなります。
if (retryCount >= 3)
定数名を使うと、意味が明確になります。
if (retryCount >= MaxRetryCount)
修正箇所を減らせる
同じ値を複数箇所へ直接書いていると、仕様変更時にすべて修正しなければなりません。
定数へまとめておけば、定義箇所を変更するだけで済む場合があります。
マジックナンバーとは
マジックナンバーとは、意味が分からないままソースコードへ直接書かれた数値です。
if (loginFailureCount >= 5)
この5が何を表すのか、コードだけでは判断しにくい状態です。
次のように定数へ置き換えると意味が分かりやすくなります。
const int MaxLoginFailureCount = 5;
実務では、理由のある固定値を定数として名前付けすることが重要です。
実際のIT現場での利用例
ログイン処理
| 値 | 種類 |
|---|---|
| 現在のログイン失敗回数 | 変数 |
| 最大ログイン失敗回数 | 定数 |
在庫管理システム
| 値 | 種類 |
|---|---|
| 現在の在庫数 | 変数 |
| 発注警告を出す基準値 | 定数または設定値 |
ファイル出力処理
| 値 | 種類 |
|---|---|
| 出力するファイル名 | 変数 |
| 固定の拡張子 | 定数 |
定数と設定値の違い
初心者が特に迷いやすいのが、定数と設定値の違いです。
| 比較項目 | 定数 | 設定値 |
|---|---|---|
| 変更方法 | 通常はソースコードを変更する | 設定ファイルや管理画面から変更する |
| 変更頻度 | ほとんど変更しない | 環境や運用に応じて変更する |
| 例 | 計算式で使う固定値 | 接続先URL、タイムアウト時間 |
運用中に変更する可能性がある値は、定数ではなく設定ファイルや環境変数で管理する方が適切です。
環境変数との違い
環境変数は、Windowsやサーバー、実行環境ごとに設定する値です。
開発環境、検証環境、本番環境で異なる接続先や保存先を管理するために使われます。
| 種類 | 例 |
|---|---|
| 変数 | 現在の処理件数 |
| 定数 | システム内で固定された上限値 |
| 環境変数 | データベース接続先、ログ保存先 |
初心者が混乱しやすいポイント
値が変わらない変数を定数だと思う
実際に値を変更していなくても、変更可能な書き方で定義されていれば変数です。
すべての固定値を定数にする
運用中に変更する可能性がある値まで定数にすると、変更のたびにプログラムの修正や再配置が必要になります。
定数名を通常の変数名と同じように付ける
言語やチームのルールによっては、定数名をすべて大文字にするなどの命名規則があります。
例えばJavaでは、次のように書くことがあります。
MAX_RETRY_COUNT
constとreadonlyを混同する
C#ではconstのほかにreadonlyがあります。
constはコンパイル時に値が決まる定数、readonlyはコンストラクタで一度だけ設定できるフィールドです。
C#のconstとreadonlyの違い
| 比較項目 | const | readonly |
|---|---|---|
| 値を決めるタイミング | コンパイル時 | 宣言時またはコンストラクタ実行時 |
| オブジェクトごとの値 | 持てない | 持てる |
| 主な用途 | 完全に固定された値 | 生成時に決まり、その後変えない値 |
例えば、社員番号をオブジェクト生成時に設定し、その後変更させたくない場合はreadonlyが適しています。
業務でよくあるトラブル
変数の値が途中で書き換わる
複数の処理から同じ変数を変更していると、想定外の値になることがあります。
固定値が複数箇所に直接書かれている
仕様変更時に一部だけ修正漏れが発生し、画面や処理によって動作が異なる原因になります。
変更予定の値を定数にしている
タイムアウト時間や保存先などを定数にすると、環境変更のたびにプログラム修正が必要になります。
定数を変更したのに反映されない
古いプログラムが配置されている、ビルドされていない、キャッシュが残っているなどの可能性があります。
原因を切り分ける順番
- 問題の値が変数、定数、設定値のどれか確認する
- 値を定義している場所を確認する
- 値を変更している処理がないか検索する
- 設定ファイルや環境変数を確認する
- 開発環境と本番環境の値を比較する
- 最新のプログラムが配置されているか確認する
- 変更前後のログを比較する
定義場所、変更場所、利用場所の順番で確認すると、原因を見つけやすくなります。
ソースコードの確認方法
GUIで確認する方法
Visual Studio、Visual Studio Code、Eclipse、IntelliJ IDEAなどでは、変数名や定数名を右クリックして「定義へ移動」を選ぶと宣言場所を確認できます。
「すべての参照を検索」を使えば、値が利用されている場所や変更されている場所を調査できます。
便利なショートカットキー
| 操作 | 代表的なショートカット |
|---|---|
| 定義へ移動 | F12 |
| すべての参照を検索 | Shift+F12 |
| ファイル内検索 | Ctrl+F |
| プロジェクト全体を検索 | Ctrl+Shift+F |
PowerShellで確認する方法
PowerShellでは、変数名や定数名をソースファイルから検索できます。
Get-ChildItem -Recurse -Include *.cs,*.java | Select-String "MaxRetryCount"
宣言場所だけでなく、参照箇所や同じ数値が直接書かれていないかも確認します。
ログで確認するポイント
- 値が設定された日時
- 変更前の値
- 変更後の値
- 値を変更した処理
- 実行環境
- 設定ファイルの読み込み結果
- エラーメッセージ
パスワード、接続文字列、アクセストークンなどの機密情報は、ログへそのまま出力してはいけません。
筆者が現場で経験した失敗
新人の頃、タイムアウト時間を定数としてソースコードへ直接書いたことがあります。
検証環境では問題ありませんでしたが、本番環境では処理量が多く、タイムアウト時間を延ばす必要がありました。定数だったため、設定変更だけでは対応できず、プログラムの修正と再配置が必要になりました。
それ以降は、業務運用で変更する可能性がある値は設定ファイル、絶対に変えないルールだけを定数として扱うようにしています。
初心者がやりがちなミス
- 変数と定数を名前だけで判断する
- 同じ固定値を複数箇所へ直接書く
- 変更する可能性がある値を定数にする
- 定数の意味が分からない名前を付ける
- 変数の変更箇所を確認せず修正する
- 本番環境の設定値とソースコード上の定数を混同する
業務で上司へ報告するポイント
- 対象の変数名または定数名
- 定義されている場所
- 期待していた値
- 実際に使用された値
- 値が変更された処理
- 影響を受ける機能
- 環境ごとの差異
- 修正後のテスト範囲
エスカレーションするタイミング
- 共通定数の変更が必要になった
- 複数システムで同じ定数を利用している
- 影響範囲を把握できない
- 本番環境だけ異なる値になる
- 定数を設定値へ変更する必要がある
- 認証情報などがソースコードへ直接書かれている
応用知識
ローカル変数
メソッドや関数の中だけで使う変数です。処理が終了すると利用できなくなります。
インスタンス変数
オブジェクトごとに保持する変数です。社員ごとの氏名や部署などに使われます。
クラス変数
クラス全体で共有する変数です。C#やJavaではstaticを付けて定義します。
不変オブジェクト
作成後に状態を変更できないオブジェクトです。定数とは異なりますが、値を安全に扱う設計として利用されます。
関連するIT用語
- 変数
- 定数
- データ型
- 代入
- 宣言
- 初期化
- スコープ
- const
- final
- readonly
- 環境変数
- 設定ファイル
よくある質問(FAQ)
変数は何回でも変更できますか?
通常は何度でも変更できます。ただし、スコープやアクセス制限によって変更できる場所が決まります。
定数は絶対に変更できませんか?
プログラム実行中は基本的に変更できません。ただし、ソースコードを書き換えて再ビルドすれば定義値を変更できます。
定数と固定値は同じですか?
固定値は変わらない値全般を指します。定数は、その固定値へ名前を付けてプログラム上で変更できないようにしたものです。
消費税率は定数にすべきですか?
税率は将来変更される可能性があるため、業務システムでは設定ファイルやデータベースで管理する方が適切な場合があります。
パスワードを定数にしてもよいですか?
避けるべきです。パスワードやAPIキーなどはソースコードへ直接書かず、安全な資格情報管理機能や環境変数を利用します。
まとめ
変数と定数は、どちらも値を扱うための仕組みですが、変更できるかどうかが大きな違いです。
- 変数は処理中に値を変更できる
- 定数は一度決めた値を基本的に変更しない
- 変化する値には変数、固定ルールには定数を使う
- 運用中に変更する値は設定ファイルや環境変数で管理する
- 不具合調査では定義場所、変更場所、利用場所を確認する
ソースコードを読むときは、「この値は途中で変わるのか」「変更されてはいけない値なのか」を確認してください。この視点を持つと、変数と定数の役割だけでなく、設計上の意図も理解しやすくなります。
