注:これまでpython、javascriptを独学で学んだ中の人がしっかりとしたスクールでjavaを学んで異業種転職を目指す道のりを日々記録しています。
一番最初の投稿ではありますが、入学から1週間経過してしまっているので内容が少し飛んでます。
メソッドについて
メソッドの定義(教科書より)
複数の文をまとめ、それを1つの処理として名前を付けたもので、部品の最小単位です。
個人の感想、気づいたこと
-
これまで学んできた言語ではメソッドの型まで気にすることはなかったので、改めて静的型付けと動的型付けの違いを実感する部分
-
publicはともかく、staticはまだ謎
-
これまでvoidで記述してきた部分が返り値に対応させて記述する部分のようである
-
また引数にも型の指定が必要
-
あとで解説されて気づいたことだが、mainメソッドで決まるごとのように記述していたString[] argsもメソッドの引数であることを理解
-
java クラス名 なんやらかんやら
↑のコマンドライン引数はあーそうだったのか!と思わずガッテンとしたくなっちゃいました。これ自分で簡易的なテストをやりたいときにすごく役立ちそうです。 -
当たり前ではあるのだが、メソッド名が適当なのは本当によくない。これまでの個人開発で、昨日作った関数の内容の詳細を忘れることすらよくある。個人開発ですらこれなので、チーム開発ではなおのこと、メソッドが何をしてくれるものであるかが直感的にわかる名称にすることは必須であることを体験済み。私は昨日の自分すら信用できん。
-
これまで学んだ言語ではなかった機能:オーバーロード。静的型付けだからできる機能なんだろうが、今はまだ初学者ゆえに似た関数の管理が大変になるのではとかだったら動的型付けの方がまだ使いやすいとかここではあまり有用性を感じられず
特に気になったこと
今回一番の疑問であったのが配列による参照渡し。これだと元の配列は維持して、メソッドに渡して処理してもらったものを新たに扱うということができない。当然配列をコピーしてそれを渡すのだろうが、これまでの知識で
public class Main {
public static void main(String[] args) {
int[] arrayA = {1, 2, 3};
int[] arrayB = arrayA;
arrayB = methodA(arrayB);
printArray(arrayA);
printArray(arrayB);
}
public static void printArray(int[] array) {
for (int value: array) {
System.out.println(value);
}
}
public static int[] methodA(int[] array) {
array[0] = 100;
return array;
}
}
と記述するとやはり副作用でarrayA[0]も100になっている。
これに関してgeminiくんに尋ねてみると
Javaのメソッド内で元の配列を変更せず、安全に新しい配列として操作したい場合は、「メソッドの呼び出し側」または「メソッドの内部」で配列を複製(コピー)するのが開発現場の標準的なアプローチです。Javaは厳密には「参照渡し」ではなく「参照値の(値)渡し」であるため、メソッド内で配列要素を書き換えると、呼び出し元の配列も書き換わってしまいます(副作用)。これを防ぐための推奨されるコーディング方法を整理しました。
- clone() メソッド (最も手軽)
- Arrays.copyOf() (サイズ変更も可能)
- System.arraycopy() (高速・部分的コピー)
ほか略
と、まだ学んでいないコードばかり。とりあえず考え方はあっていたので、今回これ以上の深堀りはせず。このあたりはpythonのdataframeを扱うときにでていた警告で、明示的にコピーであることを示しなさいとか言われてたので、そういった対応でいいようですね。
以上、つらつらと書いただけでまとまってはいませんが、何か間違いや指摘、新しい知識をご教示いただける方はコメントお願いします。