はじめに
プログラムの中で、信号の色(赤・黄・青)や、曜日(日・月・火…)のように、互いに関連する一連の定数を扱いたい場合があります。これらの状態を、0
, 1
, 2
のような単なる整数(マジックナンバー)で管理すると、コードを読む人が「0
が赤だっけ?」と混乱し、可読性が著しく低下します。
このような問題を解決するのが「列挙型 (enumerated data type)」です。enum
キーワードを使うことで、一連の整数定数に、人間にとって分かりやすい名前を付けることができます。
この記事では、enum
の基本的な使い方と、それによってコードがどのように読みやすくなるのかを解説します。
enum
を使ったサンプルコード
このコードは、SignalColor
という列挙型を定義し、信号の色(RED
, YELLOW
, GREEN
)を扱います。switch
文を使って、現在の信号の色に応じたメッセージを表示します。
完成コード
#include <iostream>
using namespace std;
// 1. 列挙型を定義
enum SignalColor {
RED, // 0
YELLOW, // 1
GREEN // 2
};
int main() {
// 2. 列挙型の変数を宣言し、値を代入
SignalColor currentSignal = GREEN;
// 3. switch文で変数の値を判定
switch(currentSignal) {
case RED:
cout << "信号は「赤」です。止まってください。" << endl;
break;
case YELLOW:
cout << "信号は「黄」です。注意してください。" << endl;
break;
case GREEN:
cout << "信号は「緑」です。進んでください。" << endl;
break;
default:
cout << "信号の色が不明です。" << endl;
break;
}
return 0;
}
実行結果
信号は「緑」です。進んでください。
コードの解説
1. enum SignalColor { RED, YELLOW, GREEN };
これが、列挙型を定義している部分です。
enum SignalColor
:SignalColor
という名前の新しい列挙型を定義します。{ RED, YELLOW, GREEN }
:{}
の中に、列挙子と呼ばれる識別子をカンマ区切りで並べます。- 自動的な整数割り当て: コンパイラは、列挙子に先頭から
0
,1
,2
, … と自動的に整数値を割り当てます。つまり、内部的にはRED
は0
、YELLOW
は1
、GREEN
は2
と同じです。
2. SignalColor currentSignal = GREEN;
定義した SignalColor
型を使って、currentSignal
という名前の変数を宣言しています。そして、その変数に列挙子 GREEN
(内部的には 2
)を代入しています。int signal = 2;
と書くよりも、コードの意図が遥かに明確になります。
3. switch(currentSignal) { case RED: ... }
switch
文の case
ラベルには、case 0:
のように直接数値を書く代わりに、case RED:
のように列挙子を書くことができます。これにより、コードが非常に読みやすく、直感的になります。
まとめ
今回は、C++の列挙型 enum
の基本的な使い方を解説しました。
enum
を使うと、一連の整数定数に分かりやすい名前を付けることができる。0
,1
,2
のようなマジックナンバーをコードから排除でき、可読性が大幅に向上する。switch
文と組み合わせると、特に効果を発揮する。
enum
は、プログラムの状態や種類などを管理する際に非常に便利な機能です。意味のある名前を付けることで、コードの意図を明確にし、バグの少ないプログラムを目指しましょう。