📝

静的型付けと動的型付けの基本的な違い

2025/02/01に公開

静的型付けと動的型付けの基本的な違い

静的型付け(Go、Java、C++など)

変数の型が コンパイル時に決まる。
一度決めた型は、プログラムが動作する間、基本的に変わらない。
型に関する間違い(例:型の不一致など)は、コンパイル時にエラーとして発見される。
動的型付け(Python、JavaScriptなど)

変数の型は 実行時に決まる。
同じ変数に異なる型の値を入れることが可能。
型の間違いによるエラーは、実行時までわからないことが多い。
Goの静的型付けの例
Goでは、変数を宣言する際に型を指定します。例えば:

package main

import "fmt"

func main() {
    var age int = 20  // 変数 age は int 型
    fmt.Println(age)

    // age = "twenty"  // エラー!int 型に文字列は代入できない
}

上記の例では、age は int 型なので、文字列など他の型を代入しようとすると コンパイル時にエラー になります。これが静的型付けの特徴です。

動的型付けの例(Python)

同じ例を動的型付けの言語(例えば Python)で書くと:

age = 20  # 初めは int 型
print(age)

age = "twenty"  # 途中で文字列型に変更できる
print(age)

Pythonでは、変数 age に異なる型の値を代入してもエラーにはなりません。Goと違って型のチェックが 実行時 に行われます。

静的型付けと動的型付けのメリット・デメリット

静的型付け(Go) 動的型付け(Python、JavaScript)

メリット

  • コンパイル時に型の間違いを検出できる - コードが柔軟で短く書ける
  • 大規模開発で型の整合性を保ちやすい - 型を気にせず素早く試作や開発ができる

デメリット

  • 型指定が煩雑になることがある - 実行してみるまで型のエラーがわからない
  • 柔軟性が少ない(型変換が必要な場合も) - 大規模なプロジェクトではバグが増えやすい

Goで柔軟な型の扱い:interface{}

Goは静的型付けですが、必要に応じて 柔軟に型を扱える仕組み もあります。その代表例が interface{}(空のインターフェース) です。これは 任意の型の値を受け入れる 型で、動的な言語に少し近い使い方ができます。

package main

import "fmt"

func printValue(value interface{}) {
    fmt.Println(value)
}

func main() {
    printValue(42)        // int 型でも OK
    printValue("Hello")   // string 型でも OK
    printValue(3.14)      // float 型でも OK
}

ただし、型の安全性を確保するために型アサーションや型スイッチを使う必要があるため、完全に動的なわけではありません。

結論

Go は 静的型付け なので、型に関する問題が実行前にコンパイル時に検出されるため、大規模開発に向いています。
動的型付け言語(Python など)は柔軟で素早い開発に向いていますが、型エラーの検出が遅くなる可能性があります。
Goの強みは、静的型付けの安全性を維持しつつ、interface{}などの柔軟な構造で動的型付けに近いこともできる点です。

Discussion