Javaの基礎を抑えたい#6【クラスとオブジェクト】
今回は、クラスやオブジェクトについて学んでいきます。オブジェクト指向なるものは、Rubyでも触れていたし、オブジェクト指向が言語によって大きく変わるものとは思いませんが、おさらいも兼ねてアウトプットしていきます。
オブジェクト指向とは
一言で表すと「あらゆるものを、すべて”モノ”として表現する考え方」と指しています。これがどのようにプログラミングに関わってくるのか、クラスとオブジェクトに落とし込んで、さらに深掘りしていきます。
クラスとオブジェクト
よく車を例に出すことが多いですが、オブジェクト(車)を生産するにはクラス(設計図)が必要で、クラスがなければオブジェクトも存在し得ない、というのがオブジェクト指向のベースとなる考え方になっています。
この概念をプログラムを通して更に理解を深めます。
# クラスの宣言
package day6;
public class SampleClass01 {
// フィールド
int n = 10;
String s = "field";
// メソッド
int add(int a,int b){
return a + b;
}
String add(String s){
return this.s + s;
}
void showNum(){
System.out.println("n = " + n);
}
}
# クラスを用いたインスタンスの生成
package day6;
public class Sample601 {
public static void main(String[] args) {
SampleClass01 s = new SampleClass01(); // インスタンスの生成
s.n = 100; // フィールドnに値を代入
s.s = "Hello"; // フィールドsに値を代入
int ans = s.add(1,2); // メソッドadd()を呼び出し
String str = s.add("World"); // メソッドadd()を呼び出し
System.out.println(ans); // 呼び出し結果の表示
System.out.println(str); // 呼び出し結果の表示
s.showNum(); // メソッドshowNum()を呼び出し
}
}
1つ目のプログラムでSampleClass01というクラスの宣言を行い、それを用いて2つ目のプログラムでインスタンスの生成を行なっているという構造です。
SampleClass01 s = new SampleClass01();
SampleClass01というクラス(設計図)をベースに変数sで(車)インスタンスを生成しています。
フィールド
プログラム内に記述してある単語について、1つずつ見ていきます。
ここではクラスの宣言時に2つのフィールドを展開しています。
int n = 10;
String s = "field";
クラスの宣言時にフィールドへ初期値を代入することが可能で、その処理が上記です。これらは、インスタンスを生成すると同時に代入されます。(初期値で設定されている)ですが、2つ目のプログラムで実行している以下の記述で、フィールドの値を再代入し、変数s(SampleClass01のインスタンス)のフィールドn,sの値を設定しています。
s.n = 100;
s.s = "Hello";
メソッド
クラスの宣言時に生成しているメソッドは以下です。
int add(int a,int b){
return a + b;
}
2つの引数を設定し、その和を戻り値とするaddメソッドです。
それを2つ目のプログラムで呼び出し、処理を行なっています。
int ans = s.add(1,2);
このプログラムには2つのaddメソッドが存在していますが、strについても同じ理論で、文字列が戻り値として返っています。
引数・戻り値の無いメソッド
最後に、このプログラムには戻り値も引数もないメソッドShowNumが存在しているので、そこだけ見たいと思います。
void showNum(){
System.out.println("n = " + n);
}
ここで使われているvoidが戻り値がないことを表しています。
そのため、このメソッドは単にフィールドの値nを表示するために存在しています。可読性の観点で言うと、nと表しているものを"this.n"と自分自身のインスタンスを示すthisを活用すると、意味としては通りやすいかなと思いました。
以前、サイバーエージェントの研修資料を見たときに、良いコードとは凝集度と結合度であると学びました。
その良いコードを目指すために、このクラスとインスタンスという概念は切り離せないモノだと思っています。オブジェクト指向含め、この概念はプログラミングを触る以上、一生でてくる考え方だと思うので、自分でも再度見直したいと思います。
次回は、アクセス指定子とカプセル化について学びます!
是非よろしくお願いします!
この記事が気に入ったらサポートをしてみませんか?