Java Basic クラスとは〜Step2_1〜

イントロダクション

Java言語での文法をちょっとやると「クラス」という言葉が出てきます。「インスタンス」とか、「オブジェクト」なんて言葉も一緒に出てきます。
これらの言葉は、目に見えないことが多く、初学者、ある程度学習した人でも認識が、あやふやになっていることが多いです。

しかし、難しく考えることはありません。いろんな人がいろんな言葉でモノを言うのでこんがらがりますが、シンプルに考えて問題ありません。
扱っているものは、所詮、機械なのですから

クラスとは

今までに、書いてきた、プログラム(クラス)は下のようにmainメソッドだけでした。

public class AAA {
   public static void main(String[] args) {
   }
 }

なので、クラスをクラスとして使用していませんでした。

具体的にはクラスには以下の要素があり、それぞれの機能を持たせることができます。

1:フィールド変数
2:メソッド

これらを使用して現実にある様々なものを表現できます。

例えば、全てを表現すると難しいので、部分的に「ゲーム機」をクラスで表現しようとすると、下のようになります。

クラス名: 某社〇〇ッチ
フィールド変数: カセットを入れるソケット
メソッド:ボタンを押す、ボタンを離す、ボタンを長押しする

部分的ではありますが、このように表現できます。注意点としてはこれらの名前が複数あるというところです。C言語で表現するときは「フィールド変数」は「メンバ変数」、メソッドのことは「メンバメソッド」などのように言語による違いが「言葉の違い」になり、それがまた混乱のもとになっていると思います。

そして、フィールド変数とメソッドがあれば、それはクラスであり、それ以上でも、それ以下でもない。というところを認識してください。
いろんな人が、いろんなことを言うので混乱することが多いと思います。※筆者が若いころは混乱しました。。。

例えば人間を表現してみます。※ほんのさわり部分のみです

public class Human {
   /** 年齢 */
   private int age;
   /** 性別 */
   private int sex;
   /** 挨拶する */
   public void greet() {
       System.out.println("Hello!");
   }
}

人間にはその人の年齢があり、性別他にもたくさんありますが、それぞれ「人間」と言う生き物に共通する要素があります。
それを「フィールド変数」として定義してやります。
そして、取りうる行動を「メソッド」として表現することができます。

例えば自転車ならば。。。

public class Bicycle {
    /** ハンドルのサイズ */
    private double handleSize;
    /** 車輪のサイズ */
    private double wheelSize;
    /** スピード */
    private double speed;
    /** 停止しているフラグ */
    private boolean isStop;
    /** 自転車をこぐ */
    public double start(int power) {
       speed = power * wheelSize;
       isStop = false;
    }
    /** 自転車の動き */
    public void bicybleState() {
        // 何かしらの処理。。。
    }
}

とまぁキリがなくなってきたので、ここら辺で自転車の実装を終わりにしますが、つまるところは。。。

フィールド変数とメソッドがあれば、「現実にあるもの」を「クラス」として表現できる。※あくまでも「文字や言葉を使って表現できる」
言い方を変えると、属性と操作があれば、何でも表現することができる ※部分的になりますが。。。
ちなみに、「属性と操作」は日本語で、英語にするならば「アトリビュート(Attribute)とオペレーション(Operation)」になります。

日本語だと意味が広いから混乱してしまうように思いますので、英語(カタカナ)で理解するのもよい方法だと思います。

と言うところがクラスの存在意義です。
そして、クラスがJavaプログラミングの基本になります。
そして、実行してみました。コードはこちらにあります

