🧠

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

2021/09/13に公開

オブジェクト指向

対象(オブジェクト)そのものに重点を置き、対象の振る舞いや操作が対象の属性として備わるという考え方に基づいてプログラミングすること。

オブジェクトとは何を指しているのか?
SVOのObjectを指している。

Subject = プログラマ
Verb = 命令(メソッド・関数)
Object = 対象(オブジェクト)

プログラマがコンピュータに対して、「オブジェクトに何をして欲しいか」を命令します。

プログラムでは

object.verb()

となり、objectが主語のように見えるが、あくまでもobjectは svooのことを指している

circleオブジェクトに面接(area)を計算しろ(calculate)と命令する

class Circle {
	int diameter; // 直径
	int x; // x座標位置
	int y; // y座標位置

	public Circle(int diameter, int x, int y) {
		this.diameter = diameter;
		this.x = x;
		this.y = y;
	}

	int calculateArea() {
		double r = this.diameter / 2;
		return r * r * 3.14;
	}
}

Circle circle = new Circle(10, 5, 5);
System.out.println(circle.calculateArea());
// => 78.5
Circle circle = new Circle(10, 5, 5);
// circleオブジェクト(インスタンス)を生成

circle.calculateArea()
// circleオブジェクに面積(area)を計算しろ(calculate)と命令

// 計算結果が返ってくる
// 78.5

オブジェクト指向プログラミングの基本

クラス

  • データ構造(フィールド)を一般化して定義する
  • オブジェクトに対する命令をまとめておく

インスタンス

  • クラスを具体化(オブジェクト化)したもの

クラスの宣言について

一般化

class ClassName {
	date-type field-name;
  

  // constructor
  public ClassName(date-type field-name) {
    this.field-name = field-name
  }
}

具体例

class Circle {
	int diameter;
	int x;
	int y;

	public Circle(int diameter, int x, int y) {
		this.diameter = diameter;
		this.x = x;
		this.y = y;
	}
}

constructor(コンストラクタ)について

クラスをインスタンス化する(new演算子が呼ばれるタイミング)で実行されるメソッド

1クラスで1つのコンストラクタを定義することができる

インスタンス化

// ()の中の値はconstructorの引数に値を渡す
Circle circleA = new Circle(10, 5, 5);

インスタンス化

一般化

// object_nameは変数なのでなんでも良い
ClassName object_name = new ClassName(date-type field-name);

具体例

Circle circleA = new Circle(10, 5, 5);

Circleクラスの考察

上記で作成したCircleクラスについて見ていきます。

Circleクラスの中には、

int diameter; // 直径
int x; // x座標位置
int y; // y座標位置

というデータ(フィールド)を定義して一般化してあります。

また、

// 面積を計算する処理(命令)
int calculateArea() {
	double r = this.diameter / 2;
	return r * r * 3.14;
}

というオブジェクトに対する命令(メソッド)も定義してあります。

クラスを具体化(オブジェクト化)、初期化する処理が以下です。

Circle circle = new Circle(10, 5, 5);
// Circleクラスのインスタンスを生成
new Circle(10, 5, 5)

のように、具体的に値を入れて具体化(オブジェクト化)しています。

ここでは、diameterに10を入れ、xとyに5という値を入れていることがわかります。

このように、クラスにデータ(フィールド)を一般化し、それらを処理するための命令(メソッド)をまとめておく。そのクラスをインスタンス化し使い回すことができるようになります。

これが、冒頭で記述した

対象(オブジェクト)そのものに重点を置き、対象の振る舞いや操作が対象の属性として備わるという考え方に基づいてプログラミングすること。

のことです。

まとめ

オブジェクト指向プログラミングにおけるオブジェクトは
  - 英文法のSVOのObject

クラス
  - データ構造(フィールド)を一般化して定義する
  - オブジェクトに対する命令をまとめておく

インスタンス
  - クラスを具体化(オブジェクト化)したもの

クラスの定義(一般化)
class ClassName {
	date-type field-name;
  

  // constructor
  public ClassName(date-type field-name) {
    this.field-name = field-name
  }
}

クラスのインスタンス化(一般化)
ClassName object_name = new ClassName(date-type field-name);

間違ってること言ってたらコメントください。

Discussion