답변:
새 메서드로 메서드를 오버로드하려면 새 메서드의 서명이 달라야합니다. 즉, 두 개의 오버로드 된 메소드는 이름은 같지만 매개 변수는 다릅니다. 다음은 오버로드 된 두 가지 방법의 예입니다.
boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };
매개 변수 유형에 따라 해당 메소드가 호출됩니다. 반환 유형을 변경하는 것만으로는 충분하지 않습니다 (추가로 수행 할 수 있음).
메서드를 재정의하면 새 메서드의 서명이 동일하고 경우에 따라 재정의 된 메서드를 대체합니다. 재정의 된 메소드의 예는 다음과 같습니다.
public class A
{
public void someMethod() { ... }
}
public class B extends A
{
public void someMethod() { ... }
}
객체 유형에 따라 선택합니다. 예를 들어
A someA = new B();
someA.someMethod();
를 호출 someMethod
의 B
. @Override 주석을 추가 할 수 있고 추가해야합니다.
public class B extends A
{
@Override
public void someMethod() { ... }
}
이제 실수로 B의 매개 변수를 변경하면 컴파일러가 someMethod ()를 재정의하는 것이 아니라 과부하하는 것을 알려줍니다.
오버로드시 메소드는 이름은 같지만 매개 변수는 다릅니다.
재정의하면 기본 클래스에 제공된 구현이 하위 클래스의 구현으로 대체됩니다.
질문하는 개념은 Java 학습서에서 다룹니다.
수퍼 클래스의 인스턴스 메소드와 동일한 서명 (이름, 매개 변수의 수 및 유형) 및 리턴 유형을 가진 서브 클래스의 인스턴스 메소드 는 수퍼 클래스의 메소드를 대체 합니다.
서브 클래스가 메소드를 오버라이드 (override)하는 기능은, 클래스가 행동이 "충분한"수퍼 클래스로부터 상속 한 다음 필요에 따라 행동을 수정할 수있게합니다. 재정의 메소드는 이름, 번호 및 유형의 매개 변수 및 리턴 유형이 대체하는 메소드와 동일합니다. 재정의 메서드는 재정의 된 메서드에서 반환 한 형식의 하위 유형을 반환 할 수도 있습니다. 이를 공변량 반환 유형 이라고합니다 .
메소드
@Override
를 대체 할 때 수퍼 클래스의 메소드를 대체하도록 컴파일러에 지시하는 어노테이션 을 사용할 수 있습니다 . 어떤 이유로 컴파일러에서 메소드가 수퍼 클래스 중 하나에 존재하지 않음을 발견하면 오류가 발생합니다. 에 대한 자세한 내용@Override
은 주석 ...을 참조하십시오 .
Java 프로그래밍 언어는 오버로드 메소드를 지원하며 Java는 다른 메소드 서명이있는 메소드를 구별 할 수 있습니다. 이는 클래스 내의 메소드가 다른 매개 변수 목록을 갖는 경우 동일한 이름을 가질 수 있음을 의미합니다 ( "인터페이스 및 상속"이라는 레슨에서 논의 될 자격이 있습니다).
서예를 사용하여 다양한 유형의 데이터 (문자열, 정수 등)를 그릴 수 있고 각 데이터 유형을 그리는 방법이 포함 된 클래스가 있다고 가정합니다. 각각의 방법 - 예를 들어, 새 이름을 사용하는 것이 번거 롭다
drawString
,drawInteger
,drawFloat
, 등. Java 프로그래밍 언어에서는 모든 그리기 메소드에 동일한 이름을 사용할 수 있지만 각 메소드에 다른 인수 목록을 전달할 수 있습니다. 따라서 데이터 드로잉 클래스는라는 이름의 네 가지 메서드를 선언 할 수draw
있으며 각 메서드 에는 다른 매개 변수 목록이 있습니다.오버로드 된 메소드는 메소드에 전달 된 인수의 수와 유형으로 구별됩니다.
컴파일러가 이름을 구별 할 수 없으므로 동일한 이름과 동일한 수 및 유형의 인수를 가진 둘 이상의 메소드를 선언 할 수 없습니다.
컴파일러는 메소드를 차별화 할 때 리턴 유형을 고려하지 않으므로 리턴 유형이 다른 경우에도 동일한 서명으로 두 메소드를 선언 할 수 없습니다.
참고 : 오버로드 된 메서드는 코드를 읽기 어렵게 만들 수 있으므로 드물게 사용해야합니다.
오버로드에 대한 위의 설명은 "인터페이스 및 상속" 단원에서 설명한 자격을 언급합니다 .
서브 클래스에서 수퍼 클래스로부터 상속 된 메소드를 오버로드 할 수 있습니다. 이러한 오버로드 된 메소드는 수퍼 클래스 메소드를 숨기거나 대체하지 않으며 서브 클래스에 고유 한 새로운 메소드입니다.
메소드의 오버로딩은 일반적으로 "입력 및 출력의 수와 유형에 따라 동일한 이름을 가진 여러 개의 사용 가능한 메소드를 제공"으로 정의됩니다. 개념은 일반적으로 다양한 입력 세트가 주어지면 동일한 기본 조작을 수행 할 수 있기를 원한다는 것입니다. 예를 들어 숫자 유형의 두 값을 "추가"할 수 있지만 일반적으로 정확한 유형이 무엇인지 아는 것이 중요합니다 값은 해당 유형의 특정 동작을 활용하거나 계획 할 수 있도록합니다. 따라서 지원하려는 숫자 유형 (또는 모음)의 각 조합에 대한 방법을 정의합니다. 이 모든 방법들은 이름은 같지만 "서명"은 다릅니다. 컴파일 타임에
메소드를 대체하는 것은 일반적으로 "기본 클래스에 정의 된 특정 서명을 사용하여 메소드의 파생 클래스에 다른 구현을 제공하는"것으로 정의됩니다. 메소드를 대체해야하는 많은 이유가 있습니다. 사실상 모든 파생 클래스에는 기본 클래스로는 알 수없는 수행해야 할 사항에 대한 추가 지식이 있다는 사실이 공통적으로 있습니다. 대부분의 OO 언어에는 두 가지 유형의 재정의가 있습니다. 재정의는 기본 클래스 메서드를 대체 하거나 확장 할 수 있습니다기본 클래스 메소드 차이점은 일반적으로 기본 클래스 구현을 확장하는 파생 클래스는 재정의 메서드를 실행하는 동안 특정 시점에서 기본 클래스의 재정의 된 버전의 메서드를 호출한다는 것입니다. 이를 통해 재정의 클래스가 기본 클래스에 포함 된 작업의 공통 영역을 "재사용"할 수 있습니다.