JavaとPythonで文法の違いを比較してみた
はじめに
😺「PythonのコードをJavaに書き換えると何になるんだろ?」
Python学習中に私が感じたこのような疑問を晴らす為に、学習がてらJavaとPythonの文法を比較しながらチートシート風でまとめてみました。
この記事では、それぞれの言語でよく使うであろう文法をメインでまとめています。
また、文法だけでなく命名規則の違いについても比較してみましたので、何かのお役に立てれば嬉しいです!
コーディング規約 / 命名規則
それぞれ以下のコーディング規約をもとに比較してみました。
Java
Python
比較してみると、元々のコードレイアウトに違いがあるのは勿論なのですが、命名規則に特徴的な違いがありました。
言語間の文法だけ覚えても、命名規則が違っていると「Pythonだとこの書き方でいいのかな…?」といったような不安が出ると思ったので、以下に命名規則をまとめてみました。
関数名・変数名
Java
-
Lower camel caseを使用
- 最初の単語の頭文字を小文字にし、残りの単語の頭文字は大文字にして繋げる記法
// 関数名
void myMethod()
// 変数名
String myName;
Python
- 小文字とアンダースコア(_)のみにする
# 関数名
def my_method
# 変数名
my_name
パッケージ名
Java
- すべて小文字にする
mypackage
Python
- 小文字の短い名前にする
- アンダースコアが使用可能だが非推奨
mypackage
クラス名
Java
-
Upper camel caseを使用
- 単語の先頭を大文字にして繋げる記法
public class MyClass {
}
Python
-
CapitalizedWords(CapWords) を使用
- 最初の1文字を大文字にし、次の文字からcamel caseを用いる記法
- 記法はUpper camel caseと同じ
class MyClass:
引数名
Java
- Lower camel caseを使用
public void myMethod(int param1, String param2) {
}
Python
- インスタンスメソッドの場合は第一引数に
self
をつける - クラスメソッドの場合は第一引数に
cls
をつける
# インスタンスメソッド
def my_method(self, param1, param2):
# クラスメソッド
@classmethod
def my_classmethod(cls, param1):
定数名
Java
- すべて大文字にし、単語はアンダースコアで区切る
private static final int MAX_LENGTH = 100
Python
- Javaと同じ
MAX_LENGTH = 100
変数
- Pythonは変数の型を自動的に判別してくれるので、Javaと違ってデータ型の定義は不要
- ただし、型はちゃんと存在しているので、文字列を無理矢理数値として扱うことはできない
- Javaと違い、Pythonでは必ず初期値を入れる必要がある
- Pythonには定数という概念がない
- その為、定数として扱う場合は命名規則に従って変数名をすべて大文字にしておいた方がいいとされる
int(数値型)
int age = 20;
age = 20
String(文字型)
String message = "Hello";
message = 'Hello'
Bool(Boolean)
Boolean isStudent = false;
is_student = False
定数
final String MY_NAME = "Mario";
MY_NAME = 'Mario'
- Python2とPython3でprintの記述が異なる
- 今回はPython3の記述方法で記載
改行あり
System.out.println("Hello World!");
print('Hello World!')
改行なし
System.out.print("Hello World!");
print('Hello World!', end='')
変数の値を表示
String name = "Mario";
System.out.println("My name is %s", name);
name = 'Mario'
print('My name is %s' % name)
数値⇄文字列変換
数値→文字列
int point = 70;
System.out.println("点数 = " + String.valueOf(point));
point = 70
print('点数 = ' + str(point))
文字列→数値
String point = 70;
System.out.println("点数 = " + Integer.parseInt(point));
point = '70'
print('点数 = ' + int(point))
if文
- 書き方は違うが、考え方はどちらも同じ
int age = 18;
if (age < 20) {
System.out.println("お酒は飲めません");
}
age = 18
if age < 20:
print('お酒は飲めません')
switch文 / match文
- Pythonではswitch文が存在しない
- 代わりにPython3.10からswitch文と同様の構文であるmatch文が導入された
- match文はbreakの記述が不要
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;
}
number = 2
match number:
case 1:
print('1を選びました')
case 2:
print('2を選びました')
case 3:
print('3を選びました')
case _:
print('1~3以外を選びました')
for文
配列のループ(拡張for文)
String[] itemList = {"item1", "item2", "item3"}
for (String item: itemList) {
System.out.println(item);
}
item_list = ['item1', 'item2', 'item3']
for item in item_list:
print(item)
回数指定ループ
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
for i in range(10):
print(i)
while文
int count = 0;
while (count < 10) {
System.out.println("count = " + count);
count++;
}
count = 0
while count < 10:
print('count = ' + str(count))
count += 1
List
Listの定義
List<String> wordList = new ArrayList<>(Arrays.asList("あ", "い", "う"));
word_list = ["あ", "い", "う"]
末尾に要素を追加
wordList.add("え");
word_list.append("え")
要素を置換
wordList.set(2, "お");
word_list[2] = "お"
index指定で要素を取得
String word = wordList.get(1);
word = word_list[1]
要素数を取得
wordList.size();
len(word_list)
指定した要素がListに含まれているか確認
wordList.contains("あ");
"あ" in word_list
index指定で要素を削除
wordList.remove(1);
del word_list(1)
Map
Mapの定義
Map<Integer, String> itemDict = new HashMap<>();
item_dict = {'apple':1, 'orange':2, 'grape': 3}
要素を追加
itemDict.put(4, "melon");
item_dict[4] = 'melon'
キーを変更
itemDict.put(10, "apple");
item_dict['apple'] = 10
値を変更
itemDict.replace(3, "banana");
item_dict[3] = 'banana'
要素数を取得
itemDict.size;
len(item_dixt)
キーを指定して値を削除
itemDict.remove(2);
item_dict.pop[2]
クラス・メソッド定義
- Pythonにはアクセス修飾子がない
- もしPythonでprivateとしたい場合、クラス名の先頭にアンダースコアを付ける例が多い
public class Article {
private String name;
// コンストラクタ
public Article(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
class Article:
# コンストラクタ
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
おわりに
ここまで読んでいただきありがとうございます!
学習しながらの記載だったので、記事を書きながら私もたくさんの事を学べて楽しかったです。
ただ、私がどっちかというとJavaのエンジニアなので、少しJava寄りな内容になってしまったかもしれません。
今回は文法だけでなく、命名規則などの書き方に関する部分にも踏み込んでみました。
そのきっかけは、コーディング規約のドキュメントを読んでみたらメソッド名の規則がJavaとPythonで全然違ったことと、Pythonエンジニアの知人がJavaのコードを書いている時に命名規則がごちゃ混ぜになっていたのを見たからです。
「これは文法だけでなく規則まで抑えておかないと絶対間違えて書いちゃう!」と思ったので、この記事内でまとめてみました。
まだまだ比較対象にできる文法はあるので、需要があれば追記するかもしれないです。
もし「ここはこういう書き方が分かりやすいよ!」とか「ここの書き方間違ってるよ!」みたいな箇所があれば是非教えていただきたいです!
参考にさせていただいた記事
Discussion