ユーザ定義の型2(複素数型)

複素数型の定義

ユーザ定義の型である複素数型Complexを作成しましょう. フィールドには,Double型のrealimagを定義してください. また,printメソッドでComplexを出力するようにしましょう.

public class Complex{
    Double real;
    Double imag;
    void print(){
        System.out.printf("%5.2f + %5.2f i",
            this.real, this.imag);
    }
    void println(){
        this.print();
        System.out.println();
    }
    public String toString(){
        return String.format("%5.2f + %5.2f i", this.real, this.imag);
    }
}

上記のように,独自の型にはフィールドとメソッドを同時に定義できます.

なお,toStringメソッドはその実体を文字列に変換するときに自動的に呼び出されます. 標準的な Java の実体を拡張しているため,メソッドのシグネチャは必ず public String toString() である必要があります. もし,publicをつけ忘れるとコンパイルエラーになります.toString内で 利用しているString.formatメソッドは C 言語の sprintf と同じ機能を持つものです. 書式付きフォーマッタで文字列を作成します.

Complex complex = // ... 何か値を作成する.
System.out.printf("%s%n", complex); // このようなとき,自動的に toString
System.out.println(complex);        // が呼び出され,complex の文字列表現が出力される.

複素数型を利用するプログラムの作成

次に,Complexを利用するプログラム ComplexCalculator を作成しましょう.

public class ComplexCalculator{
    void run(){
        Complex c1 = this.createComplex(3.0, 4.0);
        c1.println();
    }
    Complex createComplex(Double realValue,
              Double imagValue){
        Complex c = new Complex();
        c.real = realValue;
        c.imag = imagValue;
        return c;
    }
    // mainメソッドは省略.
}

上記のrunメソッド内で,Complex型の printメソッドを呼び出しています. このように,メソッドを呼び出すにも,変数を経由して呼び出す必要があります. 一方,変数(フィールド)も変数を経由してアクセスします.createComplexメソッドをみてください. このように,Complex型の変数 c を経由してフィールドにアクセスしています. このように,メソッドもフィールドも,必ず変数を経由してアクセスする必要があります.

例題 absolute

さて,Complex型に Double型を返す absoluteメソッドを追加してください.引数はありません. 複素数の絶対値を返すメソッドです. $z=a+bi$の絶対値$r$は,$r = |z| = \sqrt{a^2 + b^2}$で求められます.

上記が完成すれば,ComplexCalculatorabsolute を呼び出し,結果を出力してください.

例題の解答例 (Complex.java)
例題の解答例 (ComplexCalculator.java)

例題 conjugate

次に,Complex型に Complex型の実体を返す conjugateメソッドを追加してください. 引数はありません.conjugateは共役複素数を意味します. 共役複素数とは,虚部の符号を逆転させたものであり,$z=a+bi$ の共役複素数は,$\bar{z}=a-bi$です. conjugateメソッド内で新たにComplex型の実体を作成し, 呼び出されたメソッドが持つ複素数の共役複素数として変数に値を代入し,返してください (thisの値を元に,新たな Complex型の変数を作成し,thisの共役複素数となるような値を代入して返してください).

上記が完成すれば,ComplexCalculatorconjugate を呼び出し,結果を出力してください.

例題の解答例 (Complex.java)
例題の解答例 (ComplexCalculator.java)