

中嶋悟
名前:中嶋 悟(なかじま さとる) ニックネーム:サトルン 年齢:28歳 性別:男性 職業:会社員(IT系メーカー・マーケティング部門) 通勤場所:東京都千代田区・本社オフィス 通勤時間:片道約45分(電車+徒歩) 居住地:東京都杉並区・阿佐ヶ谷の1LDKマンション 出身地:神奈川県横浜市 身長:175cm 血液型:A型 誕生日:1997年5月12日 趣味:比較記事を書くこと、カメラ散歩、ガジェット収集、カフェ巡り、映画鑑賞(特に洋画)、料理(最近はスパイスカレー作りにハマり中) 性格:分析好き・好奇心旺盛・マイペース・几帳面だけど時々おおざっぱ・物事をとことん調べたくなるタイプ 1日(平日)のタイムスケジュール 6:30 起床。まずはコーヒーを淹れながらニュースとSNSチェック 7:00 朝食(自作のオートミールorトースト)、ブログの下書きや記事ネタ整理 8:00 出勤準備 8:30 電車で通勤(この間にポッドキャストやオーディオブックでインプット) 9:15 出社。午前は資料作成やメール返信 12:00 ランチはオフィス近くの定食屋かカフェ 13:00 午後は会議やマーケティング企画立案、データ分析 18:00 退社 19:00 帰宅途中にスーパー寄って買い物 19:30 夕食&YouTubeやNetflixでリラックスタイム 21:00 ブログ執筆や写真編集、次の記事の構成作成 23:00 読書(比較記事のネタ探しも兼ねる) 23:45 就寝準備 24:00 就寝
constとreadonlyの違いを徹底解説!
この章では const と readonly の基本的な考え方を整理します。両者には“値を変えられない状態”という共通点がありますが、使われる場面や言語ごとの意味の違いによってニュアンスが変わります。プログラミングを始めたばかりの人には、まず「何を変えたくないのか」をはっきりさせることが大切です。
例えば JavaScript や TypeScript では const は「再代入を禁止する変数の宣言」を指し、宣言した値を別の値に置き換えることはできません。ただしオブジェクトを参照している場合、その参照を他のオブジェクトに変えられないだけで、中身のプロパティを変更できることは少なくありません。
一方 C# や C++、Java などの静的型言語では readonly というキーワードが使われ、これは「フィールドを初期化後は変更できない」という意味になります。
このような違いを踏まえると、const と readonly は目的に応じて使い分けるべきものだと分かります。さらに言えば、言語や環境によって同じ言葉でも性質が変わる点に注意が必要です。
次のセクションでは実際のコード例や、どの場面でどちらを選ぶべきかを具体的に見ていきます。
1. 基本の意味と使い方
この節では const と readonly の基本を、言語ごとの微妙な差を含めて説明します。まず const については、宣言時に値を決め、以降はその変数に別の値を割り当てられないという性質を持ちます。多くの言語でこれは“定数”と呼ばれ、プログラムの挙動を安定させるのに役立ちます。例えば変わらない設定値や、計算結果をキャッシュして再利用したい場合に重宝します。
ただしここで気をつけたいのは「参照されるデータの中身まで凍結するわけではない」という点です。つまり const で宣言した配列やオブジェクトの参照は変わりませんが、中身の要素を変えることは可能な場合があるのです。実際の挙動は言語仕様と実装次第で異なります。
次に readonly ですが、これは「値を一度だけ設定できる」性質を持つ修飾子です。
代表的な使い方はクラスのフィールドに対してです。インスタンスを作った後でそのフィールドを変更してはいけないときに readonly を付けます。
なお readonly は静的(static)な場面にも使えますが、基本は「そのオブジェクトが生涯を通して変化させたくないデータ」を守るための道具として理解すると良いでしょう。
ここまでの話を整理すると、const は“再割り当て禁止”、readonly は“初期化後の変更禁止”というイメージになります。
さらに実用面では、const はコンパイル時に確定することが多く、readonly は実行時の初期化タイミングに影響を受けます。これを頭に入れて設計をすると、コードの予測性が高まります。
以上が基本の意味と使い方の要点です。
2. 言語別の違いと活用例
TypeScript では const は再代入を禁止する変数の宣言です。したがって const で宣言した変数には別の値を割り当てることができません。ただし、オブジェクトや配列の中身は変えられることがあります。これは「参照を変えられない」ことと「中身を変えられる」ことが別物だからです。配列の中身を変えたい場合は「また別の変数を使う」か、オブジェクト自体を新しいものに置換します。
例: const arr = [1,2,3]; arr.push(4); // 実際には動くことがあるが、TypeScript の型チェッカーには警告が出るかもしれません。上の意味を確実に守るには Object.freeze を使う方法もあります。
一方 readonly は TypeScript の型側の修飾子で、クラスのプロパティやインターフェースのメンバに付けられます。readonly を付けたプロパティには、初期化後に再代入できません。これは「設計時に決めた値を変えさせない」という意図を表します。
C# では const はコンパイル時定数の意味で、宣言と同時に値を決め、以後変更できません。静的な値として扱われることが多く、クラス外部からの参照にも影響します。
それに対して readonly はインスタンスごとに値を設定でき、通常はコンストラクターで初期化します。インスタンスが生成されるまでは値を決められず、以降は変更できません。これらの設計は「データの不変性」をどのレベルで担保したいかで決まります。
このように言語ごとに微妙に解釈が変わりますが、基本の考え方は同じです。次のセクションでは、実践的な使い分けのコツをまとめます。
3. 実践的な使い分けのコツ
実務での使い分けには、以下のポイントが役立ちます。まず設定値のようにプログラム全体で変わらない数値には const を使います。現場の設定ファイルの値や計算の定数など、変更を想定しないものを選ぶと良いです。
一方、クラスの内部状態で外部からの変更を防ぎたい場合には readonly を使い、インスタンスの生成時に初期化して以降は変更しないようにします。
JavaScript では readonly の意味は「型レベルの保証」であることが多く、実行時の挙動は言語仕様に委ねられます。したがって厳密に不変を保証したい場合は Object.freeze 的な手段を併用すると安心です。
実務ではこれらを使い分けるだけで、コードの読みやすさや保守性が大きく変わることがあります。
最後に、チームでの基本ルールを決めておくと良いです。例えば「定数は const」や「変更禁止なフィールドは readonly で宣言する」などのガイドラインを作ると、他の人が後から見ても意図を理解しやすくなります。
このコツを覚えておくと、コードベース全体の品質が安定します。
今日は友達のミカと喫茶店で雑談風に const と readonly の深掘りをしてみました。ミカは「 const は再代入禁止ってだけだと思ってたけど、中身は変えられることもあるんだね」と驚き、私は「言語ごとに意味が違うから注意が必要だよ」と返します。私たちは具体的な場面を思い浮かべ、設定値を const で守るべきか、クラスの状態を readonly で守るべきかを一緒に検討しました。結論として「安定して変えたくないデータは適切な不変性の修飾子で守ろう」――こうした小さな選択が、将来のコードの読みやすさと保守性を大きく左右することを実感しました。