コンストラクタとは?
プログラミング学習を行う上で「コンストラクタ」を耳にすることが多いでしょう。
しかし、基本的な使い方や使われているプログラミング言語についていまいち理解できておらず悩んでしまう人も少なくありません。
コンストラクタは、オブジェクト指向のプログラミング言語で登場する用語の一つであり、使用することで変数を初期化でき、初期用のメソッドを作る必要がなくなることから、コードの簡素化が図れるという点で役立ちます。
そこで、この記事ではコンストラクタの基本的な使い方やオーバーロードについて詳しく解説していきますので、ぜひ参考にしてください。
コンストラクタで使われるプログラミング言語
まずは、コンストラクタで使われるプログラミング言語については以下が挙げられます。
- C++
- C#
- Java
- PHP
- Python
上記のプログラミング言語を使用するエンジニアが多いことから、コンストラクタは初心者エンジニアにとっても覚えておきたい用語の一つと言えるでしょう。
コンストラクタの使い方
ここからはコンストラクタの使い方について詳しく見ていきましょう。
コンストラクタは、設計図の意味を指す「クラス」の処理を実行する「インスタンス」(実際に作成されたもの)が生成される際に実行されるメソッドであり、「クラス」のメンバ変数を初期化する際に使うのが主な使われ方です。
ここでは、以下の順にコンストラクタの使い方を解説していきますので、ぜひ参考にしてください。
- 基本ルール
- 定義・呼び出し
- 引数指定
基本ルール
コンストラクタは、インスタンス(実際に作成したもの)が作られる時に実行されるメソッドで特別とも言われることから、以下のような特徴を持っていることをまずは理解しておきましょう。
- クラス(設計図)名と同じ名前であること
- メソッドとしての戻り値を持たない
- メソッドとして途中でのリターンもできない
- インスタンスが作られる際に必ず実行される
また、以下の点においてはメソッドと同じ使い方もできるため、紹介していきます。
- アクセス修飾子でコンストラクタを呼び出せる範囲を指定できる
- コンストラクタを実行する時に発生した例外を呼び戻し元に例外処理を投げられる
- クラスにコンストラクタをいくつでも持てる
3つ目に紹介した「クラスにコンストラクタをいくつでも持てる」のことを、オーバーロードと呼ばれており、後ほど詳しく説明していきます。
定義・呼び出し
コンストラクタの基本ルールが理解できたら、次にコンストラクタの定義・呼び出しについて見ていきましょう。
以下は、コンストラクタを呼び出すサンプルコードとなります。
public class App{ public static void main(String[] args) { } }
//インスタンス生成
Configurator cp = new Configurator();
}
class Configurator {
String message = “test case!!“;
Configurator(){
System.out.println(message) ;
}
実行すると「test case!!」が表示される結果となります。
サンプルコードでは、メインメソッドからConfiguratorクラスのインスタンスを生成し、コンストラクタConfiguratorが呼び出される仕組みとなっています。
引数指定
コンストラクタは、引数指定も可能であり、その場はnew演算子でコンストラクタを生成する際にクラスに引数を指定しましょう。
コンストラクタをnew演算子で呼び出す方法は、以下です。
- new コンストラクタを実行するコード;
- new クラス名();
どちらも同じ意味を表し、クラスのインスタンスが生成されます。また、これはインスタンス化とも呼ばれており、引数は必要によってその都度使い分けることが必要となります。
コンストラクタのオーバーロード
プログラミングにおいてオーバーロードとは、異なる種類や数の引数で同一の名前を持つ関数のことを指しています。
また、多重定義とも呼ばれています。
コンストラクタのオーバーロードとは、同じクラスの中にコンストラクタを2つ以上定義することを指しており、オーバーロードするには「引数の型」「個数」「順番」が異なるように記述する必要があります。
thisでコンストラクタを呼び出す
「this」はそのクラスの変数を呼び出す際に用いられ、複数のインスタンスを生成したとしても、記述を簡単に済ませることが可能です。
public class App { } class Computer { Computer(int pcname){ }
public static void main(String[] args) {
//インスタンス生成
Computer cp = new Computer() ;
}
Computer(){
tihis(“MO2345”) ;
}
System.out.println(“コンピュータ名は” + pcname +”です”) ;
}
上記のサンプルコードを実行すると「コンピュータ名はpc name MO2345です」と表示されます。
「this」を使うことで、自分自身が持つ他のコンストラクタを呼び出すことも可能となりますので、ぜひ覚えておきましょう。
コンストラクタの応用的な使い方4選
ここからは、コンストラクタの応用的な使い方について以下の4つを紹介していきます。
- 継承先クラスでsuperを使う方法
- マルチスレッドでのコンストラクタ
- コンストラクタ参照
- 例外が発生する場合
継承先クラスでsuperを使う方法
子クラスから親クラスのコンストラクタを呼び出すためには「super」を指定する必要があります。
クラスのメンバを継承する際には「extends」の後にクラス名を指定することで、クラスを継承できますが、その際にそのままでは子クラスで親クラスのクラス名で呼び出すことができないことを理解しておく必要があります。
そこで「super」を使い、サブクラスからスーパークラスのコンストラクタを呼び出しましょう。
以下がサンプルコードとなります。
class SuperClass {
public SuperClass() {
system.out.println(“guest”) :
}
public SuperClass(String s){
system.out.println(“guest login” + s) ;
}
}
class SubClass extends SuperClass {
public SubClass() {
super(“MO2345”) ;
}
}
public class TestClass {
public static void main(String[] args){
SubClass s = new SubClass() ;
}
}
実行すると「guest login MO2345」と表示されます。
マルチスレッドでのコンストラクタ
webサービスやアプリケーションにおいて、ユーザーからの入力やデータベースへの書き込みや読み込みなど、さまざまな処理をプログラムで同時並行して処理を行いたい場合に使われるのが「マルチスレッド」です。
コンストラクタは、マルチスレッドの処理においても重要な役割を果たすと言われており「ThreadLocal」でスレッドごとに値を保持することがきます。
コンストラクタ参照
コンストラクタ参照とは「クラス名::new」の形式で使用でき、すでに定義されているメソッドを引数なしで呼び出すことができます。
例外が発生する場合
例外が発生する場合、どのような対応を取ればいいのか迷う方も少なくないでしょう。
コンストラクタからメソッドを呼び出した場合、例外が発生することも珍しくありません。
そこで、以下のサンプルコードを用意してみました。
// ConstructorSample.java
class ConstructorSample {
private String str ;
// コンストラクタ
public ConstrutorSample(String str) throws ErrorpointerException {
this.str = str;
System.out.println(this.str.length()) ;
}
}
//Main.java
public class Main {
public static void main(String[] args) {
String str = Error;
try {
ConstructorSample cs = new ConstructorSample(str) ;
} catch(ErrorPointerException e) {
System.out.println(e) ;
}
}
}
実行結果は「java.lang.ErrorPointerException」
コンストラクタの引数のString型変数が「Error」の場合に「ErrorPointerException」の例外が発生するため、throwsで投げインスタンスの生成を行う際に「try-catch」で例外処理を行なっています。
まとめ
この記事では、コンストラクタの基本的な使い方やオーバーロードについて詳しく解説してきました。
エンジニア初心者にとっては、言語や内容が理解しづらく難しいと感じてしまう人も少なくないでしょう。
トライアンドエラーを繰り返しながら、少しずつ理解していくことを意識して学習していくことが重要となりますので、ぜひ参考にしてください。
また、この記事ではコンストラクタの継承や例外処理などの応用的な使い方についても記載しました。
学習を進めていく中でもぜひ参考にしてください。
【SNSフォローのお願い】
kyozonは日常のビジネスをスマートにする情報を毎日お届けしています。
今回の記事が「役に立った!」という方はtwitterとfacebookもフォローいただければ幸いです。
twitter:https://twitter.com/kyozon_comix