[java]9/27学習履歴


クラスメンバーとインスタンスメンバー間の参照と呼び出し


同じクラスに属するメンバー間では、個別のインスタンスを作成することなく、相互参照または呼び出すことができます.
ただし、クラスメンバーがインスタンスメンバーを参照または呼び出す場合は、インスタンスを作成する必要があります.
인스턴스 멤버가 같은 클래스 내의 멤버를 호출할 때 가능하다고 얘기하는듯?
これは、インスタンス・メンバーが存在する場合、クラス・メンバーは常に存在しますが、クラス・メンバーが存在する場合、インスタンス・メンバーは存在しない可能性があります.
이런게 가능하단 얘기

class ClassTest{
  void instanceMethod(){} // 인스턴스 메서드
  static void staticMethod() {} // static 메서드
  
  void anotherInstanceMethod() {
    instanceMethod();
    staticMethod(); // 인스턴스 생성없이 인스턴스 메서드 호출. 참조변수 없이 클래스 메서드 호출.
  }
}

클래스 메서드에서 인스턴스 변수, 메서드 호출이 안된다고 했지만 이런 방식으로는 가능하다.

class Test{
  int instanceVariable = 10;
  void instanceMethod() { System.out.println("I'm instance method.");}
  
  public static void main(String[] args){ // 클래스 메서드
  Test test = new Test(); // 메서드 내에서 인스턴스를 생성.
  int localVariable = test.instanceVariable;
  System.out.println(localVariable);
  test.instanceMethod();
  }
}

하지만 이런 방식으로 사용하는 경우는 드물다.
만약 클래스 메서드 내에서 인스턴스 멤버를 참조 또는 호출해야 한다면, 인스턴스 메서드로
작성해야할 메서드를 클래스 메서드로 한 것은 아닌지 생각해봐야 한다.

かふか


過負荷とは?


パラメータの数やタイプが異なる場合は、クラスで同じ名前のメソッドを定義できます.
この場合、リロード方法はパラメータでしか区別できないため、戻りタイプはリロードの実現に何の影響もありません.
すなわち,戻りタイプの異なる同名メソッドのみを定義することはできない.
int add(int a, int b) { return a + b; }
long add(int a, int b) { return (long) a + b; }
// 이렇게는 안된다는 뜻.

オーバーロードの例


代表的な方法はprintlnの方法である.printlnメソッドを呼び出す場合、実際のパラメータによって呼び出されるメソッドが異なります.
オーバーロードを使用しているので、タイプに関係なく出力できます.
long add(int a, long b){ return a + b; }
long add(long a, int b){ return a + b; }
// 이 경우 호출 시 매개변수의 값에 의해 호출될 메서드가 구분될 수 있으므로 오버로딩으로 간주한다.
パラメータ値に基づいて方法を区別してこそ、オーバーロードを行うことができます.
上記の戻りタイプのみが異なる場合、両方のパラメータにintが入力されるため、どのメソッドを呼び出すか区別できません.
// 올바른 오버로딩

int add(int a, int b) { return a+b; }
long add(long a, long b) { return a+b; }
long add(int[] a){
  long result = 0;
  for(int i: a){
    result += i;
  }
  return result;
}

過負荷のメリット


同じ機能を持つメソッドの名前を統一したり、メソッドの名前を節約したりすることができます.

可変パラメータとオーバーロード


JDK1.5から、パラメータ数=>可変パラメータを動的に指定できます.printfの方法を考えればいいです.必要に応じてフォーマットされた数で、パラメータの数も変わります.
可変因子は타입... 변수명と同じ形で宣言される.
public PrintStream printf(String format, Object... args){ ~ } // printf 
String concatenate(String... str){ ~ } // 이런식
可変パラメータに加えて他のパラメータがある場合は、パラメータに可変パラメータを最後に宣言する必要があります.
それ以外の場合、可変パラメータであるかどうかを区別できないため、コンパイルエラーが発生します.
public class Sep27 {
    static void concatenate(String... strs){
        for(String str : strs){
            System.out.println(str);
        }
    }
    public static  void main(String[] args){
        String[] test = {"hello", "testing"};
        concatenate(test); // 배열을 받음
        concatenate("hello", "test"); // 당연히 가능
        concatenate() // 심지어 인자가 없어도 작동.
    }
}
// 가변인자를 사용할 경우 **배열도 인자가 될 수 있다.**
可変因子は内部で配列によって実現される.したがって、可変パラメータを宣言するメソッドを呼び出すたびに、新しい配列が生成されます.従って、効率が低下する要因があるため、必要に応じて可変因子のみを用いることが望ましい.

可変パラメータのオーバーロード時の注意事項

static String concatenate(String delim, String... args){
  String result = "";
  for(String str: args){
    result += str + delim;
  }
return result;
}
static String concatenate(String... args){
  return concatenate("", args); // 오버로딩하며 자기 자신을 호출이 가능. 매개변수로 구분 가능하기 때문에~
}
上記の場合、パラメータ呼び出しによるメソッドを区別できないために問題が発生する.delimintインチの場合に使用できます.
可変パラメータ宣言をロードしすぎると、メソッドを呼び出すときに区別できなくなります.
可変パラメータメソッドはできるだけ使用しないでください.