静的型付け / 動的型付け
Static / Dynamic Typing
概要(サマリー)
静的型付けと動的型付けは、プログラミングで扱う値の型を、主にどのタイミングで確認するかを表す分類である。
静的型付けは、プログラムを実行する前、たとえばコンパイル時やビルド時に型の誤りを検出しやすい方式である。TypeScript、Java、Go、Rustなどが代表例である。
動的型付けは、プログラムの実行時に値の型が決まり、その場で処理される方式である。JavaScript、Python、Rubyなどが代表例である。
どちらが絶対に優れているという話ではない。大規模開発では静的型付けが保守性を高めやすく、小さなスクリプトや試作では動的型付けが素早く書きやすいことがある。
詳細解説
型とは何か
型とは、値の種類を表す情報である。
たとえば、10 は数値、"10" は文字列である。見た目は似ていても、計算に使えるか、文字として連結されるか、使えるメソッドは何かが変わる。
プログラムでは、関数に想定と違う型の値を渡すと、予期しない結果やランタイムエラーにつながることがある。
静的型付けと動的型付けの違いは、この型の問題を主に「実行前に見つけるか」「実行時に扱うか」である。
静的型付けとは
静的型付けは、プログラムを実行する前に型の整合性を確認する方式である。
たとえば、数値を受け取る関数に文字列を渡そうとした場合、コンパイル時やエディタ上でエラーとして検出される。実際にその行を実行する前に、間違いに気づけるのが大きな利点である。
静的型付けのメリットは、次のような点にある。
一方で、型を書く手間や、型エラーを理解する学習コストはある。ただし、TypeScriptのように型推論がある言語では、すべての場所に型を明示的に書く必要はない。
動的型付けとは
動的型付けは、実行時に値の型が決まり、その場で処理される方式である。
たとえば、同じ変数に最初は数値を入れ、あとから文字列を入れることもできる。短いコードを書きやすく、試作や学習、小さな自動化では扱いやすい。
動的型付けのメリットは、次のような点にある。
- 型定義を書かずにすぐ動かせる
- 小さなスクリプトや試作を作りやすい
- 柔軟なデータを扱いやすい
- 初学者が処理の流れを学びやすい場合がある
一方で、型の間違いが実行するまで見つからないことがある。特定の画面操作や特定のデータが来たときだけエラーになることもあるため、テストや入力チェックが重要になる。
コードで比較する
次の例は、2つの値を足す関数である。
JavaScriptの例
function add(a, b) {
return a + b;
}
console.log(add(5, 10));
console.log(add('5', '10'));
JavaScriptでは、add(5, 10) は 15 になる。一方、add('5', '10') は文字列の連結として扱われ、"510" になる。
これはJavaScriptに型がないという意味ではない。数値や文字列という型は存在するが、関数の引数として何を受け取るべきかを実行前に厳密には固定していない、ということである。
TypeScriptの例
function add(a: number, b: number): number {
return a + b;
}
console.log(add(5, 10));
console.log(add('5', '10'));
TypeScriptでは、a と b は number と指定されている。そのため、文字列を渡すコードは型エラーとして検出される。
このように、静的型付けでは「この関数は何を受け取り、何を返すのか」をコード上で明確にしやすい。
静的型付けと型推論
静的型付けと聞くと、すべての変数に型を書かなければならないと思われがちである。
しかし、TypeScriptのような言語では型推論が使われる。型推論とは、コードの内容からコンパイラが型を推測する仕組みである。
たとえば、次のように書いた場合、TypeScriptは message を文字列として扱う。
const message = 'hello';
このように、静的型付けは必ずしも「型を全部手で書く方式」ではない。必要な箇所では型を明示し、明らかな箇所では型推論に任せる、という使い方が多い。
強い型付けと弱い型付けとは別の話
静的型付けと動的型付けは、型を確認するタイミングの分類である。
一方、「強い型付け」「弱い型付け」は、異なる型の値をどの程度自動変換するか、型の扱いをどの程度厳しくするかに関わる話である。
たとえば、JavaScriptは動的型付けであり、状況によって文字列と数値を自動変換することがある。Pythonも動的型付けだが、型の違う値を安易に足そうとするとエラーになることがある。
つまり、「動的型付け = 型がない」「静的型付け = すべて強い型付け」と単純に考えると誤解しやすい。
AIコーディングとの関係
AIコーディングでは、静的型付けの恩恵が大きい。
AIが生成したコードに、存在しないプロパティ、間違った引数、戻り値の不一致が含まれていても、TypeScriptなどの型チェックによって早い段階で検出できる。型エラーをそのままAIに渡して修正させる流れも作りやすい。
AIに依頼するときは、次のように伝えるとよい。
TypeScriptで実装してください。
関数の引数と戻り値の型を明示してください。
anyはできるだけ使わず、必要な型定義も追加してください。
一方、動的型付けの言語でAIを使う場合は、型エラーが実行時まで見えにくいことがある。そのため、サンプル入力、期待する出力、エラー時の挙動、テストコードを一緒に依頼すると安全性を上げやすい。
よくある勘違い
動的型付け言語には型がない?
型はある。
JavaScriptやPythonでも、数値、文字列、配列、オブジェクトなどの型は存在する。違いは、変数や関数の型を主に実行前に固定して検査するかどうかである。
「型を書かなくてよい」と「型が存在しない」は別の話である。
静的型付けならバグは起きない?
起きる。
静的型付けは、型の不一致を見つけるのに強い。しかし、仕様の勘違い、計算ロジックの誤り、条件分岐の漏れ、データ設計の問題までは自動で完全に防げない。
型チェックは強力な安全網だが、テストやレビューの代わりにはならない。
動的型付けは大規模開発に向かない?
必ずしもそうではない。
PythonやJavaScriptでも、大規模なシステムは作られている。型ヒント、テスト、Linter、静的解析ツール、設計ルールを組み合わせることで、動的型付け言語でも品質を高められる。
ただし、コード量やチーム人数が増えるほど、型情報がある方が変更の影響を追いやすい場面は多い。
TypeScriptは実行時にも型をチェックしてくれる?
基本的には、TypeScriptの型は実行前の開発支援である。
TypeScriptは最終的にJavaScriptへ変換される。実行時に外部APIから想定外のデータが来た場合などは、TypeScriptの型だけでは防げないことがある。必要に応じて、実行時のバリデーションも用意する。
まとめ
- 静的型付けと動的型付けは、型を主に確認するタイミングの違いである。
- 静的型付けは、実行前に型の不一致を検出しやすく、大規模開発や保守で役立ちやすい。
- 動的型付けは、素早く書きやすく、試作や小さなスクリプトで扱いやすい。
- 動的型付け言語にも型は存在するため、「型がない」と考えるのは誤解である。
- AIコーディングでは、静的型付けや型定義を活用すると、AIの出力ミスを検出しやすくなる。
情報ソース
より詳しくAIに聞いてみよう
- 静的型付けと動的型付けの違いを、初心者向けに具体例つきで説明してください。
- TypeScriptの型推論とは何かを、コード例つきで教えてください。
- JavaScriptに型が存在するのに動的型付けと呼ばれる理由を説明してください。
- Pythonの型ヒントとTypeScriptの型チェックの違いを教えてください。
- AIコーディングでTypeScriptの型エラーを修正してもらうためのプロンプト例を教えてください。