CとJavaによるオブジェクト指向プログラミング

〈プログラミングの原則〉
一つのプログラムの中に同じようなコードを重複して記述しないこと!


オブジェクト:変数(variable)とその変数を操作する関数(function)の集まり。状態(state)と動作(behaviour)を有する対象。

クラスは鋳型で、インスタンスはクラスから生成される鋳物です。複数のインスタンスをクラスから生成することができます。
オブジェクト指向プログラミングは、以下の場合に用いられます。

  - 変数を複数の関数で共有する場合
  - 状態遷移や状態に依存する関数を記述する場合
  - 2種類の変数に依存する関数を、引数とメンバー変数の関数として表現する場合

注)クラスは、変数や関数を分類するための一種の名前空間です。
注)クラスとインスタンスを総称してオブジェクト(object)と呼ぶことがあります。
注)C++ではメンバー変数(member variable)が、Javaではフィールド(field)が、オブジェクトの状態を表します。
注)手続き型プログラミングは、プログラムの中に頻繁に現れるステートメント(statement)の集まり(手続き)をサブルーチン(subroutine)として再利用するプログラミング技法のことです。
注)オブジェクト指向プログラミングは、関連する変数と手続き(procedure)の集まりをオブジェクト(object)として再利用するプログラミング技法のことです。


以下の例のように、C言語グローバル変数や参照渡しを使ったプログラムは、オブジェクト指向プログラミングで書き換えることができます。


C言語によるオブジェクト指向風プログラミング(複数のインスタンスを生成できない)

robot.h

#pragma once

//extern double x, y;
extern void setRobot(double, double);
extern void moveRobot(double, double);
extern void printRobot(void);
 

 

robot.c

#include <stdio.h>

static double x, y;

void setRobot(double x0, double y0) {
  x = x0;
  y = y0;
}

void moveRobot(double dx, double dy) {
  x += dx;
  y += dy;
}

void printRobot(void) {
  printf("x = %f\n", x);
  printf("y = %f\n", y);
}
 

 

main.c

#include "robot.h"

int main(void) {
  setRobot(0, 0);
  moveRobot(1, 1);
  printRobot();
}
 

C言語によるオブジェクト指向風プログラミング(複数のインスタンスを生成できる)

robot.h

#pragma once

typedef struct {
  double x, y;
} Robot;

extern void setRobot(Robot*, double, double);
extern void moveRobot(Robot*, double, double);
extern void printRobot(Robot*);
 

 

robot.c

#include "robot.h"
#include <stdio.h>

void setRobot(Robot* robotp, double x, double y) {
  robotp->x = x;
  robotp->y = y;
}

void moveRobot(Robot* robotp, double dx, double dy) {
  robotp->x += dx;
  robotp->y += dy;
}

void printRobot(Robot* robotp) {
  printf("x = %f\n", robotp->x);
  printf("y = %f\n", robotp->y);
}
 

 

main.c

#include "robot.h"

int main(void) {
  Robot robot1;
  setRobot(&robot1, 0, 0);
  moveRobot(&robot1, 1, 1);
  printRobot(&robot1);

  Robot robot2;
  setRobot(&robot2, 0, 0);
  moveRobot(&robot2, 2, 2);
  printRobot(&robot2);
}
 

Javaによるオブジェクト指向プログラミング

robot.java

class Robot {
  double x, y;

  void set(double x, double y) {
    this.x = x;
    this.y = y;
  }

  void move(double dx, double dy) {
    x += dx;
    y += dy;
  }

  void print() {
    System.out.println("x = " + x);
    System.out.println("y = " + y);
  }
}
 

 

main.java

class Main {
  public static void main(String... args) {
    Robot robot1 = new Robot();
    robot1.set(0, 0);
    robot1.move(1, 1);
    robot1.print();

    Robot robot2 = new Robot();
    robot2.set(0, 0);
    robot2.move(2, 2);
    robot2.print();
  }
}
 

参考サイト