[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); // 오버로딩하며 자기 자신을 호출이 가능. 매개변수로 구분 가능하기 때문에~
}
上記の場合、パラメータ呼び出しによるメソッドを区別できないために問題が発生する.delim
がint
インチの場合に使用できます.可変パラメータ宣言をロードしすぎると、メソッドを呼び出すときに区別できなくなります.
可変パラメータメソッドはできるだけ使用しないでください.
Reference
この問題について([java]9/27学習履歴), 我々は、より多くの情報をここで見つけました https://velog.io/@0hhanum/java-927-학습기록テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol