納豆天国風Java講座

0. まえがき

今年の定演曲、「おらしょ」に出てくる曲"O Gloriosa Domina"は、ラテン語の曲です。ラテン語とは、キリスト教を国教としていたローマ帝国の公用語です。西洋音楽と関わる限り、西洋文明を生み出した母体であるキリスト教は、切っても切れない関係にあります。実際、自分が白ばらと関わった6年間の定演曲を見てみると、自分が幹部だったときの"Cantus Missæ"(ミサの歌)を始めとして、至る所にラテン語の宗教曲が顔を出しています。その流れで、去年のばらの木に、5年間の知識の集大成として、「納豆天国風ラテン語入門講座」を発表しました。

その評価は皆さんにお任せするとしまして、今年も何か自由投稿が欲しいということで、各方面から声がかかりました。テーマを何にするか? 茗荷谷さくら水産で、Javaなんかがいいんじゃないのか、という話になりました。なかなか面白いテーマだと思いますが、ばらの木の限られたページで入門講座は無理に思えました。そこで、Java初心者が躓きやすい、「オブジェクト指向」についてテーマを絞って、今年のばらの木自由投稿にしたいと思います。Javaに興味が無い人は、どうぞ読み飛ばしてください。

1. オブジェクト指向抜きで考えてみる

今回、プログラムするのは「スタック」と呼ばれるデータ構造です。これは、最後に格納(push)したデータから順番に引き出し(pop)ていく、データの集まりです。これをオブジェクト指向抜きでプログラミングすると、以下のようになります。

class Stack {
    Stack0 stack0;
    static void initialize(Stack stack) {
        stack.stack0 = null;
    }
    static void push(Stack stack, Object object) {
        Stack0 newStack0 = new Stack0();
        Stack0.initialize(newStack0, object, stack.stack0);
        stack.stack0 = newStack0;
    }
    static Object pop(Stack stack) {
        Object object = stack.stack0.element;
        stack.stack0 = stack.stack0.next;
        return object;
    }
}
class Stack0 {
    Object element;
    Stack0 next;
    static void initialize(Stack0 stack0, Object element, Stack0 next) {
        stack0.element = element;
        stack0.next = next;
    }
}

これを、実際のプログラムから利用することを考えます。ここで、スタックのデータ構造を表す変数stackが、メソッドの引数として扱われているところに気をつけておいてください。以下のプログラムは、先ほどのスタックを利用するプログラムです。

public class Main {
    public static void main(String[] args) {
        Stack stack = new Stack();
        Stack.initialize(stack);
        Stack.push(stack, "0");
        Stack.push(stack, "1");
        System.out.println(Stack.pop(stack));
    }
}

2. オブジェクト指向で考えてみる

今度は、同じプログラムをオブジェクト指向で考えてみます。

class Stack {
    Stack0 stack0;
    Stack() {
        this.stack0 = null;
    }
    void push(Object object) {
        Stack0 newStack0 = new Stack0(object, this.stack0);
        this.stack0 = newStack0;
    }
    Object pop() {
        Object object = this.stack0.element;
        this.stack0 = this.stack0.next;
        return object;
    }
}
class Stack0 {
    Object element;
    Stack0 next;
    Stack0(Object element, Stack0 next) {
        this.element = element;
        this.next = next;
    }
}

これを利用するのは、

public class Main {
    public static void main(String[] args) {
        Stack stack = new Stack();
        stack.push("0");
        stack.push("1");
        System.out.println(stack.pop());
    }
}

のようになります。先のプログラムでは引数に過ぎなかった変数stackが、ここではメソッドを呼び出す主体になっているのがわかるでしょうか。このように、データ構造の操作をデータ構造そのものにくくりつけて、操作の対象をはっきりとさせる、というのがオブジェクト指向の本質です。

3. あとがき

正直、説明不足な感は否めませんが、詳しく知りたい人は、気軽に声をかけてみてください。