#### UML
ちなみに図で表現することもできます。それをUMLというものがありこのルールで記述したものは世界中のだれもが読めます。
下のような図です。
![](http://zenryokuservice.com/wp/wp-content/uploads/2022/03/ClassSample1.png)

### 初めのプログラムの解説

インスタンスとは

クラス(ファイルに記述したもの)の「コンストラクタ」の処理を通った後に出来る、オブジェクト。

<例>

ホームページにログインするとインスタンスが1個作られます。→ログイン処理でユーザーをあらわすクラスのコンストラクタでDBから取得した情報を保持します。この保持するためのオブジェクトの事をインスタンスと呼びます。

オブジェクトとは

構造体、クラスの事。データをセットしたり、ゲットしたり、何かの処理を行ったりします。構造体はクラスと同じ様な意味です。細かい所は混乱するので省きます。

オブジェクトはインスタンス化したもの。→コンストラクタを通ればオブジェクト。

<サンプルコード>

public class MyCls {
   //フィールド変数
   private String name;
   private int age;

   //コンストラクタ
   public MyCls() {
      this.age = 3;
   }

   //メソッド
   public void setName(String name) {
      this.name = name;
   }
}

カプセル化とは

1.

上記の様にフィールドへのアクセス(name)にはクラスの外からアクセス出来なくする事MyCls.name = “”;はエラーになる。

ちなみにフィールドをpublic String name;と書くと外部からアクセス出来る。MyCls.name = “”;はエラーにならない

2. データと処理をひとまとめにして、「役割」を果たすために外部へ提供する機能と、内部で使用する機能を分けて作成したクラス

クラスの構成のコメントをつけております。

サンプルはこちら

/** 外部の提供されているクラスをインポートする */
package jp.zenryoku.sample.cls;
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;

/**
* javaAPIの使い方
* <span class="s2">@author</span> <span class="s3">takunoji</span>
*/
// クラス定義
public class Step2_1 {
// フィールド変数:クラスの全てのメソッドからアクセスできる
private String FIELD_HENSU="クラスの外からはアクセスできません。";
public String FIELD_HENSU2="クラスの外からはアクセスできます。";

// メインメソッド(必ずこの書き方になる)
public static void main(String[] <span class="s4">args</span>) {
    Step2_1 step = new Step2_1();
    // 入力を受け取り切らない場合は次のStreamに読み込まれる
    //123456step.arrayTest1();
    step.arrayTest2();
}
// 自作のメソッド(メンバメソッドともいう)
public void arrayTest1() {
  System.out.println("test1 入力開始");
  // バイト型の配列をサイズ5で作成する
  byte[] moji = new byte[5];
    // エラーハンドル用のくくり
  try {
        // 標準入力から入力を受け取る
        System.in.read(moji);
  } catch(Exception e) {
             e.printStackTrace();
  }
    // 入力は「バイト型」のデータなのでString型(参照型)を生成する
  System.out.println("入力じた文字:" + new String(moji));
}

public void arrayTest2() {
  System.out.println("test2 入力開始");
  // 読み込み用のクラスを宣言する<br/>
  BufferedReader read;<br/>
    // InputSreamReaderからBufferedReaderを作成する
    // System.in→標準入力、読み込むために上のクラスでラッップ(包む)して
    // 使用する。ラップとは System.inをInputSreamReaderで包む(拡張)する
    // ことを言います。
    read = new BufferedReader(new InputStreamReader(System.in));
  String line = "";
  try {
        // BufferedReader.readLineメソッドで1行読む。<br/>
        // Fileなどを読み込む時にも使用する<br/>
        line = read.readLine();
    } catch (IOException e) {
            e.printStackTrace();
    }
        System.out.println("入力じた文字:" + line);
    }
}

「public class クラス名」全ての人がアクセスできるクラスですよ、と定義する=>パブリック・スコープ
「private class クラス名」クラスの中からのみアクセスできるクラスと定義する=>プライベート・スコープ
「class クラス名」同じパッケージ内からアクセスできるクラスと定義する=>パッケージ・スコープ

「public 返却値 メソッド名」クラスの外からもアクセスできるメソッド
「private 返却値 メソッド名」クラスの中からのみアクセスできるメソッド

フィールド変数に関して、今回は使用していません。

Systemクラスについて
標準入力、出力、Javaの強制終了などJavaシステムの
基盤的なアプリケーションの機能を実装している。

クラス 変数名 = new クラス名();という書き方では
メソッドを使用できません。→その様に実装しているからです。

#### Systemクラスの説明
クラス名:System
フィールド変数:out
フィールド変数(クラス)のメソッド:println()
※[PrintStreamクラスの詳細はJavaDoc](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html)を見ます。
```
public final class System extends Object {
/** PrintStreamというクラス */
public static final PrintStream out;
}

```

スタティックメソッドはクラスをnewしないで直接
クラス名.メソッド名の形で呼び出します。System.out.println()の場合は
スタティックフィールドoutを直接呼び出していますので**System.out**になります。
そしてPrintStreamクラスのメソッドprintln()を使用している。というわけです。

## まとめ
Javaプログラムを動かすには「クラス」が必要で、クラスをnewすると、オブジェクト(インスタンス)ができて、メンバメソッドが呼び出せる。
そして、クラスには「フィールド変数」と「メソッド」が定義出来て、フィールド変数、メソッドを必ずしも定義しなくてもよい。
アクセス修飾子やstaticメソッド修飾子などもあり、クラスにアクセスする方法を分けることができる。

これらの基本ルールを土台にして、プログラムを組み上げて一つのアプリケーションを作成することができる。

#### LWJGLのデモ動画
マイクラでも使っているフレームワーク**LWJGL**というものがあります。これはJava言語でできています。

関連ページ

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す