본문 바로가기

IT自主学習 (2023.05.23~)/Java(2023.05.23~)

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

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

 

一つのクラスにコンストラクタを宣言する際には、一つ以上のコンストラクタを生成することができ、

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 {

 

//리턴값이 없는 메소드 선언

void powerOn() {

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

}

 

//리턴값이 없는 메소드 선언

void powerOff() {

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

}

 

//호출 시 두 정수 값을 전달받고,

//호출한 곳으로 결과값 int를 리턴하는 메소드 선언

int plus(int x, int y) {

int result = x + y;

return result;

}

 

//호출 시 두 정수 값을 전달받고,

//호출한 곳으로 결과값 double을 리턴하는 메소드 선언

 

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 객체 생성

Calculator myCalc = new Calculator();

 

//리턴값이 없는 powerOn() 메소드 호출

myCalc.powerOn();

 

//plus 메소드 호출 시 5와 6을 매개값으로 제공하고,

//덧셈 결과를 리턴 받아 result1 변수에 대입

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);

 

//리턴값이 없는 powerOff() 메소드 호출

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 {

//가변길이 매개변수 value를 가진 int값을 리턴하는 sum메소드를 선언

int sum(int ...value) { //가변길이 매개변수 value는 아직 내부적으로는

//길이가 정해지지 않는 int형 배열 value이다 ->int[] value

int sum=0; //value의 인덱스의 합을 담은 int형 변수 sum를 선언한다.

//위의 sum은 변수명이 아닌 메소드명의 sum이므로 중복이 아니다. 그러므로 변수에서도 사용가능하다.

 

for(int i=0; i<value.length;i++) {

sum += value[i];

}

 

 

//합산 결과를 return

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