Java入門〜前編〜

前書き

ゴールデンウィーク中に新しい何かを勉強したいと思い、思い切ってJavaの勉強を始めました。
Javaを勉強すると決めた理由は以下の四点です。

今回は①基礎文法編という事で、Javaに関する豆知識と文法についておさらいします。

JavaJVM

Javaを動作させる上で、書いたプログラムはOSには依存しません。これはJava仮想マシン(=JVM)がソフトウェアとして存在するためです。
Javaで書いたソースコードJVMを通して、環境に依存する機械語に翻訳されます。実際は"ソースコード"をJavaコンパイラが"バイトコード"に、"バイトコード"をJVMが各OSに依存する機械語に翻訳されます。

JVMにより機械語翻訳される言語には他にもKotlinやScalaJythonなどが有名です。ただしCやC++のような完全コンパイラ言語に比べると、実行速度が遅いようですが、現代のメモリの進化により気にはならない程度です。

Java〜基礎文法〜

まずどこに書くねん

Javaはクラスブロックとメソッドブロックにより構成されており、初心者はメソッドブロックの内部から簡単なプログラムを記述します。

// クラスブロック
public class Helloworld {
  // メソッドブロック
  public static void main(String[] args) {
  // ここに記述
  }
}

出力

長ったらしいな〜。

System.out.println(("Hello world"));

Hello world

変数定義

doubleやfloatは浮動小数点型であり、doubleの方がfloatより厳密な計算ができる特徴があります。
変数型定義の前に"final"を追加する事で定数化できます。

final byte _byte = 126;
final short _short = 3000;
final int _int = 1000000;
final long _long = 10000000L;
final double _double = 0.23;
final float _float = 0.23F;
final boolean _boolean = true;
final char _char = '日';
final String _string = "hello World";

演算子

演算子での注意点は 除算(A/B)をした場合に、割り切れない場合、商は自動的に切り捨て値になります。

int num1 = 8;
int num2 = 8;
String str1 = "hello!  : ";
int num3 = num1 / num2;
System.out.println(str1 + num3);

hello!  : 1

加算処理(++を後ろ)

num4にnum1を代入した後、num1に加算処理をします。そのためnum4は加算される前のままです。

int num4 = num1++;
str1 = "num1++  : ";
System.out.println(str1 + "num1: " + num1);
System.out.println(str1 + "num4: " + num4);

num1++  : num1: 9
num1++  : num4: 8

加算処理(++を前)

num2を加算した後、num5にnum2を代入をします。そのためnum5は加算された状態です。

int num5 = ++num2;
str1 = "++num1  : ";
System.out.println(str1 + "num2: " + num2);
 System.out.println(str1 + "num5: " + num5);

++num1  : num2: 9
++num1  : num5: 9

型の自動変換

小さな型の変数から大きな型の変数に代入するとき、代入先の型に合わせてくれます。ただ代入先が小さな型だとコンパイラエラーを発生させるので注意が必要です。

それでもそうしても代入させたい時、キャストを活用します。強制的に型変換を行ってくれます。

double x = 10.3;
int y = (int) x;

型変換

よく利用するのは"文字列"→"整数型"、"整数型"→"文字列”のようなパターンです。この場合は以下の通りです。

//        文字列→整数
String str3 = "1010101";
int num6 = Integer.parseInt(str3);
System.out.println(num6 + 9);
//        整数→文字列
String str4 = String.valueOf(num6);
System.out.println(str4 + '9');

1010110
10101019

配列

String[] teams = new String[]{"braves", "bluewave", "buffaloes"};
System.out.println("要素数: " + teams.length);
int[][] list = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
System.out.println("list[0][1] : " + list[0][1]);

要素数: 3
list[0][1] : 2

引数

ファイル実行時にコマンド末尾にパラメータを入力するよ使用可能です。

System.out.println("引数番号 :"+args[0]);

プリミティブ型 vs 参照型

参照型は配列や文字列が当てはまります。
参照型では変数に値は格納されず、値を格納したメモリの場所が格納されます。

Hoge hoge = new Hoge();
String str = "fuga";

その為、文字列の比較をするとき、"=="で単純比較すると、値を格納するメモリ場所を比較することになるので、常にfalseを返します。

String b = "abc";
String c = new String("abc");
System.out.println(a == c); // false
System.out.println(a.equals(c)); // true

ただString型の変数もnewせずに、リテラルで代入できます。これを擬似プリミティブ型と呼ばれています。

String a = "abc";
String b = "abc";
System.out.println(a == b); // true
System.out.println(a.equals(b)); // true

制御(forとif)

String[] teams = new String[]{"braves", "bluewave", "buffaloes"};
for (int i = 0; i < teams.length; i++) {
      System.out.println((i + 1) + "番目の要素: " + teams[i]);
 }

1番目の要素: braves
2番目の要素: bluewave
3番目の要素: buffaloes

for文とif文を使って遊んでみます。

for (int j = 1; j < 10; j++) {
        String str8 = "";
        for (int k = 1; k < 10; k++) {
            if (k == j || k + j == 10) {
                str8 = str8 + "  " + " ";
             } else {
                 str8 = str8 + String.valueOf(j) + String.valueOf(k) + " ";
             }
         }
         System.out.println(str8);
    }

   12 13 14 15 16 17 18    
21    23 24 25 26 27    29 
31 32    34 35 36    38 39 
41 42 43    45    47 48 49 
51 52 53 54    56 57 58 59 
61 62 63    65    67 68 69 
71 72    74 75 76    78 79 
81    83 84 85 86 87    89 
   92 93 94 95 96 97 98  

メソッド

メソッドはmainの外で定義して、実行に関してはmain内で記述しました。
今回は一例ですが、メソッドは後にオブジェクト指向で非常に重要な概念となります。

メソッド名は同じ名前(join)ですが、引数となる変数・型の違いで区別できます。
これをオーバーロード(多重定義)と呼びます。

static String join(String name, int number) {
        String str9 = name + " : " + String.valueOf(number);
        return str9;
}

static void join(int[] list) {
        String ans = "Starting Member : ";
        for (int l = 0; l < list.length; l++) {
            ans = ans + list[l] + " ";
        }
        System.out.println(ans);
    }

public static void main(String[] args) {
       String answer = join("ICHIRO", 51);
       System.out.println(answer);

  int[] list2 = {6, 67, 34, 99, 1, 10, 24, 2, 31};
        join(list2);
}

ICHIRO : 51
Starting Member : 6 67 34 99 1 10 24 2 31