共通言語を学ぶ

なんでか知らんけど、javaが共通言語になっているみたいなんだよね。 理解不能なんだけども。 ということで、軽くやりますかね。

環境構築から

Javaの精神は、「ビルドワンス、らん絵にウェア」だった気がする。 つまり、OSごとに新たにコンパイルしなおしたりしなくていいってことなんだけど、 まあ、そういうのを実現するためには、新しいレイヤーを一枚かませないとだめなんだよね。 それが、JVMだね。 JVM (Java Virtual Machine) は、1 つの命令セットを持ち、メモリーを使用する抽象的な演算マシン。

で、JvMは、JVM専用のファイルじゃないと走らないって思っているんだけど、そうだよね? javacで、コンパイルして、JVMが読める形式に変換して、javaコマンドで実際に動かすって感じかな? で、JVMが読める形式っていうのが、classファイルだったと思うんだけど、どうなんかな。 そうですね。 で、.classはどのjvmでも動くようになっているんですね。つまり、一度コンパイルされたソースコードは、 jvmがあるおかげでどこでも動くって話だ。

で、よく見るjarファイルってのが、.classがいっぱい入っているzipファイルなんだよね。 あれ、java -jarとかですぐ実行できるやん?そういうことや。

JDK = java development kit これには何が入っているんだ。はい、わかりやすいね。

このきーた が。 JDKはJREを内包している。そして、JREはJVMを内包している。 JDKはコンパイラとデバッガを内包している。 つまり、JDKはjavacとを含んでいる。 んで、JREはjava runtime environmentだから、jvmとc/c++でいう標準ライブラリを含んでいる。 javaコマンドは、JVM上で.classファイルを動かすためにあるんだと思う。そんな気がする。そうです。

つまり、結局はJDKをインストールすればコンパイルと実行はできるようになるってことです。

sudo apt install openjdk-17-jdk-headless

これで、jreを入る。 環境構築完了。

補足知識

「具体的には、jarファイルはコンパイル済みのclassファイルや画像などのファイルを、zip形式に圧縮してまとめたファイルです。」

コンパイルから実行までのながれ

まず、ソースコードを書きます。拡張子は、.java

class Hello {
    public static void main(String[] args) {
        System.out.println("初めてのJava program");
        System.out.println("画面に表示");
    }
}

で、ファイル名は、クラス名と一致させるのがいいみたいですね。つまり、ファイル名は、Hello.javaになります。 で、javacで中間コードにコンパイルします。

javac Hello.java

出てくるのは、Hello.classってファイルです。 んで、実行するときは、

java Hello

だけでいいっす。

でも、じつは、

java Hello.java

だけでも実行はされる。しかし内部でおそらくjavacで一度コンパイルしているので、コンパイルされた方を直接実行する方が早かったりします。

1章に関するスキミング

全部がくらす?になっているみたい。 mainもメソッドとして実現されている。

文字列の結合は、普通にできる

2章のスキミング

変数についての章ですね。

キーボードからの入力。これは大事。

import java.util.Scanner;

class ArithInt {
    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);

        System.out.print("xの値:");
        int x = stdIn.nextInt();

        System.out.print("yの値:");
        int y = stdIn.nextInt();
        System.out.printf("x*y = %d\n",x*y);
    }
}

こんな感じでスキャナーを準備してやりますね。

まあ、基本的な変数型はそろっていますね。 String型もありますと。 ストリング関係の。

import java.util.Scanner;

class StringTest {
    public static void main(String[] argv) {
        Scanner stdIn = new Scanner(System.in);

        System.out.print("お名前は");
        String name = stdIn.next();

        System.out.println("こんにちは。" + name + "さん");

        for (int i = 0; i < name.length(); i++) {
            System.out.println("yaa");
        }

        for (int i = 0; i < name.length(); i++) {
            System.out.printf("%c", name.charAt(i));
        }
    }
}

3章のスキミング

if文ね。

4章のスキミング

for文とwhile文、do-while文

5章

基本型。

6章

配列。 変数の宣言と、実際のオブジェクトの生成は別。

int [] a = new int[5]

的な感じ。 .lengthで要素数にアクセスできる。 多次元配列ももちろん作れます。

int [][] ma = new int[5][6];

7章

メソッド

8章

クラス これだけはちゃんとやっておこうか。読み込み方は知っておきたいからね。 メインからは読み込まなくても、同じディレクトリ内にあれば勝手に読み込まれる。これは便利だね。c/c++とは違う。 c/c++は、ヘッダーで読み込んで、最後にリンク。

9章

関数をどうやって呼び出すのか。再起関数とか、そういうけい。 すべてがメソッドだから、関数もメソッドだったわ。わりーな。

その他、データ構造