RPGツクールと数学のブログ

RPGツクールと数学についてのブログです。

Javaによるオブジェクト指向講座 第1回

過去ブログの転載です。

なんだか本の名前みたいな記事タイトルですけど、そういうことです。昔C++でこういう講座を書いたので(C++版は公開停止中です)それのJava版です。オブジェクト指向が、全3回できっと理解できます。

なんでJavaなんだと言われるとそんなに意味がないですが、オブジェクト指向といえばJavaという風潮じゃーないですか。ということでJavaです。プログラミングをちょっとでもしたことのあるかた向けに記載していきますので、ご了承ください。

あとよく混同されるのですが、JavaScriptは名前が似てるだけで、Javaと完全に別物ですよ。どこかで見た例ですが、ハムハムスターぐらい違います。

Javaの開発環境はEclipseなどが有名ですが、実は何も導入しなくてもオンラインでプログラミングできるサイトがあります↓ Java以外にもいろんなコードを作成できて便利ですよ!

paiza.io

もくじ
・第1回 基本
第2回 クラス
第3回 継承
おまけ

第1回 基本

導入

今回はオブジェクト指向の話は出て来ないです。Javaの基本を把握し、配列ぐらいまでは理解出来るようになりましょう。

早速Javaのコードを書いておきます。

// サンプルコード
// 「//」から始まる行はコメントと見なされ、処理に無関係

class Main{
    public static void main(String args){
        System.out.println("ハローユーチューブ");
    }
}

単純に、「ハローユーチューブ」と表示するだけのコードです。

たったそれだけなのにこんなに色々書かなきゃいけないのは不思議ですね。Javaにはいろいろと決まりがあって、それに従っているので、たかが文字入力だけでこんな色々書くことになるのです。

次回に述べますが、Javaには「クラス」という概念があります。

一行目の「class Main」で、Mainという名前のクラスを作っていることになります。その中二行目の「public static void main(String args)」で、さらにmainという名前のメソッドを作っていることになります。クラスとかメソッドの説明は次回します。

そしてさらにその中三行目の「System.out.println("ハローユーチューブ" );」が「ハローユーチューブ」を表示させる命令というわけです。

つまり、上のコードは
「Mainクラス」の「mainメソッド」の中で、
「ハローユーチューブ」を表示させる処理を定義している、
という意味になります。

実際に表示に関係しているのは三行目だけということです。

↓このように書いてやれば、3行文字列が表示されることになります。

// サンプルコードの書き換え

class Main{
    public static void main(String args){
        System.out.println("こんにちは");
        System.out.println("今日は暑いですね");
        System.out.println("なので帰ってもう寝ます");
    }
}

「System.out.println」が、文字列を表示する命令です。それだけ覚えておきましょう。今回はMainクラスのmainメソッドの中身しかいじりません。

今後クラスやメソッドはたくさん出てくるのですが、mainメソッドの中に書いた処理が初めに実行されると決まっています。そのため、mainメソッドの中だけいじればとりあえずはプログラムが作れます。

変数について

このあたりは、他のプログラムを触っていれば分かりますね。大体の書き方はC言語などとも同じなので、さらっと書きます。

「変数」とは、データを格納するもののことです。数字でも文字でも、データだったらなんでも入れられます。変数の形を「型」といいます。

↓基本の型として、こんなものがあります。

int型:整数型(整数値を入れる)
double型:実数型(実数値を入れる)
boolean型:論理型(真(true)か偽(false)の2通り)
String型:文字列型(文字列を入れる)

変数の宣言は次のように、「型名」「変数名」の順に書きます。

int a;
String moji;

int型の変数aと、String型の変数mojiを宣言しています。宣言した変数に対し、「=」記号でデータを代入できます。JavaのString型では、足し算が文字列の連結を表します。

// 変数の宣言サンプル

class Main{
    public static void main(String args){
        int a;
        String moji;
        a = 100 / 2 + 50;
        moji = "きのこ" + "は" + "おいしい" + "かもしれない";
        System.out.println(a);
        System.out.println(moji);
    }
}

↓変数の図的イメージです。

f:id:fermiumbay13:20190802021109p:plain

型によってデータの入る受け箱の形が変わります。では、違う型の変数を代入するとどうなるでしょうか。

// 型が違うのでエラー

