😺

プログラミング自主学習 41日目 Constructor/method

2023/07/06に公開

コンストラクタオーバーローディング

一つのクラスにコンストラクタを宣言する際には、一つ以上のコンストラクタを生成することができ、Overloading(オーバーローディング)もできる。

Car(){ }Car(String name) { };
Car(String name, int maxSpeed { };

しかし、オーバーローディングをすることで、重複コードが増える可能性もある。

Car(String model){
       this.model = model;
       this.color = "은색";
       this.maxSpeed = 250; 
}
Car(String model, String color){
       this.model = model;
       this.color = color;
       this.maxSpeed = 250; 
}
Car(String model, String color, int maxSpeed){
       this.model = model;
       this.color = color;
       this.maxSpeed = maxSpeed; 
}

他のコンストラクタを呼び出しこの場合は、共通コードを一つのコンストラクタに集め、他のコンストラクタはthis(...)を使用して、共通コードを持っているコンストラクタを呼び出す方法で改善することができる。

<BEFORE>

Car(String model){
   this(model, "은색", speed);
}

Car(String model, String color){
    this(model, color, 250);
}


Car(String model, String color, int maxSpeed){
     this.model = model;
     this.color   = color;
     this.maxSpeed = speed;
}

<AFTER>

Car(String model){
   this(model,"은색",250);     step1
   System.out.println("finished to initialized)  <-step 6 run this command;
}   

Car(String model, String color){
  this(model, color , 250);     step1
}

Car(String model, String color, int maxSpeed){  step2
     this.model = model;     
     this.color   = color;    step3    ->  step4 create and initialize step1's  obejct step5 go back to construtor
     this.maxSpeed = speed;                        create and initilaize step1's object 
}

メソッドの宣言と呼び出し

<メソッドの宣言>

returnDateType  methodName (parameter){      command        } <-method block  
void(リータン値がない)
package ch06.sec08.exam01;

public class Calculator {

//return X
void powerOn() {

System.out.println("전원을 켭니다.");

}

void powerOff() {

System.out.println("전원을 끕니다.");

}

//return Int
int plus(int x, int y) {

int result = x + y;

return result;


 

double divide(int x, int y) {

double result = (double)x/(double)y;

return result;

    } 

}

メソッドの呼び出し

Datatype 変数 = メソッド();

外部のオブジェクトからメソッドを呼びだすため、インスタンスを生成し、リータン値をもらうデータータイプと変数を宣言し、.(オブジェクトアクセル演算子)を通して、メソッドを呼び出す。


package ch06.sec08.exam01;

 
public class CalculatorExample {

public static void main(String[] args) {

Calculator myCalc = new Calculator();

myCalc.powerOn();
int result1 = myCalc.plus(5, 6);
System.out.println("result 1: "+ result1);

 

int x = 10;
int y = 4;

 
double result2 =myCalc.divide(x, y);
System.out.println("result 2: " + result2);

 
    myCalc.powerOff();

    }

}
전원을 켭니다.
result 1: 11
result 2: 2.5
전원을 끕니다.

可変パラメータ with 配列

メソッドの宣言時、パラメータの個数を決めずに、パラメータの中に...を入力して宣言する場合もある。

//intをリータンするsumメソッド宣言
int sum(int...value)

これを可変パラメータと呼び、アーギュメントは自動的に配列に変換され、メソッドより利用される。こういったパラメータを可変パラメータという。

外部のオブジェクトよりsumメソッド呼び出す。その後、sumのリターン値をint型変数resultに代入したい。

int result = sum(1,2,3)

ここのアーギュメントはメソッドの可変パラメータより自動的に配列に変換され、メソッドブロックに入る。

int[] values {1,2,3};
int result = sum(values);

内部的にはパラメータが配列になっているため、直接配列をアーギュメントとして入れてもいい。
しかし、この場合は、配列が宣言が済んだ状況なので、必ず、インスタンスを生成して、入れる。

例)int result = sum(new int[] {1,2,3}); 
package ch06.sec08.exam02;

public class Computer {

   int sum(int ...value) { 

   int sum=0;
   for(int i=0; i<value.length;i++) {
      sum += value[i];
   }

  return sum;
  }
}
package ch06.sec08.exam02;

public class ComputerExample {

public static void main(String[] args) {

   Computer myCom = new Computer();
  int result1 = myCom.sum(1,2,3);
  System.out.println("result1: " + result1);

  int result2 = myCom.sum(1,2,3,4,5);
  System.out.println("result2: " +result2);

  int[] test = {1,2,3,4};
  int result3 = myCom.sum(test);
  System.out.println("result3: " +result3);

  int result4 = myCom.sum(new int[] {1,2,3,4});
  System.out.println("result4: " +result4);
  }

}
<result>

result1: 6
result2: 15
result3: 10
result4: 10

Discussion