💱

JavaとPythonで文法の違いを比較してみた

に公開

はじめに

😺「PythonのコードをJavaに書き換えると何になるんだろ?」

Python学習中に私が感じたこのような疑問を晴らす為に、学習がてらJavaとPythonの文法を比較しながらチートシート風でまとめてみました。
この記事では、それぞれの言語でよく使うであろう文法をメインでまとめています。
また、文法だけでなく命名規則の違いについても比較してみましたので、何かのお役に立てれば嬉しいです!

コーディング規約 / 命名規則

それぞれ以下のコーディング規約をもとに比較してみました。

Java

https://future-architect.github.io/coding-standards/documents/forJava/

Python

https://pep8-ja.readthedocs.io/ja/latest/

比較してみると、元々のコードレイアウトに違いがあるのは勿論なのですが、命名規則に特徴的な違いがありました。
言語間の文法だけ覚えても、命名規則が違っていると「Pythonだとこの書き方でいいのかな…?」といったような不安が出ると思ったので、以下に命名規則をまとめてみました。

関数名・変数名

Java

  • Lower camel caseを使用
    • 最初の単語の頭文字を小文字にし、残りの単語の頭文字は大文字にして繋げる記法
java
// 関数名
void myMethod()

// 変数名
String myName;

Python

  • 小文字とアンダースコア(_)のみにする
python
# 関数名
def my_method

# 変数名
my_name

パッケージ名

Java

  • すべて小文字にする
java
mypackage

Python

  • 小文字の短い名前にする
  • アンダースコアが使用可能だが非推奨
python
mypackage

クラス名

Java

  • Upper camel caseを使用
    • 単語の先頭を大文字にして繋げる記法
java
public class MyClass {

}

Python

  • CapitalizedWords(CapWords) を使用
    • 最初の1文字を大文字にし、次の文字からcamel caseを用いる記法
    • 記法はUpper camel caseと同じ
python
class MyClass:

引数名

Java

  • Lower camel caseを使用
java
public void myMethod(int param1, String param2) {

}

Python

  • インスタンスメソッドの場合は第一引数にselfをつける
  • クラスメソッドの場合は第一引数にclsをつける
python
# インスタンスメソッド
def my_method(self, param1, param2):

# クラスメソッド
@classmethod
def my_classmethod(cls, param1):

定数名

Java

  • すべて大文字にし、単語はアンダースコアで区切る
java
private static final int MAX_LENGTH = 100

Python

  • Javaと同じ
python
MAX_LENGTH = 100

変数

  • Pythonは変数の型を自動的に判別してくれるので、Javaと違ってデータ型の定義は不要
    • ただし、型はちゃんと存在しているので、文字列を無理矢理数値として扱うことはできない
  • Javaと違い、Pythonでは必ず初期値を入れる必要がある
  • Pythonには定数という概念がない
    • その為、定数として扱う場合は命名規則に従って変数名をすべて大文字にしておいた方がいいとされる

int(数値型)

java
int age = 20;
python
age = 20

String(文字型)

java
String message = "Hello";
python
message = 'Hello'

Bool(Boolean)

java
Boolean isStudent = false;
python
is_student = False

定数

java
final String MY_NAME = "Mario";
python
MY_NAME = 'Mario'

print

  • Python2とPython3でprintの記述が異なる
    • 今回はPython3の記述方法で記載

改行あり

java
System.out.println("Hello World!");
python
print('Hello World!')

改行なし

java
System.out.print("Hello World!");
python
print('Hello World!', end='')

変数の値を表示

java
String name = "Mario";
System.out.println("My name is %s", name);
python
name = 'Mario'
print('My name is %s' % name)

数値⇄文字列変換

数値→文字列

java
int point = 70;

System.out.println("点数 = " + String.valueOf(point));
python
point = 70

print('点数 = ' + str(point))

文字列→数値

java
String point = 70;

System.out.println("点数 = " + Integer.parseInt(point));
python
point = '70'

print('点数 = ' + int(point))

if文

  • 書き方は違うが、考え方はどちらも同じ
java
int age = 18;

if (age < 20) {
    System.out.println("お酒は飲めません");
}
python
age = 18

if age < 20:
    print('お酒は飲めません')

