메소드 오버로딩

오늘 우리의 새롭고 흥미로운 주제는 메소드 오버로딩 입니다 . 주의하세요. 메서드 오버로딩을 메서드 재정의와 혼동해서는 안 됩니다.

재정의와 달리 오버로드는 매우 간단한 작업입니다. 실제로는 메서드에 대한 작업이 아니지만 때때로 파라메트릭 다형성(parametric polymorphism) 이라는 끔찍한 용어로 언급되기도 합니다 .

여기서 문제는 클래스 내의 모든 메서드가 고유한 이름을 가져야 한다는 것입니다. 글쎄, 그것은 완전히 정확하지 않습니다. 더 정확하게는 전혀 정확하지 않습니다. 메서드 이름은 고유하지 않아도 됩니다. 고유 해야 하는 것은 메소드 이름과 메소드 매개변수 유형의 합집합입니다. 이 조합은 메서드 서명 으로 알려져 있습니다.

예:

암호 설명
public void print();
public void print2();
이것은 허용됩니다. 두 메서드에는 고유한 이름이 있습니다.
public void print();
public void print(int n);
그리고 이것도. 두 메서드에는 고유한 이름(시그니처)이 있습니다.
public void print(int n, int n2);
public void print(int n);
방법은 여전히 ​​독특합니다
public int print(int a);
public void print(int n);
그러나 이것은 허용되지 않습니다 . 방법은 고유하지 않습니다 . 다른 유형을 반환하더라도.
public int print(int a, long b);
public long print(long b, int a);
그러나 당신은 이것을 할 수 있습니다 . 메소드 매개변수는 고유 합니다.

서명에는 메소드 이름과 매개변수 유형이 포함됩니다 . 메서드의 반환 유형과 매개변수 이름은 포함하지 않습니다 . 클래스는 동일한 서명을 가진 두 개의 메서드를 가질 수 없습니다 — 컴파일러는 어느 메서드를 호출해야 하는지 알 수 없습니다.

매개 변수 이름은 컴파일 중에 손실되기 때문에 중요하지 않습니다 . 메소드가 컴파일되면 해당 이름과 매개변수 유형만 알려집니다. 반환 유형은 손실되지 않지만 메서드의 결과는 아무 것도 할당할 필요가 없으므로 서명에도 포함되지 않습니다.

OOP 원칙 에 따르면 다형성은 단일 인터페이스 뒤에 다른 구현을 숨기고 있습니다. 예를 들어 메서드를 호출할 때 System.out.println()전달되는 인수에 따라 다른 메서드가 호출됩니다. 이것이 다형성입니다.

그렇기 때문에 동일한 클래스에 포함된 동일한 이름을 가진 다른 메서드는 약한 형태의 다형성으로 간주됩니다.