🔥

JavaでClass(クラス)を使いこなそう

2024/11/25に公開

はじめに

Javaを勉強しててすごく思うのは、Classの概念が難しすぎる。それは、アクセス修飾子とか、InstanceとClassの違いとか、本当にいろいろな要素が絡んでいることから来るのだと思う。しかしこの要素をまとめて、かつ簡単に解説しているサイトはなかった。だからその解説をやってみたいというのが趣旨。

Classとその周辺の用語ついて

Class(クラス)は、キャラ設定で考えるとわかりやすい。
スマブラを考えてみよう。それぞれのキャラクターには、名前とか、ダメージ率とか、攻撃力とか、そういった値が細かく設定されている。こういった設定されたステータスのことをField(フィールド)という。
また、横Bとか、上スマとか、いろんな攻撃手法やスキルが設定されている。こういった行動(関数)のことをMethod(メソッド)という。

他のゲームとかで言うなら、ポケモンならこうげき、性格などがステータスで、fieldになる。技はスキルで、method。

下のように、name変数がField,hello関数がMethodである。

class Person {
  private String name;

  public void hello() {
    System.out.println("こんにちは");
  }
}

MethodやFieldの定義の仕方は、以下のとおりである。

アクセス修飾子 + データ型 + 関数

いまはアクセス修飾子については気にしなくてもいい。

Instanceの定義

Instance(インスタンス)というのは、Classという設計図を用いて作成された実体のことである。もっと簡単にいうと、例えば人間の先程の設計図をもちいて、Satouくんという一人の人間を作成するということだ。Satouくんは、SatouというNameと、Helloメソッドの2つの機能を持つ。

Person person1 = new Person();
person1.name = "Satou";

ThisとConstructor

さっきの例ではInstanceを定義してから、その後にフィールドを設定している。しかしこれは定義時に設定できたほうが嬉しいに決まっている。そのための機能がConstructorである。Constructorはクラス名と同じ名前を用いることで作成ができる。また、このときInstance内の変数と、外から受け取る引数は同じ名前(name変数)で定義したほうが綺麗。しかしどちらがどちらかがわかるように、Instance内の変数の方にThisをつける。それが以下の通り。

class Person {
  public String name;
 //コンストラクタ
  Person(String name) {
    this.name = name;
  }

  public void hello() {
    System.out.println("こんにちは、私は" + this.name + "です");
  }
}

このコンストラクタを使うことによって、person1に引数をうけとって実体を作成することができる。

class Main {
  public static void main(String[] args) {
    Person person1 = new Person("Kate Jones");
    person1.hello();
  }
}

ConstructorのOverLoad

コンストラクタを2つ使うと、下の例の用にMiddlenameを引数に入れるか入れないかのように、引数の数の違いによって別のコンストラクタを適用できる。このことをオーバーロードという。

class Person {
  public static int count = 0;
  public String firstName;
  public String middleName;
  public String lastName;
  public int age;
  public double height, weight;

  Person(String firstName, String lastName, int age, double height, double weight) {
    Person.count++;
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.height = height;
    this.weight = weight;
  }

  Person(String firstName, String middleName, String lastName, int age, double height, double weight) {
    // this()を用いて、上のコンストラクタを呼び出す
    this(firstName,lastName,age,height,weight);
    
    this.middleName = middleName;
  }

  public String fullName() {
    return this.firstName + " " + this.lastName;
  }

また、その際にthisを使うことによって、もともとのコンストラクタをそのまま呼び出せる。

アクセス修飾子

ところで、ここまでででてきたpublicとは一体なんなのか。その正体がアクセス修飾子である。

修飾子 アクセス可能な要素
public すべてのクラスからアクセス可能
protected 自クラスおよび同一パッケージのクラスと、自身の子クラスからアクセス可能
自クラスおよび同一パッケージのクラスからアクセス可能
private 自クラスのみからアクセス可能

基礎として知っておくのはpublicとprivateだけでいい。privateは自身のクラス内の定義、publicはどこからでもアクセス可能である。protectedついては、いつかサブクラスについて記事を書くときに説明ができればいいなと思う。

Privateによるフィールドの制限とゲッター、セッター

基本的にフィールドは他のところから操作はされたくない。そのため、privateに変数を変更して、直接変更ができないようにして、ゲッターとセッターと用意することで、自身のみが編集できるようにしておくとよい。

class Person {
  private static int count = 0;
  private String firstName;
  private String middleName;
  private String lastName;
  private int age;
  private double height;
  private double weight;

  Person(String firstName, String lastName, int age, double height, double weight) {
    Person.count++;
    this.firstName = firstName;
    this.lastName = lastName;
    this.age = age;
    this.height = height;
    this.weight = weight;
  }

  Person(String firstName, String middleName, String lastName, int age, double height, double weight) {
    this(firstName, lastName, age, height, weight);
    this.middleName = middleName;
  }
  //ゲッター
  public String getMiddleName() {
    return this.middleName;
  }
  //セッター
  public void setMiddleName(String middleName){
    this.middleName = middleName;
  }

  public String fullName() {
    if (this.middleName == null) {
      return this.firstName + " " + this.lastName;
    } else {
      return this.firstName + " " + this.middleName + " " + this.lastName;
    }
  }

  public void printData() {
    System.out.println("私の名前は" + this.fullName() + "です");
    System.out.println("年齢は" + this.age + "歳です");
    System.out.println("BMIは" + Math.round(this.bmi()) + "です");
  }

  public double bmi() {
    return this.weight / this.height / this.height;
  }

  public static void printCount() {
    System.out.println("合計" + Person.count + "人です");
  }
}

Static修飾子について

Coming soon

感想

途中で終わっちゃったけど、気が向いたらもう少し書こうかな。

Discussion