switch文 / match文

  • Pythonではswitch文が存在しない
  • 代わりにPython3.10からswitch文と同様の構文であるmatch文が導入された
  • match文はbreakの記述が不要
java
int number = 2;

switch (number) {
    case 1:
        System.out.println("1を選びました");
        break;
    case 2:
        System.out.println("2を選びました");
        break;
    case 3:
        System.out.println("3を選びました");
        break;
    default:
        System.out.println("1~3以外を選びました");
        break;
}
python
number = 2

match number:
    case 1:
        print('1を選びました')
    case 2:
        print('2を選びました')
    case 3:
        print('3を選びました')
    case _:
        print('1~3以外を選びました')

for文

配列のループ(拡張for文)

java
String[] itemList = {"item1", "item2", "item3"}

for (String item: itemList) {
    System.out.println(item);
}
python
item_list = ['item1', 'item2', 'item3']

for item in item_list:
    print(item)

回数指定ループ

java
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}
python
for i in range(10):
    print(i)

while文

java
int count = 0;

while (count < 10) {
    System.out.println("count = " + count);
    count++;
}
python
count = 0

while count < 10:
    print('count = ' + str(count))
    count += 1

List

Listの定義

java
List<String> wordList = new ArrayList<>(Arrays.asList("あ", "い", "う"));
python
word_list = ["あ", "い", "う"]

末尾に要素を追加

java
wordList.add("え");
python
word_list.append("え")

要素を置換

java
wordList.set(2, "お");
python
word_list[2] = "お"

index指定で要素を取得

java
String word = wordList.get(1);
python
word = word_list[1]

要素数を取得

java
wordList.size();
python
len(word_list)

指定した要素がListに含まれているか確認

java
wordList.contains("あ");
python
"あ" in word_list

index指定で要素を削除

java
wordList.remove(1);
python
del word_list(1)

Map

Mapの定義

java
Map<Integer, String> itemDict = new HashMap<>();
python
item_dict = {'apple':1, 'orange':2, 'grape': 3}

要素を追加

java
itemDict.put(4, "melon");
python
item_dict[4] = 'melon'

キーを変更

java
itemDict.put(10, "apple");
python
item_dict['apple'] = 10

値を変更

java
itemDict.replace(3, "banana");
python
item_dict[3] = 'banana'

要素数を取得

java
itemDict.size;
python
len(item_dixt)

キーを指定して値を削除

java
itemDict.remove(2);
python
item_dict.pop[2]

クラス・メソッド定義

  • Pythonにはアクセス修飾子がない
  • もしPythonでprivateとしたい場合、クラス名の先頭にアンダースコアを付ける例が多い
java
public class Article {

    private String name;

    // コンストラクタ
    public Article(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}
python
class Article:

    # コンストラクタ
    def __init__(self, name):
        self.name = name

    def get_name(self):
        return self.name

おわりに

ここまで読んでいただきありがとうございます!

学習しながらの記載だったので、記事を書きながら私もたくさんの事を学べて楽しかったです。
ただ、私がどっちかというとJavaのエンジニアなので、少しJava寄りな内容になってしまったかもしれません。

今回は文法だけでなく、命名規則などの書き方に関する部分にも踏み込んでみました。
そのきっかけは、コーディング規約のドキュメントを読んでみたらメソッド名の規則がJavaとPythonで全然違ったことと、Pythonエンジニアの知人がJavaのコードを書いている時に命名規則がごちゃ混ぜになっていたのを見たからです。
「これは文法だけでなく規則まで抑えておかないと絶対間違えて書いちゃう!」と思ったので、この記事内でまとめてみました。

まだまだ比較対象にできる文法はあるので、需要があれば追記するかもしれないです。
もし「ここはこういう書き方が分かりやすいよ!」とか「ここの書き方間違ってるよ!」みたいな箇所があれば是非教えていただきたいです!

参考にさせていただいた記事

https://zenn.dev/web_tips/articles/b4f24f4c9abf0d

https://www.lifewithpython.com/2021/06/python-structual-pattern-matching.html

https://www.modis.co.jp/candidate/insight/column_98

https://www.modis.co.jp/candidate/insight/column_127

https://qiita.com/Fendo181/items/a934e4f94021115efb2e

Discussion