[Processing×Java]   データ型とオブジェクト指向プログラミング

この記事はプログラムの構造をProcessingを通じて理解していくための記事です。
[変数の使い方]()で、データ型と変数について書きました。
今回はデータ型とオブジェクト指向プログラミングについて書いていきます。
データ型を理解すると、クラスやオブジェクト指向プログラミングを理解しやすくなると思います。

目次
0.データ型
1.オブジェクト指向プログラミング



#0.データ型

##0-0. **データって何・・?**

データ型について書くまえに"データとは"という話です。
データは情報です。
体重、身長、目の色、車のナンバー、日照時間、降水量、住所、画像、などなど。。
プログラム用語でいうならば、変数もデータ、関数もデータ、クラスもデータです。


**Point** :データはコンピューターのメモリでは、**ビット(0と1)の集合**で表されます。
**Point** :データには種類( **データ型** )があり、種類別に保存されます。

##0-1. **データ型について**

データ型(データの種類)には、**基本データ型**と**複合データ型**があります。


###**[基本データ型]**
基本データ型は、**"1つのデータ要素のみ"**を格納します。


| 名前  |データ要素   |    サイズ(ビット)  |   値の範囲   |
|:------:|:--------------:|:--------:|:------------|
| boolean  | 真偽値   |    1     |    trueまたはfalse   |
| byte   |  バイト |    8     |     -128から127    |
| char  | 1文字の英数字、記号   |    16     |     0から65535    |
| int  | 整数  |    32    |     -2,147,483,648から2,147,483,647    |
| float  | 浮動小数点数   |    32   | 3.40282347E + 38から-3.40282347E + 38    |
| color  | 色   |    32    |    16,777,216色   |



###**[複合データ型]**
複合データ型は、**"複数のデータや、関数(メソッド)"**を含んでいます。
※複合データ型は**クラス**とも呼ばれます。

| 名前  |データ要素   |メソッド| 
|:------:|:--------------:|:--------------|
| String  | 文字列   |length(),charAt(),equals(),indexOf(),toLowerCase(),toUpperCase()...|
| PImage   |  画像 |loadPixels(),updatePixels(),resize(),get(),set(),mask(),filter(),blend(),save()...|
| PFont | フォント  |list()|
| PShape | 図形  |beginShape(),endShape(),translate(),rotate(),scale()...|
| PVector |座標|set(),mag(),magsq(),add(),sub(),mult(),dist(),normalize(),lerp()...|
| : |||

※クラスの名前は大文字からはじまっているので基本データ型と簡単に区別がつきます。

##0-2. **データ型の使用例**

[基本データ型]

###データ型 : boolean
####◯booleanを使って、線の色を変えていくプログラム

```boolean01.java
//変数の宣言と初期設定
boolean b = false;

size(640, 360);
background(0);
//Build-in変数widthは、size()で定義されてからでないと使えません。
int middle = width/2;

//線を描いていくループ
for (int i = 0; i <= width; i += 20) {
  //どんなときtrueで、どんなときfalseなのかを決める。
  if (i < middle) {
    b = true;
  } else {
    b = false;
  }
  //もし、trueなら
  if (b == true) {
    stroke(255,0,0);
  }
  //もし、falseなら 
  if (b == false) {
    stroke(0,0,255);
  }
  //線を描いていく
  line(i,0,i,height);
}
```

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/25d89cd9-8c36-815a-fa70-f364c6312382.png)

####◯マウスを押して、円の移動をコントロールするプログラム 
```boolean02.java
//円のx座標を示すfloat型の変数xを定義する。
float x = 0;
//円が進むか否かの決定をするboolean型の変数goingを定義する。
boolean going = false;

void setup(){
  size(500,500);
}
//無限ループ(アニメーションをつくる)
void draw(){
  background(0);
  fill(255);
  //円の中心の座標 = (x,height/2)
  ellipse(x,height/2,30,30);
  
  //もし、going = Trueなら
  if(going){
    //xを２ずつ足していく
    x += 2;
  }
}

//マウスが押されたとき1回だけ実行される
void mousePressed(){
  //goingに、現在の真偽値とは逆の真偽値を代入する。
  //もしgoingがTrueならFalseを代入する。
  //もしgoingがFalseならTrueを代入する。
  going = !going;
  //マウスが押されたとコンソールに出力する。
  println("mouse is pressed!!");
}
```

![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/0dce353b-821d-e7de-1ba4-d90de4330cab.gif)


###データ型 : char

####◯ループを利用して効率的に文字を出力するプログラム

```char.java
//char型の変数letterを作って、初期設定をする。
char letter = 'A';

//char型は文字(アルファベット)の順番を持っているのでそれを利用する。
for(int i = 0;i < 26;i++){
    print(letter);
    //文字を1文字ずつ足していく
    letter++;
}
```
```
ABCDEFGHIJKLMNOPQRSTUVWXYZ
```

###データ型 : int

####◯ループを使って効率的に倍数を出力していくプログラム

