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言語でできています。

関連ページ

Java Basic CharとString 〜文字の操作〜

イントロダクション

データ型とは、数値、文字、クラスなどの変数の型を意味しています。このデータ型について、1番使うであろう文字(Char)と文字列(String)について記載します

Stringとchar

Javaで文字を扱うときに使用するデータ型として「char」「String」があります。

  • Stringは文字列のことで、「"(ダブルクォーテーション)」で囲うことで文字列を表します。
  • charは文字を表し、「'(シングルクォーテーション)」で囲うことで文字を表します。
String str = "文字列";
char ch = 'a';

ちなみに、「=」の右側、値の部分のことを「リテラル」と呼びます。別な言い方をすると「"XXX"」は文字列のリテラル「'X'」は文字のリテラルという言い方ができます。

リテラルの解説

While文でint型の配列をループする処理の説明をしていますが、リテラルの説明もしています。

下のコードは、各データ型の定義サンプルです。
データ型(変数の型)は大きく分けてプリミティブ型参照型があります。

/** 
 * プリミティブ型データ一覧クラス(説明用)
 * @author takunoji
 */
public class PrimitiveSample {
   /** INTは整数で ±2147483647まで使用可能 */
   private int population;

   /** Doubleは小数点を使用する */
   private double footSize;

   /** Shortの年齢は ±32767まで使用可能 */
   private short age;

   /** BooleanはTRUEかFALSE */
   private boolean flg;

   /** Charは一文字 */
   private char ch;

   /** 1Byteは8Bit(2進数8桁)-> 01010101 = 85 */
   private byte byt = 0x7F; // 16進表現:10進数の127

   /** LongはINTよりも大きい整数 */
   private long lng;

   /** FloatはDoubleよりも大きい小数点 */
   private float flt;

   /** 
    * コンストラクタ:この処理を通るとインスタンスができる
    */
   public PrimitiveSample() {
     population = 100;
     footSize = 24.6;
     age = 100; // intはより大きな数値を使える
     flg = false;
     ch= 'A';
     byt = 0x7F;
     lng = 123456;
     flt = 12345.6;
   }
}

プリミティブ型

charはプリミティブ型と言うカテゴリに入ります。intと同じく「==」で比較できます。

参照型(クラス型)

Stringは参照型(これもカテゴリ)で比較メソッドを使用します。参照型の場合はクラスなのでメソッドが使用できます。プリミティブ型の場合はメソッドが使用できません。そして、参照型は「==」での比較は想定通りに動きません。細かい理由は後々に… ※最近は「==」でもある程度ちゃんと比較できるようです

使い方

初期化するときは下のようにやります。
char a = 'a'; // シングルクォーテーション
String a = "a"; // ダブルクォーテーション

比較するときは、charは「==」を使用します。
Stringはメソッドを使用します。
String a = "a";
a.equals("a"); // trueが出力されます。

兎にも角にも、コードをみてみいないと
なんとも言えないのでこちらから
ダウンロードしてください。

サンプルコード

public static void main(String[] rags) {
   int i = 1;
   char c = ‘a’; // 一文字のみ
   String str = “文字列”;
   System.out.println(i == 1); // true
   System.out.println(c == ‘b’); // false
   System.out.println(“abc”.equals(str)); // true

   // 文字列操作
   // 「abc」の「b」のみ表示
   System.out.println(str.charAt(2));
   // 文字列の置換(123をZZZに置換)
   System.out.println("test123bbb".replace("123", "ZZZ"));
}

<問題>
プログラム引数に「abc」「def」を渡してその引数を以下のようにコンソールに出力してください

①引数1: abc
②引数2: def

・上記の表示を行なった後にchar型の値「G」と「E」を
①と②の最後の部分に追加して表示してください。
※String型の変数の後にchar型を連結できればOKです。
Eclipseの画面では下のような画面でプログラム引数を追加します。

StringBuilderを使う

StringBuilderクラスを使用すると、文字列の操作が簡単にできます。
例えば、文字列の変数「str」が下のようにあったとします。

String str = "1234567";

個の文字列の「4」以降を取得したい時は「StringBuilder#subString(3)」とコードを書けば取得できます。

String str = "1234567";
StrinbBuilder build = new StringBuilder(str);
String result = build.substring(3);

System.out.println(result); // 「4567」が表示される

関連ページ