JavaとPythonの比較ガイド
以下では、Javaの経験はあるものの、Pythonは最近学習し始めたばかりの私が、
主要な相違点を「文法」「型システム」「オブジェクト指向機能」「例外処理パッケージ管理」「実行環境」の6つの観点で整理し、具体的なソースコード例を交えて備忘録がてら記載します。
初心者なので、間違っている場所があれば、教えて頂ければ幸いです。
1. 文法(Syntax)
Java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
- 厳密なセミコロン
;と波括弧{}が必須
- クラス定義とファイル名は一致させる必要あり
- エントリポイントは
public static void main(String[] args)
Python
def main():
print("Hello, Python!")
if __name__ == "__main__":
main()
- インデント(スペース/タブ)でブロックを表現
- セミコロンや波括弧不要
- エントリポイントは
if __name__ == "__main__":
2. 型システムと変数宣言
| 項目 |
Java |
Python |
| 型付け |
静的型付け(compile-time) |
動的型付け(run-time) |
| 変数宣言 |
明示的に型を指定 |
宣言時に型指定不要 |
| 型安全性 |
高い(コンパイル時に型チェック) |
低い(実行時にエラー発生) |
Java の例
int count = 5; // 変数countはint型、5はint型値(オブジェクトではない)
String message = "Hi"; // 変数messageはString型、"Hi"はString型オブジェクト
Python の例
count = 5 # 変数countには型がない、5はint型オブジェクト
message = "Hi" # 変数messageには型がない、"Hi"はstr型オブジェクト
3. オブジェクト指向機能
クラス定義とコンストラクタ
Java
public class Person {
private String name;
private int age;
public Person(String name, int age) { // コンストラクタ
this.name = name;
this.age = age;
}
public void greet() {
System.out.println("Hi, I'm " + name);
}
}
Python
class Person:
def __init__(self, name: str, age: int): # コンストラクタ
self.name = name
self.age = age
def greet(self) -> None:
print(f"Hi, I'm {self.name}")
継承と抽象化
| 機能 |
Java |
Python |
| 抽象クラス |
abstract classキーワード |
abcモジュールのABC継承+@abstractmethod
|
| インターフェース |
interface構文 |
Protocol(typing.Protocol) |
| 多重継承 |
クラス多重継承不可、インターフェース多重実装OK |
クラス多重継承OK |
Java の抽象クラス例
abstract class Animal {
abstract void speak();
void sleep() { System.out.println("Sleeping"); }
}
class Dog extends Animal {
@Override
void speak() { System.out.println("Bark"); }
}
Python の抽象クラス例
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self) -> None:
pass
def sleep(self) -> None:
print("Sleeping")
class Dog(Animal):
def speak(self) -> None:
print("Bark")
4. 例外処理(Error Handling)
| 特徴 |
Java |
Python |
| 宣言 |
throwsまたはtry-catch必須 |
try-exceptで捕捉 |
| チェック例外/非チェック例外 |
チェック例外(IOException等)あり |
すべて非チェック例外 |
Java
public void readFile() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
String line = br.readLine();
} finally {
br.close();
}
}
Python
def read_file():
try:
with open("file.txt") as f:
line = f.readline()
except FileNotFoundError:
print("ファイルが見つかりません")
5. パッケージ管理と依存性
| 項目 |
Java |
Python |
| パッケージ管理 |
Maven, Gradle |
pip, Poetry |
| モジュールの構成 |
packageディレクトリ+pom.xml
|
requirements.txt または pyproject.toml
|
| 名前空間 |
パッケージ名 |
モジュール名 |
6. 実行環境と配布
-
Java
-
.java→.classコンパイル→JVM上で実行
- JARファイルで配布
-
Python
- スクリプトを直接実行(
.py)
- バイナリ化にはPyInstaller等を利用
結論
Javaは「静的型付け」「厳密な構文」「チェック例外」を特徴とし、大規模開発や堅牢性重視に適しています。
Pythonは「動的型付け」「簡潔な文法」「豊富な標準ライブラリ」を持ち、スクリプト、データ分析、機械学習など幅広い分野での迅速な開発に向いています。