```int.java
//int型の変数 n を宣言して、初期設定する。
int n = 3;

//5回ループを繰り返す
for(int i = 0;i < 5;i++){
    println(n);
    // n = 2n
    n *= 2;
}
```
```
3
6
12
24
48
```

###データ型 : color

```color.java
//color型の変数blueをcolor()を使って定義する。
color blue = color(0,0,255);
background(blue);
```
![color.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654004/b61a41c4-1910-8553-3c5f-c0fe244ff429.png)


[複合データ型]-----------------------------------------------------------------

###データ型 : String

####◯Stringクラスのメソッドを使うプログラム

```String.java
//クラスStringのオブジェクトs1をつくって、中身を入れる。
String s1 = "breakfast"
//ドット(.)を使ってオブジェクトの持つメソッドにアクセスする。
println(s1.length());
```
```
9
```
s1は**Stringクラスのオブジェクト**であり、変数の種類として見れば**インスタンス変数**です。

###データ型 : PImage

####◯画像を表示するプログラム


```PImage.java
//オブジェクトの宣言
//PImageクラスを具体化してimgというオブジェクトをつくる。
PImage img;

void setup(){
    size(100,100);
    //オブジェクトに中身を入れる。
    img = loadImage("~.png");
}

void draw(){
    //オブジェクトを使う。
    image(img,0,0);
}
```











#1.オブジェクト指向プログラミング

##1-0. **まずは用語を確認**

**オブジェクト指向プログラミング**
関連のある関数と変数をまとめて定義するプログラムのことです。

**クラス**
関連するフィールドとメソッドが入ったまとまりのことです。
よくレシピなどに例えられます。

**フィールド**
クラスの中で定義される変数です。

**メソッド**
クラスの中で定義される関数です。

**オブジェクト**
クラスのインスタンス(具体例)のことです。
もとのクラスと同じフィールド名やメソッドを持ちます。
よくレシピを使って作った料理などに例えられます。

**インスタンス**
あるクラスのオブジェクトのことです。

**インスタンス変数**
変数の一種です。
オブジェクトが作られたときにできた変数です。

**変数**
ある名前を持ったデータの要素です。
全ての変数には、値、データ型、スコープがあります。

**スコープ**
プログラムの中で変数にアクセスできる範囲(ブロック)のことです。
どこで定義するかで使える場所が異なります。


##1-1. **クラスを使ったプログラミング**

###**◯クラスを使いたい**

クラスはただのテンプレートなので、そのままでは使うことができません。
なので、

**「クラスを具体化してオブジェクトを作り、オブジェクトの特性を活かしつつそれを変数のように扱う」**

というふうにしていきます。
###**◯クラスを具体化する**

クラスには**フィールドとメソッド**が記述されています。
これをプログラムの中で使いたい。
ですがクラスは**ただのテンプレート**で、抽象的な存在。
なので、クラスを具体的な存在(オブジェクト)にしてそれについて操作していきます。


###**◯クラスを具体化する方法**
簡単な例で見てみましょう。
ここでは、クラスStringからオブジェクトs1をつくっています。

```String.java
//オブジェクトの宣言
String s1;
//オブジェクトの定義
s1 = "breakfast"
//オブジェクトの使用
println(s1.length());
```
```
9
```
ここで、s1は
**オブジェクト**(クラスから作られた具体的な存在)
であり、
**インスタンス変数**(インスタンスが作られるときに生成される変数)
です。

どこからみるか、基準をどこにするかによって呼び方(外見)は違いますが、中身は一緒です。
**いろいろな呼び方があるんだなあってことです。**



###**◯オブジェクトの特性を活かしつつそれを変数のように扱う**

全てのオブジェクトはクラスが持つフィールドとメソッドを持っています。

・フィールド = クラスの中で定義される変数

・メソッド = クラスの中で定義される関数

オブジェクトを作ったので、やっとクラスの持つフィールドとメソッドを使えそうです。

オブジェクトの持つフィールドやメソッドにアクセスするためにはドット(.)を使ってアクセスします。
オブジェクト自体は、変数と同じように扱います。

```String.java
//オブジェクトの定義
String str1 = "goodjob"; 
//オブジェクトが持つメソッドにアクセスする
str1 = str1.toUpperCase();
//オブジェクトを使用する
println(str1);
```
```
GOODJOB
```


変数と同じように使うとは
**定義(宣言→初期設定)→使用**
のようにして使うということです。



つまりまとめると、ここでのstr1は

□フィールドやメソッドを持っている。(オブジェクトの特性)
□ドットを使って自身のフィールドやメソッドにアクセスする。(使い方)
かつ
□値、データ型、スコープを持つ。(変数の特性)
□定義(宣言、初期設定)してから使う。(使い方)


以上がクラスを使ったプログラムの方法の一部です。





#最後に

読んでいただきありがとうございました。
より良い記事にしていくために御意見、ご指摘のほどよろしくお願いいたします。


※この記事は、ダニエルシェフマン氏のyoutube"[Coding Train](https://www.youtube.com/c/TheCodingTrain)"を参考にしています。