class Main{
    public static void main(String args){
        double a = 123.456;
        int c = a;
        System.out.println(c);
    }
}

これ↑の図イメージはこれ↓です

f:id:fermiumbay13:20190802021118p:plain

int型変数にdoubleのデータは入らないので、エラーになります。

こういう場合は、変数の型に合うよう変形しなければなりません。これをキャストといいます。データの頭に(int)と書けば、そのデータはintと見なされます。

// キャストで解決

class Main{
    public static void main(String args){
        double a = 123.456;
        int c = (int)a;
        System.out.println(c);
    }
}

こうすると、123.456の小数点以下を切り捨てた123が変数cに入ります。

数値の型変換などであれば上のようなキャストで十分なのですが、文字列と数値との変換は単なるキャストではできません。

// エラーになる

class Main{
    public static void main(String args){
        String moji = "123.456";
        double c = (double)moji;
        System.out.println(c);
    }
}

↑これもエラーになります。

文字列は単純な型ではないので、特別な書き方をしないといけません。色々やり方はありますが、valueOfを用いるのが便利です。

// 文字列→数値の変換

class Main{
    public static void main(String args){
        String s1 = "2400";
        String s2 = "123.456";
        int a = Integer.valueOf(s1);
        double b = Double.valueOf(s2);
        System.out.println(a);
        System.out.println(b);
    }
}

// 数値→文字列の変換

class Main{
    public static void main(String args){
        int a = 2400;
        double b = 123.456;
        String s1 = String.valueOf(a);
        String s2 = String.valueOf(b);
        System.out.println(s1);
        System.out.println(s2);
    }
}

変換したい型のvalueOfを使います。

int型がInteger、double型がDoubleになっているのに注意してください。それぞれ小文字と大文字は区別されます。

条件分岐

条件で処理を分岐することを条件分岐といいます。if文ですね。

// 条件分岐の例

class Main{
    public static void main(String args){
        int a = 2; // aに2をセットして宣言
        if(a == 1){
            System.out.println("aが1だよ!");
        }
        else if(a == 2){
            System.out.println("aは1じゃないけど2だよ!");
        }
        else{
            System.out.println("aはそれ以外だよ!");
        }
    }
}

上ではaの値で分岐していますね。aが1のとき、1じゃないけど2のとき、それ以外、の3通りで分けています。

条件分岐では次のような文法が使えます。

a == b : aとbが等しい(a=b)
a != b : aとbが等しくない(a≠b)
a >= b : aがb以上(a≧b)
a <= b : aがb以下(a≦b)
a > b : aがbより大きい(a>b)
a < b : aがbより小さい(a<b)
!p : 条件pじゃない
p && q : 条件pかつ条件q
p || q : 条件pまたは条件q

イコールは「==」なことに注意です。「=」は代入の意味ですからね。

配列変数

同じような変数がたくさんある場合、いちいち変数を宣言していたら面倒です。それらを一括して管理するものが配列です。

// 配列変数の宣言、代入、表示

class Main{
    public static void main(String args){
        int a
= new int[5];
        a[0] = 1;
        a[1] = 2;
        a[2] = 3;
        a[3] = 4;
        a[4] = 5;
        System.out.println(a[0]);
        System.out.println(a[1]);
        System.out.println(a[2]);
        System.out.println(a[3]);
        System.out.println(a[4]);
    }
}

配列の宣言は不思議な書き方をしますね。「int a = new int[5];」とあります。

これは、int型の配列を5個作り、配列変数aとして宣言するという意味です。newの意味も次回のクラスのところで触れます。要は5つのintデータが並んだものを、まとめてaと名付けたのです。

f:id:fermiumbay13:20190802021134p:plain

配列の番号を要素番号と言いますが、これは0番からついていることに注意です。aの0番目に1を、1番目に2を、……それぞれ代入していっています。

配列の初期化を行うときのみ、こんな風に簡単化することもできます。

// 配列変数の初期化の簡単化

class Main{
    public static void main(String args){
        int a = {1, 2, 3, 4, 5};
        System.out.println(a[0]);
        System.out.println(a[1]);
        System.out.println(a[2]);
        System.out.println(a[3]);
        System.out.println(a[4]);
    }
}

ややこしいですが、配列の中にさらに配列を入れることもできます。二重になった配列を二次元配列といいます。三重したら三次元配列、四重にしたら四次元配列です。

