クラスの基本についてわからない部分をまとめた

久しぶりの投稿となりました。

基本情報技術者試験にはたぶん落ちました。

午前試験は自己採点では8割。でも午後試験が5割でした。

そして今は会社の研修で、Javaについて勉強中です。

クラスの勉強のときにわからないことがあったのでまとめてみました。



そもそもクラスってなんやねん

 よく車の例えとかで説明される「クラス」
モノに関する機能とか状態とかそーいうものをまとめたのが「クラス」
このへんはオブジェクト指向の話とかも合わさってくるしややこしくなるしパス。(知らない訳ではない)

クラスを利用してオブジェクトを…

 機能とか状態をまとめた説明書のような「クラス」を利用して、実物を作る。これをオブジェクトを作るっていう。プログラムとかを書いていく上でも実物がないと色々処理とかできないってわけですね。
 ちなみに同一のクラスを利用して、複数のオブジェクトを作ることが可能。クラスっていうのは単純に説明書だし。ガンプラの説明書が「クラス」で、出来上がったガンダムが「オブジェクト」

メソッドの戻り値

 例えば

class Sample{
    int a;
    int getA(){
        return a;
    }
}

みたいなやつ。そもそもプログラミング初心者の僕は「なんでvoidでメソッドを定義したら戻り値いらんのに、intなら戻り値いるんや?」って思いました。でも単純にint型だから、「何かしら整数を返してくれよ」ってメソッドの定義の際に宣言してるんですよね。

 戻り値のないメソッドにreturn;を記述しても、呼び出し元の処理に戻るから結局書いても書かなくても同じっていうこと。

メンバへのアクセス制限

 クラスを定義した際に、フィールドやメソッドを定義するわけです。でもその時にクラスの外からメンバにアクセスしちゃってあり得ない値を渡されると大変です。
例えば、車クラスなのに、スピードにマイナスの値が渡されるとか。そんなことが起きないように

class Sample{
    private int a;
    public int getA(){
        return a;
    }
}

こうやってprivateやpublicをつける。privateをつけると、クラスの外からアクセスできなくなる。publicを付けると、クラスの外からアクセスできる。つまりフィールドであるaには、クラスの外から直接アクセスすることはできなくなるわけです。このprivateやpublicは「修飾子」と呼ばれています。この修飾子を省略してしまうと、同じパッケージ内からアクセスすることができるようになってしまう。

オーバーロード

 オーバーロードっていうのは、同じクラスの中に、同じ名前のメソッド複数定義すること。
例えば

class Sample{
    private int a;
    private double b;

    public void set(int x){
         a = x;
    }

    public void set(double y){
         b = y;
    }

    public void set(int x, double y){
         a = x;
         b = y;
    }
}

こんな感じで、同じsetメソッドという名前を定義できる。ただし、それぞれのsetメソッドの引数は違う。int型の数値だと一番上のsetメソッド、double型だと二番目、両方だと一番下のsetメソッドの処理が行われます。なんで敢えてこんなことをするのかというと、もっともっと大規模なプログラムになった際に、メソッドが膨大に増えると何が何かわからなくなってしまうかもしれません。
 でもオーバーロードして、引数ごとに処理を変えておくと、メソッドを1つ覚えておくと便利です。注意点として、引数や、その個数は変えること。もし同じにしてしまうと、どのメソッドを呼び出していいのか判断できなくなってしまいます。
 ちなみにこういうことを、多態性ポリモーフィズムっていうらしい。
*1

コンストラクタってなんぞ

 そのクラスのオブジェクトが生成されたときに自動的に定義しておいた処理が行われます。見た目はメソッドに似てるけど、名前は必ずクラス名と同じにしなければダメです。そして戻り値の指定はできません。
 じゃあ、何するん?っていうと、フィールドの値を初期化したりすることができます。自動的に。コンストラクタを省略したら、引数のないコンストラクタが用意されて自動的に呼び出されます。また、メンバと同様に修飾子をつけることも可。

コンストラクタオーバーロード

 コンストラクタオーバーロードすることができます。オブジェクトを作成するときに、引数を設定してオブジェクトを作成すると、その引数に応じて処理の内容を変えることができます。メソッドオーバーロードと違うところは、コンストラクタなので自動的に処理が行われる点です。
 ちなみにオーバーロードしたコンストラクタ内でthis();を記述することで、元のコンストラクタの内容を呼び出すこともできる。

なんとか変数、なんとかメソッドについて

インスタンス変数…オブジェクトに結びついた変数
インスタンスメソッド…オブジェクトに結び付いたメソッド

 オブジェクトに結び付いているので、オブジェクトが作成されないと呼び出すことができない。呼び出すときにはオブジェクト名をつけて呼び出す。


クラス変数…クラス全体に結び付いた変数
クラスメソッド…クラス全体に結び付いたメソッド

 クラス全体に結び付いているので、オブジェクト無しでも呼び出すことは可。クラス変数、クラスメソッドにはstaticという修飾子をつける。
public static void main(String[] args)という最初に呪文として覚える一文もクラスメソッドです。呼び出すときにはクラス名をつけて呼び出す。
ちなみに、インスタンスメソッド内ではthisを付けてメンバを呼び出すことができますが、クラスメソッド内ではできません。さらに、クラスメソッド内ではインスタンス変数、インスタンスメソッドにアクセスすることができないのです。なぜならそれは、インスタンス変数、インスタンスメソッドは特定のオブジェクトに結び付いているものだからです。


ローカル変数…メソッド内で定義された変数

for(int i=0; i<0; i++){

}

これのiとか

public void show(int i, double j){

}

これのiとjもローカル変数です。ちなみに詳しく言えば、ローカル変数でありインスタンス変数です。





以上、僕のわからなかった部分について簡単にまとめてみました。
まだまだ勉強中でございますので、間違って記載している点もあるかもしれません。
もしこの記事を読んで、おかしい点がありましたらコメントをいただけると幸いです。

*1:コメントに頂きました通り、訂正致しました。ありがとうございました。get→set