↓二次元配列の図的イメージです。
a[0]の中にa[0][0]、a[0][1]、a[0][2]
a[1]の中にa[1][0]、a[1][1]、a[1][2]
a[2]の中にa[2][0]、a[2][1]、a[2][2]
a[3]の中にa[3][0]、a[3][1]、a[3][2]
がそれぞれ入っていると捉えてください。

f:id:fermiumbay13:20190802021143p:plain

// 二次元配列変数の宣言、代入、表示

class Main{
    public static void main(String args){
        int a = new int[4][3];
        a[0][0] = 1;
        a[1][0] = 2;
        a[2][0] = 3;
        a[3][0] = 4;
        a[0][1] = 5;
        a[1][1] = 6;
        a[2][1] = 7;
        a[3][1] = 8;
        a[0][2] = 9;
        a[1][2] = 10;
        a[2][2] = 11;
        a[3][2] = 12;
        System.out.println(a[0][0] + ", " + a[1][0] + ", " + a[2][0] + ", " + a[3][0]);
        System.out.println(a[0][1] + ", " + a[1][1] + ", " + a[2][1] + ", " + a[3][1]);
        System.out.println(a[0][2] + ", " + a[1][2] + ", " + a[2][2] + ", " + a[3][2]);
    }
}

初期化の簡略化は次のようになります。なんでこんな書き方になるかは、前述のイメージで見ればわかりますね。a[0]に{1, 5, 9}を入れているという流れです。

// 二次元配列変数の初期化の簡単化

class Main{
    public static void main(String args){
        int a
= {{1, 5, 9}, {2, 6, 10}, {3, 7, 11}, {4, 8, 12}};
        System.out.println(a[0][0] + ", " + a[1][0] + ", " + a[2][0] + ", " + a[3][0]);
        System.out.println(a[0][1] + ", " + a[1][1] + ", " + a[2][1] + ", " + a[3][1]);
        System.out.println(a[0][2] + ", " + a[1][2] + ", " + a[2][2] + ", " + a[3][2]);
    }
}

繰り返し

せっかく配列を作っても、上のように地道に表示していたら、結局めんどくさくて意味がありません。配列は繰り返し処理でその効力を発揮します。

// 繰り返し

class Main{
    public static void main(String args){
        for(int i = 0; i < 5; i++){
            System.out.println(i);
        }
    }
}

繰り返しは上のように書きます。for文ですね。

for文はセミコロン「;」で区切られて3つの部分から成ります。
int i = 0 最初に行われる処理
i < 5 ループを繰り返す条件
i++ 繰り返すたびに行われる処理
初めに①整数i=0としてスタートし、ループの端に来たら③iに1足します。i++は、i = i + 1と同じ意味です。これが②i<5である間ずっと繰り返す、という書き方です。

では、何回ループすることになるでしょう?

初めi=0からスタート
1回目の処理を実行
ループの端に来たのでi加算、i=1、i<5なのでループ続行
2回目の処理を実行
ループの端に来たのでi加算、i=2、i<5なのでループ続行
3回目の処理を実行
ループの端に来たのでi加算、i=3、i<5なのでループ続行
4回目の処理を実行
ループの端に来たのでi加算、i=4、i<5なのでループ続行
5回目の処理を実行
ループの端に来たのでi加算、i=5、i<5を満たさないのでループ終了

ということで、5回繰り返されます。

なんだかややこしいので、だいたいセットで記憶されます。

for(int i = 0; i < 5; i++)

とあったら、5回繰り返しの意味になるし、

for(int i = 0; i < 100; i++)

とあったら、100回繰り返しの意味になります。終端の値だけ変えるのですね。

そして、もちろんループ内で変数iを使うことが可能です。これを利用して配列すべての要素へアクセスなんてことも出来るのです。

// 配列変数の要素を全部表示

class Main{
    public static void main(String args){
        int a
= {1, 2, 3, 4, 5};
        for(int i = 0; i < 5; i++){
            System.out.println(a[i]);
        }
    }
}

iは0からスタートするのを利用すれば、a[0]からa[4]までの5つの要素にアクセスできます。配列はこういうことが出来るので便利なのですね。

基本構文は以上です。他にも色々あるのですが、最低限これらが分かれば色々できそうですね。

次回はいよいよオブジェクト指向の話に入っていきます。

第2回